Skip to main content

模型

概念

模型是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. 如何检测模型性能瓶颈?

工具

  1. Profiler:查看CPU/GPU耗时,定位高DrawCall或复杂Shader。
  2. Frame Debugger:逐帧分析渲染流程,识别未合批的模型。