Пример #1
0
        static void Main(string[] args)
        {
            if (args.Length != 2)
            {
                Console.WriteLine("第一引数にvmdファイルへのファイルパス,第二引数に出力先のファイルパスを指定してください。");
                return;
            }
            String filePath = args[0];
            String fileDest = args[1];

            if (!File.Exists(filePath))
            {
                Console.WriteLine("指定されたvmdファイルは存在しません。");
                return;
            }
            using (FileStream source = File.OpenRead(filePath))
            {
                MotionData data = MotionData.getMotion(source);
                //ヘッダー情報の生製
                Console.WriteLine("ヘッダー情報の生成");
                VocaloidMotionEvolved vme = new VocaloidMotionEvolved();
                vme.header             = new Header();
                vme.header.versionInfo = "Vocaloid Motion Evolved";
                vme.header.modelInfo.Add(data.header.ModelName);
                //ボーンフレームのインデックス処理
                Console.WriteLine("VME用ボーンインデックスの生成");
                HashSet <String> boneNames = new HashSet <string>();
                foreach (var frameData in data.boneFrameList.boneFrameDatas)
                {
                    boneNames.Add(frameData.BoneName);
                }
                Dictionary <string, ulong> boneIdtable = new Dictionary <string, ulong>();
                ulong id = 0;
                foreach (var boneName in boneNames)
                {
                    boneIdtable.Add(boneName, id);
                    IDTag tag = new IDTag();
                    tag.id   = id;
                    tag.name = boneName;
                    vme.boneIDTable.Add(tag);
                    id++;
                }
                //ボーンフレームの書き出し処理
                Console.WriteLine("ボーンフレーム情報の生成");
                foreach (var boneName in boneNames)
                {
                    Console.WriteLine("ボーンフレームテーブル生成:{0}", boneName);
                    BoneFrameTable frameTable = new BoneFrameTable();
                    frameTable.id = boneIdtable[boneName];
                    foreach (var frameData in data.boneFrameList.boneFrameDatas)
                    {
                        if (frameData.BoneName.Equals(boneName))
                        {
                            BoneFrame frame = new BoneFrame();
                            frame.frameNumber        = frameData.FrameNumber;
                            frame.position           = frameData.BonePosition.ToData();
                            frame.rotation           = frameData.BoneRotatingQuaternion.ToData();
                            frame.interpolParameters = new BezInterpolParams();
                            BezInterpolParams interpol = frame.interpolParameters;
                            interpol.X1 = new bvec2()
                            {
                                x = frameData.Interpolation[0][0][0],
                                y = frameData.Interpolation[0][1][0]
                            };
                            interpol.X2 = new bvec2()
                            {
                                x = frameData.Interpolation[0][2][0],
                                y = frameData.Interpolation[0][3][0]
                            };
                            interpol.Y1 = new bvec2()
                            {
                                x = frameData.Interpolation[0][0][1],
                                y = frameData.Interpolation[0][1][1]
                            };
                            interpol.Y2 = new bvec2()
                            {
                                x = frameData.Interpolation[0][2][1],
                                y = frameData.Interpolation[0][3][1]
                            };
                            interpol.Z1 = new bvec2()
                            {
                                x = frameData.Interpolation[0][0][2],
                                y = frameData.Interpolation[0][1][2]
                            };
                            interpol.Z2 = new bvec2()
                            {
                                x = frameData.Interpolation[0][2][2],
                                y = frameData.Interpolation[0][3][2]
                            };
                            interpol.R1 = new bvec2()
                            {
                                x = frameData.Interpolation[0][0][3],
                                y = frameData.Interpolation[0][1][3]
                            };
                            interpol.R2 = new bvec2()
                            {
                                x = frameData.Interpolation[0][2][3],
                                y = frameData.Interpolation[0][3][3]
                            };
                            frameTable.frames.Add(frame);
                        }
                    }
                    frameTable.frames.Sort(new FrameComparator());
                    vme.boneFrameTables.Add(frameTable);
                }
                Console.WriteLine("ボーンフレームリスト生成完了");
                Console.WriteLine("モーフ用フレームリスト生成");
                HashSet <String> faceNames = new HashSet <string>();
                foreach (var frameData in data.morphFrameList.morphFrameDatas)
                {
                    faceNames.Add(frameData.Name);
                }
                Dictionary <string, ulong> faceIdtable = new Dictionary <string, ulong>();
                id = 0;
                foreach (var faceName in faceNames)
                {
                    faceIdtable.Add(faceName, id);
                    IDTag tag = new IDTag();
                    tag.id   = id;
                    tag.name = faceName;
                    vme.morphIDTable.Add(tag);
                    id++;
                }
                foreach (var morphName in faceNames)
                {
                    Console.WriteLine("モーフフレームテーブル生成:{0}", morphName);
                    MorphFrameTable frameTable = new MorphFrameTable();
                    frameTable.id = faceIdtable[morphName];
                    foreach (var frameData in data.morphFrameList.morphFrameDatas)
                    {
                        if (frameData.Name.Equals(morphName))
                        {
                            MorphFrame frame = new MorphFrame();
                            frame.frameNumber = frameData.FrameNumber;
                            frame.value       = frameData.MorphValue;
                            frameTable.frames.Add(frame);
                        }
                    }
                    frameTable.frames.Sort(new FrameComparator());
                    vme.morphFrameTables.Add(frameTable);
                }
                Console.WriteLine("モーフフレーム生成完了");
                if (data.CameraFrames.CameraFrameCount > 0)
                {
                    Console.WriteLine("カメラ用フレームリスト生成");
                    IDTag camTag = new IDTag();
                    camTag.id   = 0;
                    camTag.name = "Default";
                    vme.cameraIDTable.Add(camTag);
                    CameraFrameTable table = new CameraFrameTable();
                    table.id = camTag.id;
                    foreach (var cameraFrame in data.CameraFrames.CameraFrames)
                    {
                        CameraFrame frame = new CameraFrame();
                        frame.frameNumber        = cameraFrame.FrameNumber;
                        frame.position           = cameraFrame.CameraPosition.ToData();
                        frame.rotation           = cameraFrame.CameraRotation.ToData();
                        frame.viewAngle          = cameraFrame.ViewAngle;
                        frame.perspective        = cameraFrame.Perspective;
                        frame.distance           = cameraFrame.Distance;
                        frame.interpolParameters = new BezInterpolParams();
                        BezInterpolParams interpol = frame.interpolParameters;
                        interpol.X1 = new bvec2()
                        {
                            x = cameraFrame.Interpolation[0][0],
                            y = cameraFrame.Interpolation[1][0]
                        };
                        interpol.X2 = new bvec2()
                        {
                            x = cameraFrame.Interpolation[2][0],
                            y = cameraFrame.Interpolation[3][0]
                        };
                        interpol.Y1 = new bvec2()
                        {
                            x = cameraFrame.Interpolation[0][1],
                            y = cameraFrame.Interpolation[1][1]
                        };
                        interpol.Y2 = new bvec2()
                        {
                            x = cameraFrame.Interpolation[2][1],
                            y = cameraFrame.Interpolation[3][1]
                        };
                        interpol.Z1 = new bvec2()
                        {
                            x = cameraFrame.Interpolation[0][2],
                            y = cameraFrame.Interpolation[1][2]
                        };
                        interpol.Z2 = new bvec2()
                        {
                            x = cameraFrame.Interpolation[2][2],
                            y = cameraFrame.Interpolation[3][2]
                        };
                        interpol.R1 = new bvec2()
                        {
                            x = cameraFrame.Interpolation[0][3],
                            y = cameraFrame.Interpolation[1][3]
                        };
                        interpol.R2 = new bvec2()
                        {
                            x = cameraFrame.Interpolation[2][3],
                            y = cameraFrame.Interpolation[3][3]
                        };
                        CameraExtraBezParams camInterpol = frame.cameraInterpolParams = new CameraExtraBezParams();
                        camInterpol.L1 = new bvec2()
                        {
                            x = cameraFrame.Interpolation[0][4],
                            y = cameraFrame.Interpolation[1][4]
                        };
                        camInterpol.L2 = new bvec2()
                        {
                            x = cameraFrame.Interpolation[2][4],
                            y = cameraFrame.Interpolation[3][4]
                        };
                        camInterpol.V1 = new bvec2()
                        {
                            x = cameraFrame.Interpolation[0][5],
                            y = cameraFrame.Interpolation[1][5]
                        };
                        camInterpol.V2 = new bvec2()
                        {
                            x = cameraFrame.Interpolation[2][5],
                            y = cameraFrame.Interpolation[3][5]
                        };

                        table.frames.Add(frame);
                    }
                }
                if (data.LightFrames.LightCount > 0)
                {
                    Console.WriteLine("ライト用フレームリストの生成");
                    IDTag lightTag = new IDTag();
                    lightTag.id   = 0;
                    lightTag.name = "Default";
                    vme.lightIDTable.Add(lightTag);
                    LightFrameTable table = new LightFrameTable();
                    table.id = lightTag.id;
                    foreach (var lightFrame in data.LightFrames.LightFrames)
                    {
                        LightFrame frame = new LightFrame();
                        frame.frameNumber = lightFrame.FrameNumber;
                        frame.position    = lightFrame.LightPosition.ToData();
                        frame.color       = lightFrame.LightColor.ToData();
                        table.frames.Add(frame);
                    }
                }
                if (File.Exists(fileDest))
                {
                    File.Delete(fileDest);
                }
                using (FileStream fs = File.OpenWrite(fileDest))
                {
                    Serializer.Serialize(fs, vme);
                }
            }
        }
