void LateUpdate() { // Simulate One Step float dt = Time.deltaTime; SimulateOneStep(1 / 60.0f); // Apply to Bone Transform for (int i = 0; i < boneParticleList.Count - 1; i++) { BoneParticle bp = boneParticleList[i]; BoneParticle cp = boneParticleList[i + 1]; Vector3 animVector = bp.boneTfm.TransformDirection(BoneAxis); Quaternion rotOffset = Quaternion.FromToRotation(animVector, cp.pos - bp.pos); bp.boneTfm.rotation = rotOffset * bp.boneTfm.rotation; } }
void Start() { // Sample from root bone, store into bone particle list Debug.Assert(RootBone != null); // Add Root Bone BoneParticle bp = new BoneParticle(RootBone); boneParticleList.Add(bp); while (bp.boneTfm.childCount > 0) { // Add Child Bone to List Transform ct = bp.boneTfm.GetChild(0); // Only Consider the first child float lengthToParent = Vector3.Distance(bp.boneTfm.position, ct.position); bp = new BoneParticle(ct); bp.invMass = 1; bp.lengthToParent = lengthToParent; boneParticleList.Add(bp); } }