Example #1
0
        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);
            }
        }
Example #2
0
        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);
            }
        }