如何使用Unity将骨骼添加到程序网格?

时间:2019-06-04 15:41:11

标签: unity3d mesh skeletal-mesh

我的设置:
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];
    }
}

0 个答案:

没有答案