Пример #2
0
 void ParseSMDSkeleton(StreamReader file, string filename)
 {
     SortedList<int, BoneFrame[]> currAnim = new SortedList<int, BoneFrame[]>();
     List<BoneFrame> currFrame = null;
     int currFrameTime = -1;
     while (!file.EndOfStream)
     {
         string text = file.ReadLine();
         string[] data = text.Split(new char[]{' '}, StringSplitOptions.RemoveEmptyEntries);
         switch (data[0])
         {
             case "end":
                 if (currAnim.Count > 0)
                 {
                     animations.Add(filename, currAnim);
                 }
                 return;
             case "time":
                 int time = int.Parse(data[1]);
                 if (currFrame == null)
                 {
                     currFrame = new List<BoneFrame>();
                 }
                 else
                 {
                     currAnim.Add(currFrameTime, currFrame.ToArray());
                     currFrame = new List<BoneFrame>();
                 }
                 currFrameTime = time;
                 break;
             default:
                 int nodeIndex = int.Parse(data[0]);
                 Vector3 pos = ParseUtils.ParseVector3(data[1] + " " + data[2] + " " + data[3]);
                 Vector3 rot = ParseUtils.ParseVector3(data[4] + " " + data[5] + " " + data[6]);
                 BoneFrame frame = new BoneFrame(nodeIndex, pos, rot);
                 currFrame.Add(frame);
                 break;
         }
     }
 }
