Beispiel #1
0
        /// <summary>
        /// ファイルからMMDモーションを読み込む
        /// </summary>
        /// <param name="filename">MMDモーションファイル</param>
        /// <param name="coordinate">変換先座標系</param>
        /// <returns>MMDモーションオブジェクト</returns>
        /// <param name="scale">スケーリング値</param>
        public static MMDMotion Read(string filename, CoordinateType coordinate, float scale=1.0f)
        {
            //フルパス取得
            filename = Path.GetFullPath(filename);
            //ファイルチェック
            if (!File.Exists(filename))
                throw new FileNotFoundException("MMDモーションファイル:" + filename + "が見つかりません");
            //戻り値用変数
            MMDMotion result = null;
            //ファイルリーダー
            using (FileStream fs = new FileStream(filename, FileMode.Open))
            {
                BinaryReader reader = new BinaryReader(fs);
                //マジック文字列
                string magic = MMDMotion2.GetString(reader.ReadBytes(30));
                if (magic.Substring(0, 20) != "Vocaloid Motion Data")
                    throw new FileLoadException("MMDモーションファイルではありません");
                //バージョン
                int version = Convert.ToInt32(magic.Substring(21));
                if (version == 2)
                    result = new MMDMotion2();
                else
                    throw new FileLoadException("version=" + version.ToString() + "モデルは対応していません");

                result.Read(reader, coordinate,scale);
                if (fs.Length != fs.Position)
                    Console.WriteLine("警告:ファイル末尾以降に不明データ?");
                fs.Close();
            }
            return result;
        }
 internal void Read(BinaryReader reader)
 {
     FaceName = MMDMotion2.GetString(reader.ReadBytes(15));
     FrameNo  = BitConverter.ToUInt32(reader.ReadBytes(4), 0);
     //Wait = BitConverter.ToUInt32(reader.ReadBytes(4), 0);
     Rate = BitConverter.ToSingle(reader.ReadBytes(4), 0);
 }
Beispiel #3
0
 internal void Read(BinaryReader reader, float CoordZ, float scale)
 {
     BoneName = MMDMotion2.GetString(reader.ReadBytes(15));
     FrameNo  = BitConverter.ToUInt32(reader.ReadBytes(4), 0);
     for (int i = 0; i < 3; i++)
     {
         Location[i] = BitConverter.ToSingle(reader.ReadBytes(4), 0) * scale;
     }
     for (int i = 0; i < 4; i++)
     {
         Quatanion[i] = BitConverter.ToSingle(reader.ReadBytes(4), 0);
     }
     for (int i = 0; i < 4; i++)
     {
         for (int j = 0; j < 4; j++)
         {
             for (int k = 0; k < 4; k++)
             {
                 Interpolation[i][j][k] = reader.ReadByte();
             }
         }
     }
     Location[2]  *= CoordZ;
     Quatanion[0] *= CoordZ;
     Quatanion[1] *= CoordZ;
 }
Beispiel #4
0
 internal void Write(BinaryWriter writer, float CoordZ, float scale)
 {
     writer.Write(MMDMotion2.GetBytes(BoneName, 15));
     writer.Write((DWORD)FrameNo);
     writer.Write((Single)Location[0] * scale);
     writer.Write((Single)Location[1] * scale);
     writer.Write((Single)Location[2] * CoordZ * scale);
     writer.Write((Single)Quatanion[0] * CoordZ);
     writer.Write((Single)Quatanion[1] * CoordZ);
     writer.Write((Single)Quatanion[2]);
     writer.Write((Single)Quatanion[3]);
     for (int i = 0; i < 4; i++)
     {
         for (int j = 0; j < 4; j++)
         {
             for (int k = 0; k < 4; k++)
             {
                 writer.Write((byte)Interpolation[i][j][k]);
             }
         }
     }
 }
 internal void Write(BinaryWriter writer)
 {
     writer.Write(MMDMotion2.GetBytes(FaceName, 15));
     writer.Write((DWORD)FrameNo);
     writer.Write((Single)Rate);
 }