我的设置:
N个预制件捆绑在一起,成为一个新的GameObject。然后将其合并到一个由M个材料子网格组成的单个主网格中。
该形状在Y轴上向上站立,是一堆手臂。
目的是通过添加骨骼来移动它们。
关于如何将骨骼正确分配到非简单立方体的程序网格上,我找不到很多示例。
问题是将顶点分配给权重。我希望变换Y = 0的顶点没有权重,而Y =最远的顶点具有权重。我不确定应该如何完成分配。任何指针吗? :)
到目前为止,上下骨骼变换都在正确的位置,但是当移动它们时,网格并没有像我希望的那样弯曲,而是通过一条细网格线均匀地移动了一半顶点连接两半。
private void _AddBones()
{
if(m_SkinnedRenderer != null)
{
// Make bone weight for vertices
BoneWeight[] weights = new BoneWeight[m_MainMesh.vertexCount];
int halfway = (weights.Length / 2);
for (int i = 0; i < weights.Length; i++)
{
if(i < halfway)
{
weights[i].boneIndex0 = 0;
weights[i].weight0 = 1;
}
else
{
weights[i].boneIndex0 = 1;
weights[i].weight0 = 1;
}
}
m_MainMesh.boneWeights = weights;
// Make bones and bind poses
Transform[] bones = new Transform[2];
Matrix4x4[] bindPoses = new Matrix4x4[2];
bones[0] = new GameObject("Lower Bone").transform;
bones[0].parent = m_MergedRoot.transform;
bones[0].localRotation = Quaternion.identity;
bones[0].localPosition = Vector3.zero;
bindPoses[0] = bones[0].worldToLocalMatrix * m_MergedRoot.transform.localToWorldMatrix;
bones[1] = new GameObject("Upper Bone").transform;
bones[1].parent = m_MergedRoot.transform;
bones[1].localRotation = Quaternion.identity;
bones[1].localPosition = new Vector3(0, 1.5f, 0);
bindPoses[1] = bones[1].worldToLocalMatrix * m_MergedRoot.transform.localToWorldMatrix;
m_MainMesh.bindposes = bindPoses;
m_SkinnedRenderer.bones = bones;
m_SkinnedRenderer.sharedMesh = m_MainMesh;
m_SkinnedRenderer.rootBone = bones[0];
}
}