カメラモーション実装完了。ついでにMotionLibraryのカメラモーションの座標系変換ミス修正
@@ -70,6 +70,7 @@ | ||
70 | 70 | { |
71 | 71 | Content = game.Content; |
72 | 72 | Camera = new MMDCamera(game); |
73 | + game.Components.Add(Camera); | |
73 | 74 | LightManager = new MMDLightManager(); |
74 | 75 | #if WINDOWS |
75 | 76 | //論理コア数を取得して、最適スレッド数を取得 |
@@ -90,6 +91,7 @@ | ||
90 | 91 | { |
91 | 92 | Content = game.Content; |
92 | 93 | Camera = new MMDCamera(game); |
94 | + game.Components.Add(Camera); | |
93 | 95 | LightManager = new MMDLightManager(); |
94 | 96 | #if WINDOWS |
95 | 97 | //論理コア数を取得して、最適スレッド数を取得 |
@@ -116,10 +118,11 @@ | ||
116 | 118 | return result; |
117 | 119 | } |
118 | 120 | /// <summary> |
119 | - /// モーションをアセットから読み込む | |
121 | + /// モデルモーションをアセットから読み込む | |
120 | 122 | /// </summary> |
121 | 123 | /// <param name="assetName">モーションのアセット名</param> |
122 | - /// <returns>MikuMikuDance for XNAのモーション</returns> | |
124 | + /// <returns>MikuMikuDance for XNAのモデルモーション</returns> | |
125 | + /// <remarks>カメラ、ライトモーションはLoadStageMotionを使用</remarks> | |
123 | 126 | public MMDMotion LoadMotion(string assetName) |
124 | 127 | { |
125 | 128 | MMDMotion result = new MMDMotion(); |
@@ -147,8 +150,18 @@ | ||
147 | 150 | { |
148 | 151 | return Content.Load<MMD_VAC>(assetName); |
149 | 152 | } |
150 | - | |
151 | 153 | /// <summary> |
154 | + /// カメラ、ライトモーション(ステージモーション)をアセットから読み込む | |
155 | + /// </summary> | |
156 | + /// <param name="assetName">モーションのアセット名</param> | |
157 | + /// <returns>MikuMikuDance for XNAのステージモーション</returns> | |
158 | + public MMDStageMotion LoadStageMotion(string assetName) | |
159 | + { | |
160 | + MMDStageMotion result = new MMDStageMotion(); | |
161 | + result.Initialize(Content.Load<MMDMotionData>(assetName), this); | |
162 | + return result; | |
163 | + } | |
164 | + /// <summary> | |
152 | 165 | /// 登録済み物理エンジンのアップデート |
153 | 166 | /// </summary> |
154 | 167 | /// <param name="timeStep">GameTimeオブジェクト</param> |
@@ -34,7 +34,7 @@ | ||
34 | 34 | |
35 | 35 | public void Start() |
36 | 36 | { |
37 | - if (!timer.IsRunning) | |
37 | + if (timer.IsRunning) | |
38 | 38 | return; |
39 | 39 | timer.Start(); |
40 | 40 | beforeMS = (decimal)timer.Elapsed.TotalMilliseconds - LossTime; |
@@ -72,7 +72,7 @@ | ||
72 | 72 | //モーションデータを計算 |
73 | 73 | motion.GetCameraData(NowFrame, out Length, out Locate, out Rotate, out ViewAngle); |
74 | 74 | //カメラ位置を計算 |
75 | - Vector3 CameraPos = new Vector3(0, 0, 1) * Length; | |
75 | + Vector3 CameraPos = new Vector3(0, 0, -1) * Length; | |
76 | 76 | CameraPos = Vector3.Transform(CameraPos, Rotate) + Locate; |
77 | 77 | mmdCamera.CameraPos = CameraPos; |
78 | 78 | //ターゲット位置を計算 |
@@ -61,6 +61,7 @@ | ||
61 | 61 | { |
62 | 62 | //オブジェクトプールのモーショントラックにデータをセット |
63 | 63 | mmdMotion[index].Reset(); |
64 | + motion.ToCameraUse = true; | |
64 | 65 | mmdMotion[index].motion = motion; |
65 | 66 | mmdMotion[index].IsEmpty = false; |
66 | 67 | mmdMotion[index] = mmdMotion[index];//オブジェクトプールから引っ張ってくる |
@@ -15,18 +15,14 @@ | ||
15 | 15 | //内部データ |
16 | 16 | internal MMDMotionData MotionData { get; private set; } |
17 | 17 | internal MikuMikuDanceXNA mmdXNA { get; private set; } |
18 | + internal bool ToCameraUse = true; | |
19 | + internal long MaxFrame { get { return ToCameraUse ? MotionData.CameraMotions.Last().FrameNo : MotionData.LightMotions.Last().FrameNo; } } | |
18 | 20 | |
19 | - internal long MaxFrame { get; set; } | |
20 | - | |
21 | 21 | internal MMDStageMotion() { }//外から作らせない |
22 | - internal void Initialize(MMDMotionData motionData, MikuMikuDanceXNA mmdxna, bool ToCameraUse) | |
22 | + internal void Initialize(MMDMotionData motionData, MikuMikuDanceXNA mmdxna) | |
23 | 23 | { |
24 | 24 | MotionData = motionData; |
25 | 25 | mmdXNA = mmdxna; |
26 | - if (ToCameraUse) | |
27 | - MaxFrame = motionData.CameraMotions.Last().FrameNo; | |
28 | - else | |
29 | - MaxFrame = motionData.LightMotions.Last().FrameNo; | |
30 | 26 | } |
31 | 27 | internal void GetCameraData(decimal NowFrame, out float Length, out Vector3 Locate, out Quaternion Rotate, out float ViewAngle) |
32 | 28 | { |