Hi, I just copy and paste Mesh.bindposes official sample into unity 5.30, adjust the camera position and run.
The quad is static and no any animation. Do you know what's wrong?
Document:
http://docs.unity3d.com/ScriptReference/Mesh-bindposes.html
My code:
using UnityEngine;
using System.Collections;
//[ExecuteInEditMode]
public class Test : MonoBehaviour {
// Use this for initialization
void Start () {
gameObject.AddComponent();
gameObject.AddComponent();
SkinnedMeshRenderer rend = GetComponent();
Animation anim = GetComponent();
// 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[] { 0, 1, 2, 1, 3, 2 };
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;
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, 10, 0, 0), new Keyframe(2, 0.0F, 0, 0) };
// Create the clip with the curve
AnimationClip clip = new AnimationClip();
clip.SetCurve("Lower", typeof(Transform), "localPosition.z", curve);
clip.legacy = true;
// float animationLenghtInSeconds = 2;
// var rot = Quaternion.Euler(0, 0, 30);
// var localRotXCurve = AnimationCurve.EaseInOut(0, transform.localRotation.x, animationLenghtInSeconds, rot.x);
// var localRotYCurve = AnimationCurve.EaseInOut(0, transform.localRotation.y, animationLenghtInSeconds, rot.y);
// var localRotZCurve = AnimationCurve.EaseInOut(0, transform.localRotation.z, animationLenghtInSeconds, rot.z);
// var localRotWCurve = AnimationCurve.EaseInOut(0, transform.localRotation.w, animationLenghtInSeconds, rot.w);
// clip.SetCurve("Lower", typeof(Transform), "localRotation.x", localRotXCurve );
// clip.SetCurve("Lower", typeof(Transform), "localRotation.y", localRotYCurve );
// clip.SetCurve("Lower", typeof(Transform), "localRotation.z", localRotZCurve );
// clip.SetCurve("Lower", typeof(Transform), "localRotation.w", localRotWCurve );
// Add and play the clip
clip.wrapMode = WrapMode.Loop;
anim.AddClip(clip, "test");
anim.Play("test");
}
// Update is called once per frame
void Update () {
}
}
↧