public void UpdateTransforms(ModelNode pNode, Matrix4 transf) { string nodename = pNode.Name; Matrix4 nodeTransf = Matrix4.Identity; double time; SingleAnimationNode pNodeAnim = FindNodeAnim(nodename, pNode.Mode, out time); if (pNodeAnim != null) { BEPUutilities.Vector3 vec = pNodeAnim.lerpPos(time); BEPUutilities.Quaternion quat = pNodeAnim.lerpRotate(time); OpenTK.Quaternion oquat = new OpenTK.Quaternion(quat.X, quat.Y, quat.Z, quat.W); Matrix4 trans; Matrix4.CreateTranslation(vec.X, vec.Y, vec.Z, out trans); trans.Transpose(); Matrix4 rot; Matrix4.CreateFromQuaternion(ref oquat, out rot); rot.Transpose(); Matrix4.Mult(ref trans, ref rot, out nodeTransf); } Matrix4 global; Matrix4.Mult(ref transf, ref nodeTransf, out global); for (int i = 0; i < pNode.Bones.Count; i++) { //Matrix4 modded; //Matrix4.Mult(ref globalInverse, ref global, out modded); Matrix4.Mult(ref global, ref pNode.Bones[i].Offset, out pNode.Bones[i].Transform); } for (int i = 0; i < pNode.Children.Count; i++) { UpdateTransforms(pNode.Children[i], global); } }
public void UpdateTransforms(ModelNode pNode, Matrix4 transf) { string nodename = pNode.Name; Matrix4 nodeTransf = Matrix4.Identity; double time; SingleAnimationNode pNodeAnim = FindNodeAnim(nodename, pNode.Mode, out time); if (pNodeAnim != null) { BEPUutilities.Vector3 vec = pNodeAnim.lerpPos(time); BEPUutilities.Quaternion quat = pNodeAnim.lerpRotate(time); Quaternion oquat = new Quaternion((float)quat.X, (float)quat.Y, (float)quat.Z, (float)quat.W); Matrix4 trans; Matrix4.CreateTranslation((float)vec.X, (float)vec.Y, (float)vec.Z, out trans); trans.Transpose(); Matrix4 rot; Matrix4.CreateFromQuaternion(ref oquat, out rot); Matrix4 r2; if (CustomAnimationAdjustments.TryGetValue(nodename, out r2)) { rot *= r2; } rot.Transpose(); Matrix4.Mult(ref trans, ref rot, out nodeTransf); } else { Matrix4 temp; if (CustomAnimationAdjustments.TryGetValue(nodename, out temp)) { temp.Transpose(); nodeTransf = temp; } } Matrix4 global; Matrix4.Mult(ref transf, ref nodeTransf, out global); for (int i = 0; i < pNode.Bones.Count; i++) { if (ForceBoneNoOffset) { pNode.Bones[i].Transform = global; } else { Matrix4.Mult(ref global, ref pNode.Bones[i].Offset, out pNode.Bones[i].Transform); } } for (int i = 0; i < pNode.Children.Count; i++) { UpdateTransforms(pNode.Children[i], global); } }