/// <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); }
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; }
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); }