float[] GetBoneMatrix(IISkin skin, IINode bone, int t, bool hasParent) { var maxMatrix = bone.GetWorldMatrix(t, hasParent); //var initialMatrix = Loader.Global.Matrix3.Create(); //skin.GetBoneInitTM(bone, initialMatrix, false); //initialMatrix.Invert(); //maxMatrix = maxMatrix.MultiplyBy(initialMatrix); //if (!hasParent) //{ // initialMatrix = Loader.Global.Matrix3.Create(); // skin.GetSkinInitTM(bone, initialMatrix, false); // initialMatrix.Invert(); // maxMatrix = maxMatrix.MultiplyBy(initialMatrix); //} maxMatrix.NoScale(); var trans = maxMatrix.Trans; var parts = Loader.Global.AffineParts.Create(); Loader.Global.DecompAffine(maxMatrix, parts); var rotationQuaternion = new Quaternion(parts.Q.X, parts.Q.Z, parts.Q.Y, parts.Q.W); var matrix = Matrix.RotationQuaternion(rotationQuaternion) * Matrix.Translation(trans.X, trans.Z, trans.Y); return(matrix.ToArray()); }
public static bool Export_To(string _filepath) { List <IINode> nodes = GetSelection(); foreach (IINode _node in nodes) { IIDerivedObject _gObject = (IIDerivedObject)_node.ObjectRef; IClass_ID classID = maxGlobal.Class_ID.Create((uint)BuiltInClassIDA.TRIOBJ_CLASS_ID, 0); ITriObject _mObject = (ITriObject)_gObject.ObjRef.ConvertToType(0, classID); IMesh _mMesh = _mObject.Mesh; _mMesh.BuildNormals(); IIDerivedObject theObj = (IIDerivedObject)_node.ObjectRef; for (int m = 0; m < theObj.Modifiers.Count; m++) { IModifier theModifier = theObj.GetModifier(m); if (theModifier.ClassName == "Skin") { IISkin _skin = (IISkin)theModifier.GetInterface((InterfaceID)(0x00010000)); IISkinContextData _skinContext = _skin.GetContextInterface(_node); ComputeVertexData(_mMesh, _skinContext, semantic, _filepath); } } } return(true); }
float[] GetBoneMatrix(IISkin skin, IINode bone, int t, bool hasParent) { var maxMatrix = bone.GetWorldMatrix(t, hasParent); //var initialMatrix = Loader.Global.Matrix3.Create(); //skin.GetBoneInitTM(bone, initialMatrix, false); //initialMatrix.Invert(); //maxMatrix = maxMatrix.MultiplyBy(initialMatrix); //if (!hasParent) //{ // initialMatrix = Loader.Global.Matrix3.Create(); // skin.GetSkinInitTM(bone, initialMatrix, false); // initialMatrix.Invert(); // maxMatrix = maxMatrix.MultiplyBy(initialMatrix); //} maxMatrix.NoScale(); var trans = maxMatrix.Trans; var parts = Loader.Global.AffineParts.Create(); Loader.Global.DecompAffine(maxMatrix, parts); var rotationQuaternion = new Quaternion(parts.Q.X, parts.Q.Z, parts.Q.Y, parts.Q.W); var matrix = Matrix.RotationQuaternion(rotationQuaternion) * Matrix.Translation(trans.X, trans.Z, trans.Y); return matrix.ToArray(); }
public static bool ExportAnimation(int[] _frames, string _filename, int _samplingRate) { List <IINode> nodes = GetSelection(); foreach (IINode _node in nodes) { IIDerivedObject theObj = (IIDerivedObject)_node.ObjectRef; IInterval interval = maxGlobal.Interval.Create(); interval.SetInfinite(); maxGlobal.IGameInterface.InitialiseIGame(false); for (int m = 0; m < theObj.Modifiers.Count; m++) { IModifier theModifier = theObj.GetModifier(m); if (theModifier.ClassName == "Skin") { IISkin _skin = (IISkin)theModifier.GetInterface((InterfaceID)(0x00010000)); IINode _bone = _skin.GetBone(0); int nbBones = _skin.NumBones; List <string> boneName = new List <string>(); for (int b = 0; b < nbBones; b++) { boneName.Add(_skin.GetBone(b).Name); } #region create bindPose World Pose bindPose = new Pose("bindPose"); BuildBind(_bone, -1, bindPose); #endregion ROD_core.Graphics.Animation.Clip_Skinning clip = new ROD_core.Graphics.Animation.Clip_Skinning(); clip.sequencesData = new List <Pose>(); clip.sequencesTiming = new List <TimeSpan>(); for (int f = 0; f < _frames.Length; f++) { // create Pose at frame (_frame) Pose _pose = new Pose("frame" + _frames[f].ToString()); BuildLJoint(_bone, -1, _pose, _frames, f, _samplingRate, bindPose); clip.sequencesData.Add(_pose); clip.sequencesTiming.Add(TimeSpan.FromSeconds(_frames[f] / 30)); } clip.saveToFile(_filename); } } } return(true); }
public static List <IINode> GetINodeSkinnedBones(this IINode node) { List <IINode> skinnedNodes = new List <IINode>(); if (!node.IsSkinned()) { return(null); } IISkin skin = node.GetSkinModifier(); for (int i = 0; i < skin.NumBones; i++) { IINode bone = skin.GetBone(i); skinnedNodes.Add(bone); } return(skinnedNodes); }
public static bool ExportSkeleton(string _filenameSkeleton) { List <IINode> nodes = GetSelection(); foreach (IINode _node in nodes) { IIDerivedObject theObj = (IIDerivedObject)_node.ObjectRef; IInterval interval = maxGlobal.Interval.Create(); interval.SetInfinite(); maxGlobal.IGameInterface.InitialiseIGame(false); for (int m = 0; m < theObj.Modifiers.Count; m++) { IModifier theModifier = theObj.GetModifier(m); if (theModifier.ClassName == "Skin") { IISkin _skin = (IISkin)theModifier.GetInterface((InterfaceID)(0x00010000)); IINode _bone = _skin.GetBone(0); int nbBones = _skin.NumBones; List <string> boneName = new List <string>(); for (int b = 0; b < nbBones; b++) { boneName.Add(_skin.GetBone(b).Name); } #region create bindPose World Pose bindPose = new Pose("bindPose"); BuildBind(_bone, -1, bindPose); #endregion Skeleton skelete = new Skeleton("skelete", bindPose); skelete.saveToFile(_filenameSkeleton); } } } return(true); }
private void ExportSkin(IISkin skin, BabylonScene babylonScene) { var babylonSkeleton = new BabylonSkeleton { id = skins.IndexOf(skin) }; babylonSkeleton.name = "skeleton #" + babylonSkeleton.id; RaiseMessage(babylonSkeleton.name, 1); var bones = new List <BabylonBone>(); for (var index = 0; index < skin.NumBones; index++) { var bone = new BabylonBone { name = skin.GetBoneName(index), index = index }; var maxBone = skin.GetBone(index); var parentNode = maxBone.ParentNode; if (parentNode != null) { for (var recurseIndex = 0; recurseIndex < index; recurseIndex++) { if (skin.GetBone(recurseIndex).GetGuid() == parentNode.GetGuid()) { bone.parentBoneIndex = recurseIndex; break; } } } var hasParent = bone.parentBoneIndex != -1; bone.matrix = GetBoneMatrix(skin, maxBone, 0, hasParent); // Animation var babylonAnimation = new BabylonAnimation { name = bone.name + "Animation", property = "_matrix", dataType = BabylonAnimation.DataType.Matrix, loopBehavior = BabylonAnimation.LoopBehavior.Cycle, framePerSecond = Loader.Global.FrameRate }; var start = Loader.Core.AnimRange.Start; var end = Loader.Core.AnimRange.End; float[] previous = null; var keys = new List <BabylonAnimationKey>(); for (var key = start; key <= end; key += Ticks) { var current = GetBoneMatrix(skin, maxBone, key, hasParent); if (key == start || key == end || !(previous.IsEqualTo(current))) { keys.Add(new BabylonAnimationKey { frame = key / Ticks, values = current }); } previous = current; } babylonAnimation.keys = keys.ToArray(); bone.animation = babylonAnimation; bones.Add(bone); } babylonSkeleton.bones = bones.ToArray(); babylonScene.SkeletonsList.Add(babylonSkeleton); }
private void ExportSkin(IISkin skin, BabylonScene babylonScene) { var babylonSkeleton = new BabylonSkeleton {id = skins.IndexOf(skin)}; babylonSkeleton.name = "skeleton #" + babylonSkeleton.id; RaiseMessage(babylonSkeleton.name, 1); var bones = new List<BabylonBone>(); for (var index = 0; index < skin.NumBones; index++) { var bone = new BabylonBone {name = skin.GetBoneName(index), index = index}; var maxBone = skin.GetBone(index); var parentNode = maxBone.ParentNode; if (parentNode != null) { for (var recurseIndex = 0; recurseIndex < index; recurseIndex++) { if (skin.GetBone(recurseIndex).GetGuid() == parentNode.GetGuid()) { bone.parentBoneIndex = recurseIndex; break; } } } var hasParent = bone.parentBoneIndex != -1; bone.matrix = GetBoneMatrix(skin, maxBone, 0, hasParent); // Animation var babylonAnimation = new BabylonAnimation { name = bone.name + "Animation", property = "_matrix", dataType = BabylonAnimation.DataType.Matrix, loopBehavior = BabylonAnimation.LoopBehavior.Cycle, framePerSecond = Loader.Global.FrameRate }; var start = Loader.Core.AnimRange.Start; var end = Loader.Core.AnimRange.End; float[] previous = null; var keys = new List<BabylonAnimationKey>(); for (var key = start; key <= end; key += Ticks) { var current = GetBoneMatrix(skin, maxBone, key, hasParent); if (key == start || key == end || !(previous.IsEqualTo(current))) { keys.Add(new BabylonAnimationKey { frame = key / Ticks, values = current }); } previous = current; } babylonAnimation.keys = keys.ToArray(); bone.animation = babylonAnimation; bones.Add(bone); } babylonSkeleton.bones = bones.ToArray(); babylonScene.SkeletonsList.Add(babylonSkeleton); }