using System; using System.IO; using MikuMikuDance.Motion.Motion2; namespace MikuMikuDance.Motion { /// /// MikuMikuDance(MMD)モーションの読み込みを行うFactory Class /// public static class MotionManager { /// /// ファイルからMMDモーションを読み込む /// /// MMDモーションファイル /// 変換先座標系 /// MMDモーションオブジェクト /// スケーリング値 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; } /// /// ファイルからMMDモーションを読み込む /// /// MMDモーションファイル /// スケーリング値 /// MMDモーションオブジェクト public static MMDMotion Read(string filename, float scale=0.1f) { return Read(filename, CoordinateType.LeftHandedCoordinate, scale); } /// /// ファイルへの書き出し /// /// ファイル名 /// モーション /// スケーリング値 public static void Write(string filename, MMDMotion motion, float scale=1f) { //フルパス取得 filename = Path.GetFullPath(filename); //ファイルリーダー using (FileStream fs = new FileStream(filename, FileMode.Create)) { BinaryWriter writer = new BinaryWriter(fs); //マジック文字列 if (motion is MMDMotion2) { writer.Write(MMDMotion2.GetBytes("Vocaloid Motion Data 0002", 25)); writer.Write((byte)0); writer.Write(MMDMotion2.GetBytes("JKLM", 4)); } else new NotImplementedException("その他のバーションは未作成"); motion.Write(writer, scale); fs.Close(); } } } }