Beispiel #1
0
 private void _読み込む(Stream fs)
 {
     this.ヘッダ        = new ヘッダ(fs);
     this.ボーンフレームリスト = new ボーンフレームリスト(fs);
     this.モーフフレームリスト = new モーフフレームリスト(fs);
     this.カメラフレームリスト = new カメラフレームリスト(fs);
     this.照明フレームリスト  = new 照明フレームリスト(fs);
     //this.セルフ影リスト = new セルフ影リスト( fs );
     //this.モデル表示_IKリスト = new モデル表示_IKリスト( fs );
 }
        /// <summary>
        ///     VMDのボーンフレームリストからアニメ変数を構築する。
        /// </summary>
        /// <param name="VMDFボーンフレームリスト">入力となるボーンフレームリスト。</param>
        /// <param name="PMXモデル">対象となるPMXモデル。</param>
        public static void ボーンモーションを追加する(VMDFormat.ボーンフレームリスト VMDFボーンフレームリスト, PMXモデル PMXモデル, bool 全ての親を無視する = true)
        {
            // すべてのPMXボーンについて……
            for (int i = 0; i < PMXモデル.ボーンリスト.Length; i++)
            {
                var pmxBone = PMXモデル.ボーンリスト[i];

                if (全ての親を無視する && pmxBone.PMXFボーン.ボーン名 == "全ての親")
                {
                    continue;
                }


                // 同じボーン名のフレームを列挙する。

                var boneFrames = VMDFボーンフレームリスト
                                 .Where((frame) => (frame.ボーン名 == pmxBone.PMXFボーン.ボーン名)) // 同じボーン名のフレームを、
                                 .OrderBy((frame) => frame.フレーム番号);                      // フレーム番号昇順に。


                // 列挙されたすべてのフレームについて……

                uint 前のフレーム番号 = 0;

                foreach (var frame in boneFrames)
                {
                    var 持続時間sec = (frame.フレーム番号 - 前のフレーム番号) / 30.0;     // 1frame = 1/30sec

                    pmxBone.アニメ変数_移動.遷移を追加する(
                        new ベジェ移動アニメ遷移(frame.ボーンの位置, 持続時間sec, frame.ベジェ曲線[0], frame.ベジェ曲線[1], frame.ベジェ曲線[2]));

                    pmxBone.アニメ変数_回転.遷移を追加する(
                        new ベジェ回転アニメ遷移(frame.ボーンの回転, 持続時間sec, frame.ベジェ曲線[3]));

                    前のフレーム番号 = frame.フレーム番号;
                }
            }
        }