2 * VMD camerawork handler
4 * License : The MIT License
5 * Copyright(c) 2011 MikuToga Partners
8 package jp.sfjp.mikutoga.vmd.parser;
10 import jp.sfjp.mikutoga.bin.parser.LoopHandler;
11 import jp.sfjp.mikutoga.bin.parser.MmdFormatException;
12 import jp.sfjp.mikutoga.bin.parser.ParseStage;
15 * VMDモーションファイルのカメラワーク情報の通知用ハンドラ。
17 * <p>フレーム番号は相対的なものとなる。
19 * 一番若いモーションのフレーム番号が0となる模様。
21 * <p>ターゲット位置、カメラ回転量とも、座標基準はワールド座標。
23 * <p>カメラターゲットの座標は左手系で表される。
25 * <p>ターゲットに対するカメラ位置は極座標で表される。
27 * <p>補間情報は直前カメラ情報との差分に関するもの。
29 public interface VmdCameraHandler extends LoopHandler {
31 /** カメラデータ抽出ループ識別子。 */
32 public static final ParseStage CAMERA_LIST = new ParseStage();
36 * カメラモーションのキーフレーム番号に関する情報を通知する。
38 * <p>{@link #CAMERA_LIST}ループの構成要素。
40 * @param keyFrameNo キーフレーム番号
41 * @throws MmdFormatException
42 * 不正フォーマットによるパース処理の中断をパーサに指示
44 public abstract void vmdCameraMotion(int keyFrameNo)
45 throws MmdFormatException;
48 * ターゲットとカメラ間の距離情報を通知する。
50 * <p>球座標(極座標)の動径に相当する。
51 * 通常はターゲットより手前に位置するカメラまでの距離が負の値で渡される。
53 * <p>カメラ位置がターゲットを突き抜けた場合は正の値もとりうる。
56 * <p>{@link #CAMERA_LIST}ループの構成要素。
59 * @throws MmdFormatException 不正フォーマットによる
62 public abstract void vmdCameraRange(float range)
63 throws MmdFormatException;
68 * <p>{@link #CAMERA_LIST}ループの構成要素。
70 * @param xPos ターゲットのX座標
71 * @param yPos ターゲットのY座標
72 * @param zPos ターゲットのZ座標
73 * @throws MmdFormatException 不正フォーマットによる
76 public abstract void vmdCameraPosition(float xPos, float yPos, float zPos)
77 throws MmdFormatException;
80 * カメラの回転および回転量情報を通知する。
84 * <p>180度を超える値も回転量として意味を持つ。
86 * <p>{@link #CAMERA_LIST}ループの構成要素。
88 * @param latitude ターゲットから見たカメラの仰俯角(≒緯度)。
91 * <p>Y軸回転量が0の時のZ正軸がY正軸へ倒れる方向が正回転。
92 * (MMDのUIとは符号が逆になるので注意)</p>
95 * カメラはターゲットに対しXZ平面(水平)と平行な箇所に位置する。</p>
97 * @param longitude Y軸周りの回転量(≒経度)。単位はラジアン。
99 * <p>X正軸がZ正軸へ倒れる方向が正回転。(ボーン回転と逆)</p>
101 * <p>仰俯角およびY軸回転量が0の場合、
102 * カメラレンズはZ軸-∞方向からZ軸+∞方向を向く。</p>
104 * @param roll レンズをターゲットを向けたカメラのロール回転量。
107 * Y正軸がX正軸に倒れる方向が正回転。</p>
109 * <p>仰俯角およびロール回転量が0の場合、
110 * カメラ上部はY軸+∞の方を向く。</p>
112 * @throws MmdFormatException 不正フォーマットによる
115 public abstract void vmdCameraRotation(
116 float latitude, float longitude, float roll)
117 throws MmdFormatException;
120 * カメラを通じたスクリーン座標への投影に関する情報を通知する。
122 * <p>{@link #CAMERA_LIST}ループの構成要素。
124 * @param angle 縦画角。単位は度数法。MMDのUIでは1から125が指定可能。
125 * @param hasPerspective パースペクティブスイッチがONならtrue。
126 * スイッチがOFFの場合、画角は無視され遠近感処理が行われなくなる。
128 * @throws MmdFormatException 不正フォーマットによる
131 public abstract void vmdCameraProjection(
132 int angle, boolean hasPerspective)
133 throws MmdFormatException;
136 * カメラターゲットX軸移動補間情報の通知を受け取る。
137 * 三次ベジェ曲線のP1,P2点に関する情報を受け取る。
139 * <p>{@link #CAMERA_LIST}ループの構成要素。
145 * @throws MmdFormatException 不正フォーマットによる
148 public abstract void vmdCameraIntpltXpos(
149 byte p1x, byte p1y, byte p2x, byte p2y)
150 throws MmdFormatException;
153 * カメラターゲットY軸移動補間情報の通知を受け取る。
154 * 三次ベジェ曲線のP1,P2点に関する情報を受け取る。
156 * <p>{@link #CAMERA_LIST}ループの構成要素。
162 * @throws MmdFormatException 不正フォーマットによる
165 public abstract void vmdCameraIntpltYpos(
166 byte p1x, byte p1y, byte p2x, byte p2y)
167 throws MmdFormatException;
170 * カメラターゲットZ軸移動補間情報の通知を受け取る。
171 * 三次ベジェ曲線のP1,P2点に関する情報を受け取る。
173 * <p>{@link #CAMERA_LIST}ループの構成要素。
179 * @throws MmdFormatException 不正フォーマットによる
182 public abstract void vmdCameraIntpltZpos(
183 byte p1x, byte p1y, byte p2x, byte p2y)
184 throws MmdFormatException;
187 * カメラ回転量補間情報の通知を受け取る。
188 * 三次ベジェ曲線のP1,P2点に関する情報を受け取る。
190 * <p>{@link #CAMERA_LIST}ループの構成要素。
192 * <p>カメラ回転でクォータニオン補間は使われない。
198 * @throws MmdFormatException 不正フォーマットによる
201 public abstract void vmdCameraIntpltRotation(
202 byte p1x, byte p1y, byte p2x, byte p2y)
203 throws MmdFormatException;
206 * カメラ-ターゲット間距離補間情報の通知を受け取る。
207 * 三次ベジェ曲線のP1,P2点に関する情報を受け取る。
209 * <p>{@link #CAMERA_LIST}ループの構成要素。
215 * @throws MmdFormatException 不正フォーマットによる
218 public abstract void vmdCameraIntpltRange(
219 byte p1x, byte p1y, byte p2x, byte p2y)
220 throws MmdFormatException;
223 * スクリーン投影補間情報の通知を受け取る。
224 * 三次ベジェ曲線のP1,P2点に関する情報を受け取る。
226 * <p>{@link #CAMERA_LIST}ループの構成要素。
232 * @throws MmdFormatException 不正フォーマットによる
235 public abstract void vmdCameraIntpltProjection(
236 byte p1x, byte p1y, byte p2x, byte p2y)
237 throws MmdFormatException;