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モーションファイルの基本情報(ボーンモーション/モーフモーション)
18 * <p>フレーム番号は相対的なものとなる。
19 * 一番若いモーションのフレーム番号が0となる模様。
21 * <p>位置情報の座標基準は左手系ワールド座標で表される。
23 * <p>モーション補間情報は三次ベジェ曲線により記述される。
24 * 三次ベジェ曲線は4つの制御点P0,P1,P2,P3により定義される。
25 * P0は(0,0)、P3は(127,127)で固定。
26 * P1,P2はP0,P3を対角線とする正方形の内部になければならない。
27 * 直線補間の場合、P1には(20,20)、P2には(107,107)が使われることが多い。
29 * <p>補間情報は直後のボーンモーション情報との差分に関するもの。
31 public interface VmdBasicHandler extends LoopHandler {
33 /** ボーンモーション抽出ループ識別子。 */
34 ParseStage BONEMOTION_LIST = new ParseStage();
37 ParseStage MORPH_LIST = new ParseStage();
41 * VMDファイルのパース処理開始の通知を受け取る。
42 * @throws MmdFormatException 不正フォーマットによる
46 throws MmdFormatException;
49 * VMDファイルのパース処理終了の通知を受け取る。
50 * @param hasMoreData 入力ソースに
51 * まだ読み込まれていないデータがあればtrue
52 * @throws MmdFormatException 不正フォーマットによる
55 void vmdParseEnd(boolean hasMoreData)
56 throws MmdFormatException;
59 * VMDファイルの固定長ヘッダを通知する。
61 * @throws MmdFormatException 不正フォーマットによる
64 void vmdHeaderInfo(byte[] header)
65 throws MmdFormatException;
69 * モーションの適用先モデル名に関する情報を通知する。
71 * <p>カメラやライティングなどの演出データには
74 * @param modelName モデル名
75 * @throws MmdFormatException 不正フォーマットによる
78 void vmdModelName(String modelName)
79 throws MmdFormatException;
82 * ボーンモーションのボーン名及びキーフレーム番号に関する情報を通知する。
84 * <p>{@link #BONEMOTION_LIST}ループの構成要素。
86 * @param boneName ボーン名
87 * @param keyFrameNo キーフレーム番号
88 * @throws MmdFormatException 不正フォーマットによる
91 void vmdBoneMotion(String boneName, int keyFrameNo)
92 throws MmdFormatException;
95 * ボーン移動モーション情報の通知を受け取る。
97 * <p>座標基準は親ボーンもしくはワールド座標。
99 * <p>{@link #BONEMOTION_LIST}ループの構成要素。
104 * @throws MmdFormatException 不正フォーマットによる
107 void vmdBonePosition(float xPos, float yPos, float zPos)
108 throws MmdFormatException;
111 * ボーン回転モーション情報の通知を受け取る。
113 * <p>回転及び姿勢はクォータニオンによって記述される。
114 * MMDUI上のボーン数値入力YXZオイラー角と等価な回転。
116 * <p>座標基準は親ボーンもしくはワールド座標。
118 * <p>※ボーン種別によっては、無意味な情報。
120 * <p>{@link #BONEMOTION_LIST}ループの構成要素。
122 * @param qx クォータニオン虚部 X
123 * @param qy クォータニオン虚部 Y
124 * @param qz クォータニオン虚部 Z
125 * @param qw クォータニオン実部 W
126 * @throws MmdFormatException 不正フォーマットによる
129 void vmdBoneRotationQt(float qx, float qy, float qz, float qw)
130 throws MmdFormatException;
133 * ボーンモーションX軸移動補間情報の通知を受け取る。
135 * <p>三次ベジェ曲線のP1,P2点に関する情報を受け取る。
137 * <p>{@link #BONEMOTION_LIST}ループの構成要素。
139 * @param xP1x P1点のX座標
140 * @param xP1y P1点のY座標
141 * @param xP2x P2点のX座標
142 * @param xP2y P2点のY座標
143 * @throws MmdFormatException 不正フォーマットによる
146 void vmdBoneIntpltXpos(byte xP1x, byte xP1y, byte xP2x, byte xP2y)
147 throws MmdFormatException;
150 * ボーンモーションY軸移動補間情報の通知を受け取る。
152 * <p>三次ベジェ曲線のP1,P2点に関する情報を受け取る。
154 * <p>{@link #BONEMOTION_LIST}ループの構成要素。
156 * @param yP1x P1点のX座標
157 * @param yP1y P1点のY座標
158 * @param yP2x P2点のX座標
159 * @param yP2y P2点のY座標
160 * @throws MmdFormatException 不正フォーマットによる
163 void vmdBoneIntpltYpos(byte yP1x, byte yP1y, byte yP2x, byte yP2y)
164 throws MmdFormatException;
167 * ボーンモーションZ軸移動補間情報の通知を受け取る。
169 * <p>三次ベジェ曲線のP1,P2点に関する情報を受け取る。
171 * <p>{@link #BONEMOTION_LIST}ループの構成要素。
173 * @param zP1x P1点のX座標
174 * @param zP1y P1点のY座標
175 * @param zP2x P2点のX座標
176 * @param zP2y P2点のY座標
177 * @throws MmdFormatException 不正フォーマットによる
180 void vmdBoneIntpltZpos(byte zP1x, byte zP1y, byte zP2x, byte zP2y)
181 throws MmdFormatException;
184 * ボーンモーション回転量補間情報の通知を受け取る。
186 * <p>三次ベジェ曲線のP1,P2点に関する情報を受け取る。
188 * <p>{@link #BONEMOTION_LIST}ループの構成要素。
190 * <p>クォータニオン間のslerp処理に利用される。
192 * @param rP1x P1点のX座標
193 * @param rP1y P1点のY座標
194 * @param rP2x P2点のX座標
195 * @param rP2y P2点のY座標
196 * @throws MmdFormatException 不正フォーマットによる
199 void vmdBoneIntpltRot(byte rP1x, byte rP1y, byte rP2x, byte rP2y)
200 throws MmdFormatException;
204 * モーフモーション情報の通知を受け取る。
206 * <p>{@link #MORPH_LIST}ループの構成要素。
208 * @param morphName モーフ名。特殊モーフ名「base」は無視してもよい?
209 * @param keyFrameNo フレーム番号
210 * @param flex モーフ変量。通常は0.0以上1.0以下。
211 * @throws MmdFormatException 不正フォーマットによる
214 void vmdMorphMotion(String morphName, int keyFrameNo, float flex)
215 throws MmdFormatException;