Example #1
0
        public Assimp.Animation assimpExport(ref Assimp.Scene scn)
        {
            Assimp.Animation asAnim = new Assimp.Animation();
            asAnim.Name = Anim;


            //Make sure keyframe data is loaded from the files
            if (!loaded)
            {
                fetchAnimMetaData();
                loaded = true;
            }



            asAnim.TicksPerSecond  = 60;
            asAnim.DurationInTicks = animMeta.FrameCount;
            float time_interval = 1.0f / (float)asAnim.TicksPerSecond;


            //Add Node-Bone Channels
            for (int i = 0; i < animMeta.NodeCount; i++)
            {
                string name = animMeta.NodeData[i].Node;
                Assimp.NodeAnimationChannel mChannel = new Assimp.NodeAnimationChannel();
                mChannel.NodeName = name;

                //mChannel.PostState = Assimp.AnimationBehaviour.Linear;
                //mChannel.PreState = Assimp.AnimationBehaviour.Linear;


                //Export Keyframe Data
                for (int j = 0; j < animMeta.FrameCount; j++)
                {
                    //Position
                    Assimp.VectorKey vk = new Assimp.VectorKey(j * time_interval, MathUtils.convertVector(animMeta.anim_positions[name][j]));
                    mChannel.PositionKeys.Add(vk);
                    //Rotation
                    Assimp.QuaternionKey qk = new Assimp.QuaternionKey(j * time_interval, MathUtils.convertQuaternion(animMeta.anim_rotations[name][j]));
                    mChannel.RotationKeys.Add(qk);
                    //Scale
                    Assimp.VectorKey sk = new Assimp.VectorKey(j * time_interval, MathUtils.convertVector(animMeta.anim_scales[name][j]));
                    mChannel.ScalingKeys.Add(sk);
                }

                asAnim.NodeAnimationChannels.Add(mChannel);
            }

            return(asAnim);
        }
Example #2
0
        private Keyframe[][] GenerateRotationTrack(List <Assimp.QuaternionKey> keys, Bone bone)
        {
            Keyframe[] x_track = new Keyframe[keys.Count];
            Keyframe[] y_track = new Keyframe[keys.Count];
            Keyframe[] z_track = new Keyframe[keys.Count];

            for (int i = 0; i < keys.Count; i++)
            {
                Assimp.QuaternionKey current_key = keys[i];
                Quaternion           value       = new Quaternion(current_key.Value.X, current_key.Value.Y, current_key.Value.Z, current_key.Value.W);
                Vector3 quat_as_vec = QuaternionExtensions.ToEulerAngles(value);

                x_track[i].Key  = quat_as_vec.X;
                x_track[i].Time = (float)current_key.Time;

                y_track[i].Key  = quat_as_vec.Y;
                y_track[i].Time = (float)current_key.Time;

                z_track[i].Key  = quat_as_vec.Z;
                z_track[i].Time = (float)current_key.Time;
            }

            return(new Keyframe[][] { x_track, y_track, z_track });
        }