网格渲染器 (Mesh Renderer)
文本网格

带蒙皮的网格渲染器 (Skinned Mesh Renderer)

Unity 使用__带蒙皮的网格渲染器 (Skinned Mesh Renderer)__ 组件来渲染__骨骼__动画;此类动画中的网格形状由预定义的动画序列进行变形。这种技术对于关节弯曲的角色和其他对象(与关节更像铰链的机器相反)非常有用。

带蒙皮的网格渲染器会在导入时自动添加到需要它的网格。

属性

属性: 功能:
Cast Shadows 如果启用此属性,当合适的光源照射在网格上时,网格将投射阴影。
Receive Shadows 如果启用此属性,网格将显示其他对象投射的阴影。
Motion Vectors 如果启用此属性,则线会将运动矢量渲染到摄像机运动矢量纹理中。请参阅脚本 API 参考文档中的 Renderer.motionVectors 以了解更多信息。
Materials 网格渲染时使用的__材质__的列表。
Light Probes 基于探针的光照插值模式。
Reflection Probes 如果启用此属性,并且场景中存在反射探针,则将为此游戏对象拾取反射纹理,并将此纹理设置为内置的着色器 uniform 变量。
Anchor Override 使用光照探针或反射探针系统时用变换来确定插值位置。
Quality Define the maximum number of bones used per vertex while skinning. The higher the number of bones, the higher the quality of the Renderer. Set the Quality to Auto to use the Blend Weights value from the settings on the Quality window.
Skinned Motion Vectors 如果启用此属性,则将对网格蒙皮数据进行双重缓冲,以便能够插入蒙皮运动并将其置于运动矢量纹理中。此过程存在 GPU 内存开销,但会带来更正确的运动矢量。
Update When Offscreen 如果启用此属性,即使任何摄像机都无法看到蒙皮网格,也会对其进行更新。如果禁用此属性,当游戏对象在屏幕外时,动画本身也将停止运行。
Mesh 使用此属性可定义该渲染器使用的网格。
Root Bone 使用此属性可定义作为动画“根”的骨骼(即,所有其他骨骼移动时参照的相对骨骼)。
Bounds 用于判定网格是否超出屏幕外的包围体。构成此包围体的边界是在导入时从模型文件中的网格和动画预先计算的,并在 Scene 视图中显示为模型周围的线框。

详细信息

__骨骼__是蒙皮网格内的不可见对象,会影响网格在动画过程中的变形方式。基本思想是将骨骼连接在一起形成分层的“骨架”,并通过旋转骨架的关节使其移动来定义动画。每个骨骼都附着在周围网格的一些顶点上。播放动画时,顶点会随着它们所连接的一个或多个骨骼移动,因此“皮肤”也跟随骨架移动。在简单的关节(例如肘部)处,网格顶点受到在此处相交的两个骨骼的影响,当关节弯曲时,网格将逼真地伸展和旋转。在更复杂的情况下,两个以上的骨骼会影响网格的特定区域,从而产生更微妙的移动。

虽然蒙皮网格最常用于预定义动画,但也可将刚体组件附加到骨架中的每个骨骼,从而将其置于物理引擎的控制之下。这种做法通常用于创建“布娃娃”效果;在此效果中,角色在被抛出或被爆炸击中后,四肢胡乱摆动。

质量 (Quality)

Unity 可用一个、两个或四个骨骼对每个顶点进行蒙皮。使用四个骨骼可以获得最佳效果,但这会带来更高的处理开销。游戏通常使用两个骨骼权重,这是视觉质量与性能之间的良好折衷。

If the Quality is set to Auto, Unity uses the Blend Weights value from the settings on the Quality window. This allows end-users to choose the quality setting themselves and get the desired balance of animation quality and framerate.

在屏幕外时更新 (Update When Offscreen)

默认情况下,不更新任何摄像机都看不到的蒙皮网格。在网格返回屏幕之前,不会更新蒙皮。这样做是为了节省系统资源。

对象的可见性由网格的 Bounds 属性确定(也就是说,整个包围体必须在所有激活的摄像机的视野之外)。但是,动画网格的真实包围体可能随着动画的播放而变化(例如,如果角色将手举到空中,则包围体会变高)。Unity 在计算最大包围体积时会考虑所有附加的动画,但有时无法通过计算包围体边界来预测每个可能的用例。

以下每个示例情况在将骨骼或顶点推出预先计算的包围体时都会出现问题:

  • 在运行时添加的动画
  • 附加动画
  • 使用程序从脚本中更改骨骼的位置
  • 使用的顶点着色器可将顶点推到预先计算的包围边界之外
  • 使用布娃娃

在这些情况下,有两种解决方案:

1.修改 Bounds 的值以匹配网格的潜在包围体 1.启用 Update When Offscreen 以始终进行蒙皮和渲染蒙皮网格

通常应该使用第一个选项,因为它对性能更有利。但是,如果性能不是主要问题,或者如果无法预测包围体的大小(例如,使用布娃娃时),则第二个选项更合适。

为了使蒙皮网格在使用布娃娃时有更好的表现,Unity 会在导入带蒙皮的网格渲染器时自动将其重新映射到根骨骼。但是,仅当模型文件中只有一个带蒙皮的网格渲染器,Unity 才会执行此操作。这意味着,如果无法将所有带蒙皮的网格渲染器附加到根骨骼或子项,而又使用布娃娃,则应关闭此优化。

导入蒙皮网格

目前,可从以下位置导入蒙皮网格:

  • Autodesk® Maya®
  • Cinema4D
  • Autodesk® 3ds Max®
  • Blender
  • Cheetah 3D
  • XSI
  • 任何支持 FBX 格式的工具

在移动设备上,Unity 使用手动编码的 NEON/VFP 程序集在 CPU 上处理蒙皮。这种情况下的一个限制是法线和切线未标准化,所以如果您正在编写您自己的着色器,应自己处理该标准化。但是,如果使用表面着色器,则 Unity 会自动处理标准化。

注意:优化的网格与非优化的网格在骨骼的排序方式上不同,可能导致重大的动画问题。这是因为非优化的网格依赖于骨骼顺序来生成动画,而优化的网格使用骨骼名称而不依赖于骨骼顺序。

如果您只是导入并使用 FBX 文件,Unity 将负责变换的顺序问题。

对于高级用户,如果要更改 SkinnedMeshRenderer.sharedMesh

1.在“非优化”模式下,需要确保 SkinnedMeshRenderer.bonesSkinnedMeshRenderer.sharedMesh 严格匹配。引用的变换应该就会处于正确的顺序。 2.在优化模式下简单得多;只要化身具有引用的骨骼,渲染就能正常进行。在这种情况下,SkinnedMeshRenderer.bones 始终为空。

网格渲染器 (Mesh Renderer)
文本网格