佳诺明德教育Unity3D试题
一、请描述游戏动画有哪几种,以及其原理?
答:主要有关节动画、骨骼动画、单一网格模型动画(关键帧动画)。
关节动画:把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一个整体的动画,角色比较灵活,Quake2中使用这种动画;
骨骼动画,广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点组成一定的层次结构,有关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼之外,决定角色的外观;单一网格模型动画由一个完整的网格模型构成,在动画序列的关键帧里记录各个顶点的原位置及其改变量,然后插值运算实现动画效果,角色动画较真实。
二、alpha blend工作原理
答:Alpha Blend 实现透明效果,不过只能针对某块区域进行alpha操作,透明度可设。
三、写出光照计算中的diffuse的计算公式
答:diffuse = Kd x colorLight x max(N*L,0);Kd 漫反射系数、colorLight 光的颜色、N 单位法线向量、L 由点指向光源的单位向量、其中N与L点乘,如果结果小于等于0,则漫反射为0。
四、两种阴影判断的方法、工作原理。
答:本影和半影:参考本影和半影
本影:景物表面上那些没有被光源直接照射的区域(全黑的轮廓分明的区域)。
半影:景物表面上那些被某些特定光源直接照射但并非被所有特定光源直接照射的区域(半明半暗区域)
工作原理:从光源处向物体的所有可见面投射光线,将这些面投影到场景中得到投影面,再将这些投影面与场景中的其他平面求交得出阴影多边形,保存这些阴影多边形信息,然后再按视点位置对场景进行相应处理得到所要求的视图(利用空间换时间,每次只需依据视点位置进行一次阴影计算即可,省去了一次消隐过程)
五、Vertex Shader是什么,怎么计算?
答:顶点着色器是一段执行在GPU上的程序,用来取代fixed pipeline中的transformation 和lighting,Vertex Shader主要操作顶点。
Vertex Shader对输入顶点完成了从local space到homogeneous space(齐次空间)的变换过程,homogeneous space即projection space的下一个space。在这其间共有world transformation, view transformation和projection transformation及lighting几个过程。
六、下列代码在运行中会产生几个临时对象?
答:string a = new string("abc");
a = (a.ToUpper() + "123").Substring(0, 2);
在C#中第一行是会报错的(Java中倒是可行)。
应该这样初始化:
string b = new string(new char[]{'a','b','c'});
答案为:5个临时对象
七、下列代码在运行中会发生什么问题?如何避免?
答:List
foreach (int item in ls)
{
Console.WriteLine(item * item);
ls.Remove(item);
}
产生运行时错误,在 ls.Remove(item)这行,因为foreach是只读的。不能一边遍历一边修改。
八、Unity3D是否支持写成多线程程序?如果支持的话需要注意什么?
答:仅能从主线程中访问Unity3D的组件,对象和Unity3D系统调用
支持:如果同时你要处理很多事情或者与Unity的对象互动小可以用thread,否则使用coroutine。
注意:C#中有lock这个关键字,以确保只有一个线程可以在特定时间内访问特定的对象
九、Unity3D的协程和C#线程之间的区别是什么?
答:多线程程序同时运行多个线程,而在任一指定时刻只有一个协程在运行,并且这个正在运行的协同程序只在必要时才被挂起。除主线程之外的线程无法访问Unity3D的对象、组件、方法。
Unity3d没有多线程的概念,不过unity也给我们提供了StartCoroutine(协同程序)和LoadLevelAsync(异步加载关卡)后台加载场景的方法。 StartCoroutine为什么叫协同程序呢,所谓协同,就是当你在StartCoroutine的函数体里处理一段代码时,利用yield语句等待执行结果,这期间不影响主程序的继续执行,可以协同工作。
十、矩阵相乘的意义及注意点
答:用于表示线性变换:旋转、缩放、投影、平移、仿射
注意矩阵的蠕变:误差的积累
十一、为什么dynamic font在unicode环境下优于static font
答:Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。
使用动态字体时,Unity将不会预先生成一个与所有字体的字符纹理。当需要支持亚洲语言或者较大的字体的时候,若使用正常纹理,则字体的纹理将非常大。
十二、当一个细小的高速物体撞向另一个较大的物体时,会出现什么情况?如何避免?答:穿透(碰撞检测失败)
十三、请简述OnBecameVisible及OnBecameInvisible的发生时机,以及这一对回调函数的意义?
答:当物体是否可见切换之时。可以用于只需要在物体可见时才进行的计算。
十四、Mock和Stub有何区别?
答:Mock与Stub的区别:Mock:关注行为验证。细粒度的测试,即代码的逻辑,多数情况下用于单元测试。Stub:关注状态验证。粗粒度的测试,在某个依赖系统不存在或者还没实现或者难以测试的情况下使用,例如访问文件系统,数据库连接,远程协议等。