Пример #3
0
        public override void Load(string filePath)
        {
            BinaryReader reader = new BinaryReader(File.OpenRead(filePath));

            version  = reader.ReadInt32();
            id       = reader.ReadInt32();
            perSlerp = reader.ReadSingle();

            reader.Skip(32);

            boneCount  = reader.ReadInt32();
            frameCount = reader.ReadInt32();

            if (reader.ReadInt32() != 0)
            {
                paths = new Vector3[frameCount];
                for (int i = 0; i < frameCount; i++)
                {
                    paths[i] = reader.ReadVector3();
                }
            }

            bones = new Bone[boneCount];
            int length = -1;

            for (int i = 0; i < boneCount; i++)
            {
                Bone b = bones[i] = new Bone();
                length = reader.ReadInt32();
                char[] nameChars = reader.ReadChars(length);
                Array.Resize(ref nameChars, length - 1);//remove the null term here

                b.name = new string(nameChars);
                //b.transform = reader.ReadMatrix4x4(true); no trans is read here i guess
                b.inverseTransform = reader.ReadMatrix4x4(true);
                b.localTransform   = reader.ReadMatrix4x4(true);
                b.parentId         = reader.ReadInt32();
            }

            int aniCount = reader.ReadInt32();// global number of anim keys

            animations = new TMAnimation[aniCount];
            attributes = new MotionAttribute[frameCount];
            frames     = new BoneFrame[boneCount];

            int         frame    = 0;
            int         aniIndex = 0;
            TMAnimation ani      = animations[0];

            for (int i = 0; i < boneCount; i++)
            {
                frame = reader.ReadInt32();
                if (frame == 1)
                {
                    for (int k = 0; k < frameCount; k++)
                    {
                        TMAnimation tm = animations[aniIndex++] = new TMAnimation();

                        tm.rotation = reader.ReadQuaternion();
                        tm.position = reader.ReadVector3();
                    }
                }
                else
                {
                    // No idea what this is
                    BoneFrame bf = frames[i] = new BoneFrame();
                    bf.frames    = null;
                    bf.transform = reader.ReadMatrix4x4(true);
                }
            }

            attributes = new MotionAttribute[frameCount];
            for (int i = 0; i < frameCount; i++)
            {
                MotionAttribute ma = attributes[i] = new MotionAttribute();
                ma.type    = reader.ReadUInt32();
                ma.soundId = reader.ReadInt32();
                ma.frame   = reader.ReadSingle();
            }

            eventCount = reader.ReadInt32();
            if (eventCount > 0)
            {
                events = new Vector3[eventCount];
                for (int i = 0; i < eventCount; i++)
                {
                    events[i] = reader.ReadVector3();
                }
            }

            reader.Close();
        }