モーションの適応をAnimationPlayerからNormalMotionTrackに移動
@@ -148,45 +148,7 @@ | ||
148 | 148 | { |
149 | 149 | if (mmdMotion[i].Type == TrackType.NormalTrack) |
150 | 150 | { |
151 | - NormalMotionTrack track = (NormalMotionTrack)mmdMotion[i]; | |
152 | - //現在の再生フレームを更新 | |
153 | - //InnerUpdate(mmdMotion[i].motion, mmdMotion[i].GetFrame(FramePerSecond)); | |
154 | - decimal NowFrame = track.GetFrame(FramePerSecond); | |
155 | -#if TRACE | |
156 | - if (mmdModel.mmdXNA.TimeRular != null && mmdModel.UseTimeRular) | |
157 | - mmdModel.mmdXNA.TimeRular.BeginMark(2, "Anime-MotionToBone", Color.BlueViolet); | |
158 | -#endif | |
159 | - //モーションのボーンリストを取得 | |
160 | - List<string> motionBones = track.motion.GetBoneList(); | |
161 | - //リストにあるボーンの位置を順番に更新 | |
162 | - foreach (var bone in motionBones) | |
163 | - { | |
164 | - if (mmdModel.BoneManager.ContainsBone(bone)) | |
165 | - {//存在しないボーンへのモーションは無視…… | |
166 | - int boneIndex = mmdModel.BoneManager.IndexOf(bone); | |
167 | - QuatTransform move = track.motion.GetBoneTransform(bone, NowFrame); | |
168 | - //ボーン処理 | |
169 | - mmdModel.BoneManager[boneIndex].BoneTransform = move * mmdModel.BoneManager[boneIndex].BoneData.BindPose; | |
170 | - } | |
171 | - } | |
172 | -#if TRACE | |
173 | - if (mmdModel.mmdXNA.TimeRular != null && mmdModel.UseTimeRular) | |
174 | - { | |
175 | - mmdModel.mmdXNA.TimeRular.EndMark(2, "Anime-MotionToBone"); | |
176 | - mmdModel.mmdXNA.TimeRular.BeginMark(2, "Anime-Face", Color.BlueViolet); | |
177 | - } | |
178 | -#endif | |
179 | - //フェイスモーションの処理 | |
180 | - List<string> faces = track.motion.GetFaceList(); | |
181 | - //リストにあるフェイスのデータを順番に処理 | |
182 | - foreach (var face in faces) | |
183 | - { | |
184 | - mmdModel.FaceManager.SetFace(face, track.motion.GetFaceRate(face, NowFrame)); | |
185 | - } | |
186 | -#if TRACE | |
187 | - if (mmdModel.mmdXNA.TimeRular != null && mmdModel.UseTimeRular) | |
188 | - mmdModel.mmdXNA.TimeRular.EndMark(2, "Anime-Face"); | |
189 | -#endif | |
151 | + mmdNMotion[i].ApplyMotion(mmdModel); | |
190 | 152 | } |
191 | 153 | } |
192 | 154 | } |
@@ -3,6 +3,9 @@ | ||
3 | 3 | using System.Linq; |
4 | 4 | using System.Text; |
5 | 5 | using System.Diagnostics; |
6 | +using MikuMikuDance.XNA.Model; | |
7 | +using MikuMikuDance.XNA.Model.ModelData; | |
8 | +using Microsoft.Xna.Framework.Graphics; | |
6 | 9 | |
7 | 10 | namespace MikuMikuDance.XNA.Motion |
8 | 11 | { |
@@ -60,5 +63,47 @@ | ||
60 | 63 | } |
61 | 64 | return frame % (decimal)motion.MaxFrame; |
62 | 65 | } |
66 | + | |
67 | + public void ApplyMotion(MMDModel mmdModel) | |
68 | + { | |
69 | + //現在の再生フレームを更新 | |
70 | + //InnerUpdate(mmdMotion[i].motion, mmdMotion[i].GetFrame(FramePerSecond)); | |
71 | + decimal NowFrame = GetFrame(mmdModel.Player.FramePerSecond); | |
72 | +#if TRACE | |
73 | + if (mmdModel.mmdXNA.TimeRular != null && mmdModel.UseTimeRular) | |
74 | + mmdModel.mmdXNA.TimeRular.BeginMark(2, "Anime-MotionToBone", Color.BlueViolet); | |
75 | +#endif | |
76 | + //モーションのボーンリストを取得 | |
77 | + List<string> motionBones = motion.GetBoneList(); | |
78 | + //リストにあるボーンの位置を順番に更新 | |
79 | + foreach (var bone in motionBones) | |
80 | + { | |
81 | + if (mmdModel.BoneManager.ContainsBone(bone)) | |
82 | + {//存在しないボーンへのモーションは無視…… | |
83 | + int boneIndex = mmdModel.BoneManager.IndexOf(bone); | |
84 | + QuatTransform move = motion.GetBoneTransform(bone, NowFrame); | |
85 | + //ボーン処理 | |
86 | + mmdModel.BoneManager[boneIndex].BoneTransform = move * mmdModel.BoneManager[boneIndex].BoneData.BindPose; | |
87 | + } | |
88 | + } | |
89 | +#if TRACE | |
90 | + if (mmdModel.mmdXNA.TimeRular != null && mmdModel.UseTimeRular) | |
91 | + { | |
92 | + mmdModel.mmdXNA.TimeRular.EndMark(2, "Anime-MotionToBone"); | |
93 | + mmdModel.mmdXNA.TimeRular.BeginMark(2, "Anime-Face", Color.BlueViolet); | |
94 | + } | |
95 | +#endif | |
96 | + //フェイスモーションの処理 | |
97 | + List<string> faces = motion.GetFaceList(); | |
98 | + //リストにあるフェイスのデータを順番に処理 | |
99 | + foreach (var face in faces) | |
100 | + { | |
101 | + mmdModel.FaceManager.SetFace(face, motion.GetFaceRate(face, NowFrame)); | |
102 | + } | |
103 | +#if TRACE | |
104 | + if (mmdModel.mmdXNA.TimeRular != null && mmdModel.UseTimeRular) | |
105 | + mmdModel.mmdXNA.TimeRular.EndMark(2, "Anime-Face"); | |
106 | +#endif | |
107 | + } | |
63 | 108 | } |
64 | 109 | } |
@@ -3,6 +3,7 @@ | ||
3 | 3 | using System.Diagnostics; |
4 | 4 | using System.Linq; |
5 | 5 | using System.Text; |
6 | +using MikuMikuDance.XNA.Model; | |
6 | 7 | |
7 | 8 | namespace MikuMikuDance.XNA.Motion |
8 | 9 | { |
@@ -24,6 +25,7 @@ | ||
24 | 25 | void Stop(); |
25 | 26 | decimal GetFrame(decimal FramePerSecond); |
26 | 27 | |
28 | + void ApplyMotion(MMDModel model); | |
27 | 29 | TrackType Type { get; } |
28 | 30 | } |
29 | 31 | } |