static System.Numerics.Quaternion ConvertQuat(Assimp.Quaternion Q) { NumMatrix4x4.Decompose(ConvertMatrix(new AssMatrix4x4(Q.GetMatrix())), out Vector3 _S, out System.Numerics.Quaternion Quat, out Vector3 _T); return(Quat); // return new System.Numerics.Quaternion(Q.X, Q.Y, Q.Z, Q.W); }
// T O M G (convert for use with MonoGame) - QUATERNION public static XNA.Quaternion ToMg(this Assimp.Quaternion aq) { var m = aq.GetMatrix(); var n = m.ToMgTransposed(); var q = XNA.Quaternion.CreateFromRotationMatrix(n); return(q); }
Matrix GetMatrix(Vector3D pscale, Vector3D pPosition, Assimp.Quaternion pRot) { // create the combined transformation matrix var mat = new Matrix4x4(pRot.GetMatrix()); mat.A1 *= pscale.X; mat.B1 *= pscale.X; mat.C1 *= pscale.X; mat.A2 *= pscale.Y; mat.B2 *= pscale.Y; mat.C2 *= pscale.Y; mat.A3 *= pscale.Z; mat.B3 *= pscale.Z; mat.C3 *= pscale.Z; mat.A4 = pPosition.X; mat.B4 = pPosition.Y; mat.C4 = pPosition.Z; return(mat.ToMatrix()); }
/// <summary> /// Build a transformation matrix from rotation, scaling and translation components. /// The transformation order is scaling, rotation, translation (left to right). /// </summary> /// <param name="presentRotation"></param> /// <param name="presentScaling"></param> /// <param name="presentPosition"></param> /// <param name="outMatrix"></param> private static void BuildTransform(ref Quaternion presentRotation, ref Vector3D presentScaling, ref Vector3D presentPosition, out Matrix outMatrix) { // build a transformation matrix from it var mat = new Matrix4x4(presentRotation.GetMatrix()); mat.A1 *= presentScaling.X; mat.B1 *= presentScaling.X; mat.C1 *= presentScaling.X; mat.A2 *= presentScaling.Y; mat.B2 *= presentScaling.Y; mat.C2 *= presentScaling.Y; mat.A3 *= presentScaling.Z; mat.B3 *= presentScaling.Z; mat.C3 *= presentScaling.Z; mat.A4 = presentPosition.X; mat.B4 = presentPosition.Y; mat.C4 = presentPosition.Z; outMatrix = AssimpConv.ConvertTransform(mat); }
public void Evaluate(float dt, Dictionary<string, Bone> bones) { dt *= TicksPerSecond; var time = 0.0f; if (Duration > 0.0f) { time = dt % Duration; } for (int i = 0; i < Channels.Count; i++) { var channel = Channels[i]; if (!bones.ContainsKey(channel.Name)) { Console.WriteLine("Did not find the bone node " + channel.Name); continue; } // interpolate position keyframes var pPosition = new Vector3D(); if (channel.PositionKeys.Count > 0) { var frame = (time >= LastTime) ? LastPositions[i].Item1 : 0; while (frame < channel.PositionKeys.Count - 1) { if (time < channel.PositionKeys[frame + 1].Time) { break; } frame++; } if (frame >= channel.PositionKeys.Count) { frame = 0; } var nextFrame = (frame + 1) % channel.PositionKeys.Count; var key = channel.PositionKeys[frame]; var nextKey = channel.PositionKeys[nextFrame]; var diffTime = nextKey.Time - key.Time; if (diffTime < 0.0) { diffTime += Duration; } if (diffTime > 0.0) { var factor = (float)((time - key.Time) / diffTime); pPosition = key.Value + (nextKey.Value - key.Value) * factor; } else { pPosition = key.Value; } LastPositions[i].Item1 = frame; } // interpolate rotation keyframes var pRot = new Assimp.Quaternion(1, 0, 0, 0); if (channel.RotationKeys.Count > 0) { var frame = (time >= LastTime) ? LastPositions[i].Item2 : 0; while (frame < channel.RotationKeys.Count - 1) { if (time < channel.RotationKeys[frame + 1].Time) { break; } frame++; } if (frame >= channel.RotationKeys.Count) { frame = 0; } var nextFrame = (frame + 1) % channel.RotationKeys.Count; var key = channel.RotationKeys[frame]; var nextKey = channel.RotationKeys[nextFrame]; key.Value.Normalize(); nextKey.Value.Normalize(); var diffTime = nextKey.Time - key.Time; if (diffTime < 0.0) { diffTime += Duration; } if (diffTime > 0) { var factor = (float)((time - key.Time) / diffTime); pRot = Assimp.Quaternion.Slerp(key.Value, nextKey.Value, factor); } else { pRot = key.Value; } LastPositions[i].Item1= frame; } // interpolate scale keyframes var pscale = new Vector3D(1); if (channel.ScalingKeys.Count > 0) { var frame = (time >= LastTime) ? LastPositions[i].Item3 : 0; while (frame < channel.ScalingKeys.Count - 1) { if (time < channel.ScalingKeys[frame + 1].Time) { break; } frame++; } if (frame >= channel.ScalingKeys.Count) { frame = 0; } LastPositions[i].Item3 = frame; } // create the combined transformation matrix var mat = new Matrix4x4(pRot.GetMatrix()); mat.A1 *= pscale.X; mat.B1 *= pscale.X; mat.C1 *= pscale.X; mat.A2 *= pscale.Y; mat.B2 *= pscale.Y; mat.C2 *= pscale.Y; mat.A3 *= pscale.Z; mat.B3 *= pscale.Z; mat.C3 *= pscale.Z; mat.A4 = pPosition.X; mat.B4 = pPosition.Y; mat.C4 = pPosition.Z; // transpose to get DirectX style matrix mat.Transpose(); bones[channel.Name].LocalTransform = mat.ToMatrix(); } LastTime = time; }
public void Evaluate(float dt, Dictionary<string, Bone> bones) { dt *= TicksPerSecond; var time = 0.0f; if (Duration > 0.0f) { time = dt % Duration; } for (int i = 0; i < Channels.Count; i++) { var channel = Channels[i]; if (!bones.ContainsKey(channel.Name)) { Console.WriteLine("Did not find the bone node " + channel.Name); continue; } // interpolate position keyframes var pPosition = new Vector3D(); if (channel.PositionKeys.Count > 0) { var frame = (time >= LastTime) ? LastPositions[i].Item1 : 0; while (frame < channel.PositionKeys.Count - 1) { if (time < channel.PositionKeys[frame + 1].Time) { break; } frame++; } if (frame >= channel.PositionKeys.Count) { frame = 0; } var nextFrame = (frame + 1) % channel.PositionKeys.Count; var key = channel.PositionKeys[frame]; var nextKey = channel.PositionKeys[nextFrame]; var diffTime = nextKey.Time - key.Time; if (diffTime < 0.0) { diffTime += Duration; } if (diffTime > 0.0) { var factor = (float)((time - key.Time) / diffTime); pPosition = key.Value + (nextKey.Value - key.Value) * factor; } else { pPosition = key.Value; } LastPositions[i].Item1 = frame; } // interpolate rotation keyframes var pRot = new Assimp.Quaternion(1, 0, 0, 0); if (channel.RotationKeys.Count > 0) { var frame = (time >= LastTime) ? LastPositions[i].Item2 : 0; while (frame < channel.RotationKeys.Count - 1) { if (time < channel.RotationKeys[frame + 1].Time) { break; } frame++; } if (frame >= channel.RotationKeys.Count) { frame = 0; } var nextFrame = (frame + 1) % channel.RotationKeys.Count; var key = channel.RotationKeys[frame]; var nextKey = channel.RotationKeys[nextFrame]; key.Value.Normalize(); nextKey.Value.Normalize(); var diffTime = nextKey.Time - key.Time; if (diffTime < 0.0) { diffTime += Duration; } if (diffTime > 0) { var factor = (float)((time - key.Time) / diffTime); pRot = Assimp.Quaternion.Slerp(key.Value, nextKey.Value, factor); } else { pRot = key.Value; } LastPositions[i].Item1= frame; } // interpolate scale keyframes var pscale = new Vector3D(1); if (channel.ScalingKeys.Count > 0) { var frame = (time >= LastTime) ? LastPositions[i].Item3 : 0; while (frame < channel.ScalingKeys.Count - 1) { if (time < channel.ScalingKeys[frame + 1].Time) { break; } frame++; } if (frame >= channel.ScalingKeys.Count) { frame = 0; } LastPositions[i].Item3 = frame; } // create the combined transformation matrix var mat = new Matrix4x4(pRot.GetMatrix()); mat.A1 *= pscale.X; mat.B1 *= pscale.X; mat.C1 *= pscale.X; mat.A2 *= pscale.Y; mat.B2 *= pscale.Y; mat.C2 *= pscale.Y; mat.A3 *= pscale.Z; mat.B3 *= pscale.Z; mat.C3 *= pscale.Z; mat.A4 = pPosition.X; mat.B4 = pPosition.Y; mat.C4 = pPosition.Z; // transpose to get DirectX style matrix mat.Transpose(); bones[channel.Name].LocalTransform = mat.ToMatrix(); } LastTime = time; }
/// <summary> /// Build a transformation matrix from rotation, scaling and translation components. /// The transformation order is scaling, rotation, translation (left to right). /// </summary> /// <param name="presentRotation"></param> /// <param name="presentScaling"></param> /// <param name="presentPosition"></param> /// <param name="outMatrix"></param> private static void BuildTransform(ref Quaternion presentRotation, ref Vector3D presentScaling, ref Vector3D presentPosition, out Matrix4 outMatrix) { // build a transformation matrix from it var mat = new Matrix4x4(presentRotation.GetMatrix()); mat.A1 *= presentScaling.X; mat.B1 *= presentScaling.X; mat.C1 *= presentScaling.X; mat.A2 *= presentScaling.Y; mat.B2 *= presentScaling.Y; mat.C2 *= presentScaling.Y; mat.A3 *= presentScaling.Z; mat.B3 *= presentScaling.Z; mat.C3 *= presentScaling.Z; mat.A4 = presentPosition.X; mat.B4 = presentPosition.Y; mat.C4 = presentPosition.Z; outMatrix = AssimpToOpenTk.FromMatrix(ref mat); }