Unity 使用__带蒙皮的网格渲染器 (Skinned Mesh Renderer)__ 组件来渲染__骨骼__动画;此类动画中的网格形状由预定义的动画序列进行变形。这种技术对于关节弯曲的角色和其他对象(与关节更像铰链的机器相反)非常有用。
带蒙皮的网格渲染器会在导入时自动添加到需要它的网格。
属性: | 功能: |
---|---|
Cast Shadows | 如果启用此属性,当合适的光源照射在网格上时,网格将投射阴影。 |
Receive Shadows | 如果启用此属性,网格将显示其他对象投射的阴影。 |
Motion Vectors | 如果启用此属性,则线会将运动矢量渲染到摄像机运动矢量纹理中。请参阅脚本 API 参考文档中的 Renderer.motionVectors 以了解更多信息。 |
Materials | 网格渲染时使用的__材质__的列表。 |
Light Probes | 基于探针的光照插值模式。 |
Reflection Probes | 如果启用此属性,并且场景中存在反射探针,则将为此游戏对象拾取反射纹理,并将此纹理设置为内置的着色器 uniform 变量。 |
Anchor Override | 使用光照探针或反射探针系统时用变换来确定插值位置。 |
Quality | 定义蒙皮时每个顶点使用的最大骨骼数。骨骼数量越多,渲染器的质量越高。将 Quality 设置为 Auto 将使用来自 Quality 设置窗口的 Blend Weights 值。 |
Skinned Motion Vectors | 如果启用此属性,则将对网格蒙皮数据进行双重缓冲,以便能够插入蒙皮运动并将其置于运动矢量纹理中。此过程存在 GPU 内存开销,但会带来更正确的运动矢量。 |
Update When Offscreen | 如果启用此属性,即使任何摄像机都无法看到蒙皮网格,也会对其进行更新。如果禁用此属性,当游戏对象在屏幕外时,动画本身也将停止运行。 |
Mesh | 使用此属性可定义该渲染器使用的网格。 |
Root Bone | 使用此属性可定义作为动画“根”的骨骼(即,所有其他骨骼移动时参照的相对骨骼)。 |
Bounds | 用于判定网格是否超出屏幕外的包围体。构成此包围体的边界是在导入时从模型文件中的网格和动画预先计算的,并在 Scene 视图中显示为模型周围的线框。 |
__骨骼__是蒙皮网格内的不可见对象,会影响网格在动画过程中的变形方式。基本思想是将骨骼连接在一起形成分层的“骨架”,并通过旋转骨架的关节使其移动来定义动画。每个骨骼都附着在周围网格的一些顶点上。播放动画时,顶点会随着它们所连接的一个或多个骨骼移动,因此“皮肤”也跟随骨架移动。在简单的关节(例如肘部)处,网格顶点受到在此处相交的两个骨骼的影响,当关节弯曲时,网格将逼真地伸展和旋转。在更复杂的情况下,两个以上的骨骼会影响网格的特定区域,从而产生更微妙的移动。
虽然蒙皮网格最常用于预定义动画,但也可将刚体组件附加到骨架中的每个骨骼,从而将其置于物理引擎的控制之下。这种做法通常用于创建“布娃娃”效果;在此效果中,角色在被抛出或被爆炸击中后,四肢胡乱摆动。
Unity 可用一个、两个或四个骨骼对每个顶点进行蒙皮。使用四个骨骼可以获得最佳效果,但这会带来更高的处理开销。游戏通常使用两个骨骼权重,这是视觉质量与性能之间的良好折衷。
如果 Quality 设置为 Auto__,Unity 将使用来自 Quality 设置窗口的 Blend Weights__ 值。这种情况下,终端用户可自行选择质量设置,并根据需要获得动画质量与帧率之间的平衡。
默认情况下,不更新任何摄像机都看不到的蒙皮网格。在网格返回屏幕之前,不会更新蒙皮。这样做是为了节省系统资源。
对象的可见性由网格的 Bounds 属性确定(也就是说,整个包围体必须在所有激活的摄像机的视野之外)。但是,动画网格的真实包围体可能随着动画的播放而变化(例如,如果角色将手举到空中,则包围体会变高)。Unity 在计算最大包围体积时会考虑所有附加的动画,但有时无法通过计算包围体边界来预测每个可能的用例。
以下每个示例情况在将骨骼或顶点推出预先计算的包围体时都会出现问题:
在这些情况下,有两种解决方案:
通常应该使用第一个选项,因为它对性能更有利。但是,如果性能不是主要问题,或者如果无法预测包围体的大小(例如,使用布娃娃时),则第二个选项更合适。
为了使蒙皮网格在使用布娃娃时有更好的表现,Unity 会在导入带蒙皮的网格渲染器时自动将其重新映射到根骨骼。但是,仅当模型文件中只有一个带蒙皮的网格渲染器,Unity 才会执行此操作。这意味着,如果无法将所有带蒙皮的网格渲染器附加到根骨骼或子项,而又使用布娃娃,则应关闭此优化。
目前,可从以下位置导入蒙皮网格:
在移动设备上,Unity 使用手动编码的 NEON/VFP 程序集在 CPU 上处理蒙皮。这种情况下的一个限制是法线和切线未标准化,所以如果您正在编写您自己的着色器,应自己处理该标准化。但是,如果使用表面着色器,则 Unity 会自动处理标准化。
注意:优化的网格与非优化的网格在骨骼的排序方式上不同,可能导致重大的动画问题。这是因为非优化的网格依赖于骨骼顺序来生成动画,而优化的网格使用骨骼名称而不依赖于骨骼顺序。
如果您只是导入并使用 FBX 文件,Unity 将负责变换的顺序问题。
对于高级用户,如果要更改 SkinnedMeshRenderer.sharedMesh
:
SkinnedMeshRenderer.bones
与 SkinnedMeshRenderer.sharedMesh
严格匹配。引用的变换应该就会处于正确的顺序。SkinnedMeshRenderer.bones
始终为空。