Как добавить кости в процедурную сетку с помощью Unity? - PullRequest
0 голосов
/ 04 июня 2019

Моя настройка:
Количество префабов N объединено в новый GameObject.Затем это объединяется в одну основную сетку, состоящую из количества подмешиваний материала М.
Форма стоит вверх по оси 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];
    }
}
...