コード例 #1
0
    public void TestCreateSoftMeshSkinning()
    {
        Vector3[] vertices    = { new Vector3(1, 1, 1), new Vector3(-1, -1, 1), new Vector3(-1, 1, -1), new Vector3(1, -1, -1) };
        Vector3[] bones       = { new Vector3(0, 0, 1), new Vector3(0, 0, 0), new Vector3(0, 0, -1) };
        float     falloff     = 1.0f;
        float     maxDistance = 2.5f;

        float[] skinningWeights = new float[vertices.Length * 4];
        int[]   skinningIndices = new int[vertices.Length * 4];

        FlexExt.CreateSoftMeshSkinning(ref vertices[0], vertices.Length, ref bones[0], bones.Length, falloff, maxDistance, ref skinningWeights[0], ref skinningIndices[0]);

        Assert.AreEqual(0, skinningIndices[0]);
        Assert.AreEqual(1, skinningIndices[1]);
        Assert.AreEqual(2, skinningIndices[2]);
        Assert.AreEqual(-1, skinningIndices[3]);
        Assert.AreEqual(1.0f, skinningWeights[0] + skinningWeights[1] + skinningWeights[2] + skinningWeights[3]);
    }
コード例 #2
0
        void BuildSkinningInfo()
        {
            if (m_actor && m_actor.asset && m_renderer && m_renderer.sharedMesh)
            {
                Vector3[] vertices = m_renderer.sharedMesh.vertices;

                Transform actorTransform    = m_actor.transform;
                Transform rendererTransform = m_renderer.transform;

                Vector3[] shapeCenters = (Vector3[])m_actor.asset.shapeCenters.Clone();
                for (int i = 0; i < shapeCenters.Length; ++i)
                {
                    shapeCenters[i] = rendererTransform.InverseTransformPoint(actorTransform.TransformPoint(shapeCenters[i]));
                }

                Quaternion shapeRotation = Quaternion.Inverse(rendererTransform.rotation) * actorTransform.rotation;
                m_bindposes = new Matrix4x4[shapeCenters.Length];
                for (int i = 0; i < shapeCenters.Length; ++i)
                {
                    m_bindposes[i] = Matrix4x4.TRS(shapeCenters[i], shapeRotation, Vector3.one).inverse;
                }

                float[] skinningWeights = new float[vertices.Length * 4];
                int[]   skinningIndices = new int[vertices.Length * 4];

                FlexExt.CreateSoftMeshSkinning(ref vertices[0], vertices.Length, ref shapeCenters[0], shapeCenters.Length, m_skinningFalloff, m_skinningMaxDistance, ref skinningWeights[0], ref skinningIndices[0]);

                m_boneWeights = new BoneWeight[vertices.Length];
                for (int i = 0; i < vertices.Length; ++i)
                {
                    BoneWeight w = new BoneWeight();
                    w.boneIndex0     = skinningIndices[i * 4 + 0];
                    w.boneIndex1     = skinningIndices[i * 4 + 1];
                    w.boneIndex2     = skinningIndices[i * 4 + 2];
                    w.boneIndex3     = skinningIndices[i * 4 + 3];
                    w.weight0        = skinningWeights[i * 4 + 0];
                    w.weight1        = skinningWeights[i * 4 + 1];
                    w.weight2        = skinningWeights[i * 4 + 2];
                    w.weight3        = skinningWeights[i * 4 + 3];
                    m_boneWeights[i] = w;
                }
            }
        }