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 public static final ParseStage BONEMOTION_LIST = new ParseStage();
37 public static final ParseStage MORPH_LIST = new ParseStage();
41 * VMDファイルのパース処理開始の通知を受け取る。
42 * @throws MmdFormatException
43 * 不正フォーマットによるパース処理の中断をパーサに指示
45 public abstract void vmdParseStart()
46 throws MmdFormatException;
49 * VMDファイルのパース処理終了の通知を受け取る。
51 * 入力ソースにまだ読み込まれていないデータがあればtrue
52 * @throws MmdFormatException
53 * 不正フォーマットによるパース処理の中断をパーサに指示
55 public abstract void vmdParseEnd(boolean hasMoreData)
56 throws MmdFormatException;
59 * VMDファイルの固定長ヘッダを通知する。
61 * @throws MmdFormatException
62 * 不正フォーマットによるパース処理の中断をパーサに指示
64 public abstract void vmdHeaderInfo(byte[] header)
65 throws MmdFormatException;
69 * モーションの適用先モデル名に関する情報を通知する。
71 * <p>カメラやライティングなどの演出データには
74 * @param modelName モデル名
75 * @throws MmdFormatException
76 * 不正フォーマットによるパース処理の中断をパーサに指示
78 public abstract void vmdModelName(String modelName)
79 throws MmdFormatException;
82 * ボーンモーションのボーン名及びキーフレーム番号に関する情報を通知する。
84 * <p>{@link #BONEMOTION_LIST}ループの構成要素。
86 * @param boneName ボーン名
87 * @param keyFrameNo キーフレーム番号
88 * @throws MmdFormatException
89 * 不正フォーマットによるパース処理の中断をパーサに指示
91 public abstract void vmdBoneMotion(String boneName, int keyFrameNo)
92 throws MmdFormatException;
95 * ボーン移動モーション情報の通知を受け取る。
97 * <p>座標基準は親ボーンもしくはワールド座標。
99 * <p>{@link #BONEMOTION_LIST}ループの構成要素。
104 * @throws MmdFormatException
105 * 不正フォーマットによるパース処理の中断をパーサに指示
107 public abstract 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
127 * 不正フォーマットによるパース処理の中断をパーサに指示
129 public abstract void vmdBoneRotationQt(
130 float qx, float qy, float qz, float qw)
131 throws MmdFormatException;
134 * ボーンモーションX軸移動補間情報の通知を受け取る。
136 * <p>三次ベジェ曲線のP1,P2点に関する情報を受け取る。
138 * <p>{@link #BONEMOTION_LIST}ループの構成要素。
140 * @param xP1x P1点のX座標
141 * @param xP1y P1点のY座標
142 * @param xP2x P2点のX座標
143 * @param xP2y P2点のY座標
144 * @throws MmdFormatException
145 * 不正フォーマットによるパース処理の中断をパーサに指示
147 public abstract void vmdBoneIntpltXpos(
148 byte xP1x, byte xP1y, byte xP2x, byte xP2y)
149 throws MmdFormatException;
152 * ボーンモーションY軸移動補間情報の通知を受け取る。
154 * <p>三次ベジェ曲線のP1,P2点に関する情報を受け取る。
156 * <p>{@link #BONEMOTION_LIST}ループの構成要素。
158 * @param yP1x P1点のX座標
159 * @param yP1y P1点のY座標
160 * @param yP2x P2点のX座標
161 * @param yP2y P2点のY座標
162 * @throws MmdFormatException
163 * 不正フォーマットによるパース処理の中断をパーサに指示
165 public abstract void vmdBoneIntpltYpos(
166 byte yP1x, byte yP1y, byte yP2x, byte yP2y)
167 throws MmdFormatException;
170 * ボーンモーションZ軸移動補間情報の通知を受け取る。
172 * <p>三次ベジェ曲線のP1,P2点に関する情報を受け取る。
174 * <p>{@link #BONEMOTION_LIST}ループの構成要素。
176 * @param zP1x P1点のX座標
177 * @param zP1y P1点のY座標
178 * @param zP2x P2点のX座標
179 * @param zP2y P2点のY座標
180 * @throws MmdFormatException
181 * 不正フォーマットによるパース処理の中断をパーサに指示
183 public abstract void vmdBoneIntpltZpos(
184 byte zP1x, byte zP1y, byte zP2x, byte zP2y)
185 throws MmdFormatException;
188 * ボーンモーション回転量補間情報の通知を受け取る。
190 * <p>三次ベジェ曲線のP1,P2点に関する情報を受け取る。
192 * <p>{@link #BONEMOTION_LIST}ループの構成要素。
194 * <p>クォータニオン間のslerp処理に利用される。
196 * @param rP1x P1点のX座標
197 * @param rP1y P1点のY座標
198 * @param rP2x P2点のX座標
199 * @param rP2y P2点のY座標
200 * @throws MmdFormatException
201 * 不正フォーマットによるパース処理の中断をパーサに指示
203 public abstract void vmdBoneIntpltRot(
204 byte rP1x, byte rP1y, byte rP2x, byte rP2y)
205 throws MmdFormatException;
209 * モーフモーション情報の通知を受け取る。
211 * <p>{@link #MORPH_LIST}ループの構成要素。
213 * @param morphName モーフ名。特殊モーフ名「base」は無視してもよい?
214 * @param keyFrameNo フレーム番号
215 * @param flex モーフ変量。通常は0.0以上1.0以下。
216 * @throws MmdFormatException
217 * 不正フォーマットによるパース処理の中断をパーサに指示
219 public abstract void vmdMorphMotion(
220 String morphName, int keyFrameNo, float flex)
221 throws MmdFormatException;