OSDN Git Service

ローカルスキーマ参照処理の共通化
[mikutoga/TogaGem.git] / src / main / java / jp / sourceforge / mikutoga / vmd / parser / VmdCameraHandler.java
1 /*
2  * VMD camerawork handler
3  *
4  * License : The MIT License
5  * Copyright(c) 2011 MikuToga Partners
6  */
7
8 package jp.sourceforge.mikutoga.vmd.parser;
9
10 import jp.sfjp.mikutoga.bin.parser.LoopHandler;
11 import jp.sfjp.mikutoga.bin.parser.MmdFormatException;
12 import jp.sfjp.mikutoga.bin.parser.ParseStage;
13
14 /**
15  * VMDモーションファイルのカメラワーク情報の通知用ハンドラ。
16  * <p>フレーム番号は相対的なものとなる。
17  * カメラ・照明・シャドウのうち
18  * 一番若いモーションのフレーム番号が0となる模様。
19  * <p>ターゲット位置、カメラ回転量とも、座標基準はワールド座標。
20  * <p>カメラターゲットの座標は左手系で表される。
21  * <p>ターゲットに対するカメラ位置は極座標で表される。
22  * <p>補間情報は直前カメラ情報との差分に関するもの。
23  */
24 public interface VmdCameraHandler extends LoopHandler {
25
26     /** カメラデータ抽出ループ識別子。 */
27     ParseStage CAMERA_LIST = new ParseStage();
28
29
30     /**
31      * カメラモーションのキーフレーム番号に関する情報を通知する。
32      * <p>{@link #CAMERA_LIST}ループの構成要素。
33      * @param keyFrameNo キーフレーム番号
34      * @throws MmdFormatException 不正フォーマットによる
35      * パース処理の中断をパーサに指示
36      */
37     void vmdCameraMotion(int keyFrameNo)
38             throws MmdFormatException;
39
40     /**
41      * ターゲットとカメラ間の距離情報を通知する。
42      * <p>球座標(極座標)の動径に相当する。
43      * 通常はターゲットより手前に位置するカメラまでの距離が負の値で渡される。
44      * <p>カメラ位置がターゲットを突き抜けた場合は正の値もとりうる。
45      * ※MMDのUIと符号が逆なので注意。
46      * <p>{@link #CAMERA_LIST}ループの構成要素。
47      * @param range 距離
48      * @throws MmdFormatException 不正フォーマットによる
49      * パース処理の中断をパーサに指示
50      */
51     void vmdCameraRange(float range)
52             throws MmdFormatException;
53
54     /**
55      * カメラのターゲット位置情報を通知する。
56      * <p>{@link #CAMERA_LIST}ループの構成要素。
57      * @param xPos ターゲットのX座標
58      * @param yPos ターゲットのY座標
59      * @param zPos ターゲットのZ座標
60      * @throws MmdFormatException 不正フォーマットによる
61      * パース処理の中断をパーサに指示
62      */
63     void vmdCameraPosition(float xPos, float yPos, float zPos)
64             throws MmdFormatException;
65
66     /**
67      * カメラの回転および回転量情報を通知する。
68      * <p>極座標(球座標)が用いられる。
69      * <p>180度を超える値も回転量として意味を持つ。
70      * <p>{@link #CAMERA_LIST}ループの構成要素。
71      * @param latitude ターゲットから見たカメラの仰俯角(≒緯度)。
72      * 単位はラジアン。
73      * <p>Y軸回転量が0の時のZ正軸がY正軸へ倒れる方向が正回転。
74      * (MMDのUIとは符号が逆になるので注意)
75      * <p>仰俯角が0の場合、
76      * カメラはターゲットに対しXZ平面(水平)と平行な箇所に位置する。
77      * @param longitude Y軸周りの回転量(≒経度)。単位はラジアン。
78      * <p>X正軸がZ正軸へ倒れる方向が正回転。(ボーン回転と逆)
79      * <p>仰俯角およびY軸回転量が0の場合、
80      * カメラレンズはZ軸-∞方向からZ軸+∞方向を向く。
81      * @param roll レンズをターゲットを向けたカメラのロール回転量。
82      * <p>仰俯角とY軸回転量が0の時にY正軸がX正軸に倒れる方向が正回転。
83      * <p>仰俯角およびロール回転量が0の場合、カメラ上部はY軸+∞の方を向く。
84      * @throws MmdFormatException 不正フォーマットによる
85      * パース処理の中断をパーサに指示
86      */
87     void vmdCameraRotation(float latitude, float longitude, float roll)
88             throws MmdFormatException;
89
90     /**
91      * カメラを通じたスクリーン座標への投影に関する情報を通知する。
92      * <p>{@link #CAMERA_LIST}ループの構成要素。
93      * @param angle 縦画角。単位は度数法。MMDのUIでは1から125が指定可能。
94      * @param hasPerspective パースペクティブスイッチがONならtrue。
95      * スイッチがOFFの場合、画角は無視され遠近感処理が行われなくなる。
96      * (平行投影?)
97      * @throws MmdFormatException 不正フォーマットによる
98      * パース処理の中断をパーサに指示
99      */
100     void vmdCameraProjection(int angle, boolean hasPerspective)
101             throws MmdFormatException;
102
103     /**
104      * カメラターゲットX軸移動補間情報の通知を受け取る。
105      * 三次ベジェ曲線のP1,P2点に関する情報を受け取る。
106      * <p>{@link #CAMERA_LIST}ループの構成要素。
107      * @param p1x P1点のX座標
108      * @param p1y P1点のY座標
109      * @param p2x P2点のX座標
110      * @param p2y P2点のY座標
111      * @throws MmdFormatException 不正フォーマットによる
112      * パース処理の中断をパーサに指示
113      */
114     void vmdCameraIntpltXpos(byte p1x, byte p1y, byte p2x, byte p2y)
115             throws MmdFormatException;
116
117     /**
118      * カメラターゲットY軸移動補間情報の通知を受け取る。
119      * 三次ベジェ曲線のP1,P2点に関する情報を受け取る。
120      * <p>{@link #CAMERA_LIST}ループの構成要素。
121      * @param p1x P1点のX座標
122      * @param p1y P1点のY座標
123      * @param p2x P2点のX座標
124      * @param p2y P2点のY座標
125      * @throws MmdFormatException 不正フォーマットによる
126      * パース処理の中断をパーサに指示
127      */
128     void vmdCameraIntpltYpos(byte p1x, byte p1y, byte p2x, byte p2y)
129             throws MmdFormatException;
130
131     /**
132      * カメラターゲットZ軸移動補間情報の通知を受け取る。
133      * 三次ベジェ曲線のP1,P2点に関する情報を受け取る。
134      * <p>{@link #CAMERA_LIST}ループの構成要素。
135      * @param p1x P1点のX座標
136      * @param p1y P1点のY座標
137      * @param p2x P2点のX座標
138      * @param p2y P2点のY座標
139      * @throws MmdFormatException 不正フォーマットによる
140      * パース処理の中断をパーサに指示
141      */
142     void vmdCameraIntpltZpos(byte p1x, byte p1y, byte p2x, byte p2y)
143             throws MmdFormatException;
144
145     /**
146      * カメラ回転量補間情報の通知を受け取る。
147      * 三次ベジェ曲線のP1,P2点に関する情報を受け取る。
148      * <p>{@link #CAMERA_LIST}ループの構成要素。
149      * <p>カメラ回転でクォータニオン補間は使われない。
150      * @param p1x P1点のX座標
151      * @param p1y P1点のY座標
152      * @param p2x P2点のX座標
153      * @param p2y P2点のY座標
154      * @throws MmdFormatException 不正フォーマットによる
155      * パース処理の中断をパーサに指示
156      */
157     void vmdCameraIntpltRotation(byte p1x, byte p1y, byte p2x, byte p2y)
158             throws MmdFormatException;
159
160     /**
161      * カメラ-ターゲット間距離補間情報の通知を受け取る。
162      * 三次ベジェ曲線のP1,P2点に関する情報を受け取る。
163      * <p>{@link #CAMERA_LIST}ループの構成要素。
164      * @param p1x P1点のX座標
165      * @param p1y P1点のY座標
166      * @param p2x P2点のX座標
167      * @param p2y P2点のY座標
168      * @throws MmdFormatException 不正フォーマットによる
169      * パース処理の中断をパーサに指示
170      */
171     void vmdCameraIntpltRange(byte p1x, byte p1y, byte p2x, byte p2y)
172             throws MmdFormatException;
173
174     /**
175      * スクリーン投影補間情報の通知を受け取る。
176      * 三次ベジェ曲線のP1,P2点に関する情報を受け取る。
177      * <p>{@link #CAMERA_LIST}ループの構成要素。
178      * @param p1x P1点のX座標
179      * @param p1y P1点のY座標
180      * @param p2x P2点のX座標
181      * @param p2y P2点のY座標
182      * @throws MmdFormatException 不正フォーマットによる
183      * パース処理の中断をパーサに指示
184      */
185     void vmdCameraIntpltProjection(byte p1x, byte p1y, byte p2x, byte p2y)
186             throws MmdFormatException;
187
188 }