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]); }
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; } } }