模型
概念
模型是3D建模软件(如Blender、Maya)创建的数字化对象,包含几何形状(网格)、材质(外观属性)和动画数据。在Unity中,模型通过文件(如FBX、OBJ)导入,成为可渲染的实体。
核心组件
- 网格(Mesh):描述几何形状的顶点和三角面(见下图)。
- 材质(Material):定义表面反光、颜色等光学特性,依赖着色器(Shader)计算。
- 纹理(Texture):贴图图像,增强视觉细节(如木纹、锈迹)。
- 动画(Animation):骨骼或顶点动画数据(如角色行走)。
模型的工作流程
从建模软件到Unity
- 导出格式:FBX(推荐)、OBJ等,需注意单位比例(如Maya 1单位=100 Unity米)。
- 导入设置:调整缩放、材质生成和动画分割。
渲染组件
- Mesh Filter:存储网格数据。
- Mesh Renderer:结合材质渲染网格。
- Skinned Mesh Renderer:处理骨骼动画的蒙皮网格。
模型的类型
静态模型 vs 动态模型
- 静态模型:场景中固定物体(如建筑),可烘焙光照。
- 动态模型:需实时计算的物体(如角色),依赖骨骼或顶点动画。
性能优化
- LOD(Level of Detail):根据距离切换不同精度网格。
- 合批(Batching):合并相同材质的网格减少DrawCall。
- 纹理压缩:减少内存占用。
程序化生成模型
- 通过代码动态创建网格(如生成地形):
Mesh mesh = new Mesh();
mesh.vertices = new Vector3[] { /* 顶点 */ };
mesh.triangles = new int[] { /* 三角面索引 */ };
GetComponent<MeshFilter>().mesh = mesh;
面试题
1. 三维模型的网格数据由什么组成?
-
答案:顶点(Vertex)、边(Edge)、面(Face)。
-
解析:
-
顶点:存储位置坐标(x,y,z)、法线、UV坐标等信息。
-
面:通常由三角形构成(三角面),通过顶点索引定义。
-
示例:一个立方体至少需要8个顶点和12个三角面。
2. 法线和切线的作用是什么?
-
答案:
-
法线:用于光照计算(如漫反射、高光),决定表面明暗。
-
切线:配合法线贴图实现凹凸效果(如砖墙纹理的立体感)。
3. LOD技术是什么?优缺点?
-
答案:
-
原理:根据距离动态切换模型精度(高模/低模/广告牌)。
-
优点:减少远处模型的面数,提升渲染性能。
-
缺点:增加内存占用(需存储多级模型),美术工作量增大。
4. 如何优化模型DrawCall?
-
方法:
-
静态合批:标记
Static的模型合并为单一网格(需相同材质)。 -
GPU Instancing:批量渲染相同网格的不同实例(如植被、子弹)。
-
SRP Batcher:减少材质属性设置的CPU开销(需URP/HDRP)。
5. MipMap的作用与原理?
-
答案:
-
作用:根据距离动态切换纹理分辨率,避免远处闪烁或锯齿。
-
原理:预生成多级缩小的纹理(如512x512→256x256→...),运行时按需加载。
6. 骨骼动画与顶点动画的区别?
-
骨骼动画:
-
原理:骨骼层级驱动顶点,内存占用低(如人物动作)。
-
适用:角色动画、复杂变形。
-
顶点动画:
-
原理:直接记录顶点位移(如布料模拟),精度高但内存消耗大。
7. Animation与Animator的区别?
- Animation:控制单一动画播放(Legacy系统)。
- Animator:管理动画状态机,支持混合、过渡(如 idle→run)。
8. FBX模型导入Unity的注意事项?
-
关键点:
-
缩放:检查导入比例(如1单位=1米)。
-
材质:是否生成Unity材质或保留外部引用。
-
动画:分割动画片段并设置循环模式。
9. 如何修复模型法线错误?
-
方法:
-
工具:在建模软件中重新计算法线(Blender/Maya的“Recalculate Normals”)。
-
Shader:使用自定义着色器强制统一法线方向。
10. 蒙皮网格(Skinned Mesh)的工作原理?
-
答案:
-
顶点受骨骼权重影响,骨骼变换时顶点跟随移动(如角色手臂弯曲)。
SkinnedMeshRenderer skin = GetComponent<SkinnedMeshRenderer>();
skin.SetBlendShapeWeight(0, 50f); // 混合形状权重设置
11. 如何实现模型溶解效果?
-
Shader实现:
-
使用噪声纹理控制溶解区域。
-
片段着色器中根据透明度阈值裁剪像素。
12. 如何检测模型性能瓶颈?
工具
- Profiler:查看CPU/GPU耗时,定位高DrawCall或复杂Shader。
- Frame Debugger:逐帧分析渲染流程,识别未合批的模型。