SkinnedMeshRenderer相关知识
SkinnedMeshRenderer和MeshRenderer
unity中SkinnedMeshRenderer是CPU去更改顶点位置的。
而当使用MeshRenderer时,可以靠GPU来进行蒙皮(即更改顶点位置)。
SkinnedMeshRenderer是多线程处理的,在小程序游戏中,只支持同步处理,所以小程序游戏最好使用MeshRenderer去进行蒙皮处理
蒙皮
描述
将骨骼(Bone)与网格(Mesh)的顶点(Vertices)关联起来的过程。
顶点动画
描述
通过在动画帧中直接修改mesh顶点的位置来实现,通常在mesh顶点数目较少,动画简单的情况下使用,如草的摆动,树的摆动,水的波动等
蒙皮动画
描述
通过在动画中直接修改bone的位置,让mesh的顶点随着bone的变化而变化,通常用于人形动画,如人物的跑动,跳跃等
原理
顶点在骨骼下的相对坐标保持不变,骨骼根据动画作移动。
bones
SkinnedMeshRenderer skinnedMeshRenderer = go.GetComponent<SkinnedMeshRenderer>();
Transform[] bones = skinnedMeshRenderer.bones;
描述
用于对网格进行蒙皮的骨骼。
bindposes
Mesh mesh = skinnedMeshRenderer.sharedMesh;
Matrix4x4[] bindposes = mesh.bindposes;
描述
每根bone从mesh空间到自己的bone空间的变换矩阵。
绑定姿势。每个索引处的绑定姿势引用索引相同的骨骼。
当骨骼处于绑定姿势时,绑定姿势是骨骼变换矩阵的逆矩阵。
boneWeight和vertices
描述
boneWeight:描述 4 个影响网格顶点的蒙皮骨骼权重。
vertices:mesh的顶点位置的副本或分配新顶点位置数组。
关系
BoneWeight和vertices的下标在Unity中是一一对应的。每个BoneWeight数组中的元素都直接关联到vertices数组中相同索引的顶点。这意味着,如果你有一个顶点数组和一个蒙皮权重数组,它们的大小(长度)通常是相同的,并且数组的每个索引位置都对应于同一个网格顶点的蒙皮信息。
Mesh mesh = skinnedMeshRenderer.sharedMesh;
BoneWeight[] boneWeights = mesh.boneWeights;
Vector3[] vertices = mesh.vertices;
bones、bindPoses和boneWeight的关系
通过boneWeight的boneIndex0存储的骨骼索引能够拿到bones数组中的骨骼Transform数据。
通过boneWeight的boneIndex0存储的骨骼索引能够拿到bindPoses数组中的骨骼变换矩阵数据。
Transform bone = bones[boneWeight.boneIndex0];
Matrix4x4 bindpose = bindposes[boneWeight.boneIndex0];