版本:Unity 6 (6000.0)
语言英语
  • C#

网格.bindposes

建议更改

成功!

感谢您帮助我们提升 Unity 文档的质量。 虽然我们无法接受所有提交,但是我们确实会阅读用户提出的每项更改建议,并在适用时进行更新。

关闭

提交失败

由于某种原因,无法提交您建议的更改。 请<a>再试一次</a>,等待几分钟。感谢您花时间帮助我们提升 Unity 文档的质量。

关闭

取消

切换到手册
public Matrix4x4[] bindposes;

描述

绑定姿态。每个索引处的绑定姿态引用具有相同索引的骨骼。

bindposes 中的每个矩阵是骨骼变换矩阵的逆矩阵,在骨骼处于其基础状态(其绑定姿态)时计算。

注意:请参阅 网格 页面,其中示例 2 展示了顶点被复制、更新并重新分配给 网格。此页面上的示例还以相同方式更新 bindposesSkinnedMeshRenderer.bonesSkinnedMeshRenderer.sharedMesh

using UnityEngine;
using System.Collections;

// this example creates a quad mesh from scratch, creates bones // and assigns them, and animates the bones motion to make the // quad animate based on a simple animation curve. public class BindPoseExample : MonoBehaviour { void Start() { gameObject.AddComponent<Animation>(); gameObject.AddComponent<SkinnedMeshRenderer>(); SkinnedMeshRenderer rend = GetComponent<SkinnedMeshRenderer>(); Animation anim = GetComponent<Animation>();

// Build basic mesh Mesh mesh = new Mesh(); mesh.vertices = new Vector3[] { new Vector3(-1, 0, 0), new Vector3(1, 0, 0), new Vector3(-1, 5, 0), new Vector3(1, 5, 0) }; mesh.uv = new Vector2[] { new Vector2(0, 0), new Vector2(1, 0), new Vector2(0, 1), new Vector2(1, 1) }; mesh.triangles = new int[] { 2, 3, 1, 2, 1, 0 }; mesh.RecalculateNormals(); rend.material = new Material(Shader.Find("Diffuse"));

// assign bone weights to mesh BoneWeight[] weights = new BoneWeight[4]; weights[0].boneIndex0 = 0; weights[0].weight0 = 1; weights[1].boneIndex0 = 0; weights[1].weight0 = 1; weights[2].boneIndex0 = 1; weights[2].weight0 = 1; weights[3].boneIndex0 = 1; weights[3].weight0 = 1; mesh.boneWeights = weights;

// Create Bone Transforms and Bind poses // One bone at the bottom and one at the top

Transform[] bones = new Transform[2]; Matrix4x4[] bindPoses = new Matrix4x4[2]; bones[0] = new GameObject("Lower").transform; bones[0].parent = transform; // Set the position relative to the parent bones[0].localRotation = Quaternion.identity; bones[0].localPosition = Vector3.zero; // The bind pose is bone's inverse transformation matrix // In this case the matrix we also make this matrix relative to the root // So that we can move the root game object around freely bindPoses[0] = bones[0].worldToLocalMatrix * transform.localToWorldMatrix;

bones[1] = new GameObject("Upper").transform; bones[1].parent = transform; // Set the position relative to the parent bones[1].localRotation = Quaternion.identity; bones[1].localPosition = new Vector3(0, 5, 0); // The bind pose is bone's inverse transformation matrix // In this case the matrix we also make this matrix relative to the root // So that we can move the root game object around freely bindPoses[1] = bones[1].worldToLocalMatrix * transform.localToWorldMatrix;

// bindPoses was created earlier and was updated with the required matrix. // The bindPoses array will now be assigned to the bindposes in the Mesh. mesh.bindposes = bindPoses;

// Assign bones and bind poses rend.bones = bones; rend.sharedMesh = mesh;

// Assign a simple waving animation to the bottom bone AnimationCurve curve = new AnimationCurve(); curve.keys = new Keyframe[] { new Keyframe(0, 0, 0, 0), new Keyframe(1, 3, 0, 0), new Keyframe(2, 0.0F, 0, 0) };

// Create the clip with the curve AnimationClip clip = new AnimationClip(); clip.legacy = true; clip.SetCurve("Lower", typeof(Transform), "m_LocalPosition.z", curve);

// Add and play the clip clip.wrapMode = WrapMode.Loop; anim.AddClip(clip, "test"); anim.Play("test"); } }