4 * License : The MIT License
5 * Copyright(c) 2011 MikuToga Partners
8 package jp.sourceforge.mikutoga.vmd.parser;
10 import jp.sourceforge.mikutoga.parser.LoopHandler;
11 import jp.sourceforge.mikutoga.parser.MmdFormatException;
12 import jp.sourceforge.mikutoga.parser.ParseStage;
15 * VMDモーションファイルの基本情報(ボーンモーション/モーフモーション)
17 * <p>フレーム番号は相対的なものとなる。
18 * 一番若いモーションのフレーム番号が0となる模様。
19 * <p>位置情報の座標基準は左手系ワールド座標で表される。
20 * <p>モーション補間情報は三次ベジェ曲線により記述される。
21 * 三次ベジェ曲線は4つの制御点P0,P1,P2,P3により定義される。
22 * P0は(0,0)、P3は(127,127)で固定。
23 * P1,P2はP0,P3を対角線とする正方形の内部になければならない。
24 * 直線補間の場合、P1には(20,20)、P2には(107,107)が使われることが多い。
25 * <p>補間情報は直後のボーンモーション情報との差分に関するもの。
27 public interface VmdBasicHandler extends LoopHandler {
29 /** ボーンモーション抽出ループ識別子。 */
30 ParseStage BONEMOTION_LIST = new ParseStage();
33 ParseStage MORPH_LIST = new ParseStage();
37 * VMDファイルのパース処理開始の通知を受け取る。
38 * @throws MmdFormatException 不正フォーマットによる
42 throws MmdFormatException;
45 * VMDファイルのパース処理終了の通知を受け取る。
46 * @param hasMoreData 入力ソースに
47 * まだ読み込まれていないデータがあればtrue
48 * @throws MmdFormatException 不正フォーマットによる
51 void vmdParseEnd(boolean hasMoreData)
52 throws MmdFormatException;
55 * VMDファイルの固定長ヘッダを通知する。
57 * @throws MmdFormatException 不正フォーマットによる
60 void vmdHeaderInfo(byte[] header)
61 throws MmdFormatException;
65 * モーションの適用先モデル名に関する情報を通知する。
66 * <p>カメラやライティングなどの演出データには
68 * @param modelName モデル名
69 * @throws MmdFormatException 不正フォーマットによる
72 void vmdModelName(String modelName)
73 throws MmdFormatException;
76 * ボーンモーションのボーン名及びキーフレーム番号に関する情報を通知する。
77 * <p>{@link #BONEMOTION_LIST}ループの構成要素。
78 * @param boneName ボーン名
79 * @param keyFrameNo キーフレーム番号
80 * @throws MmdFormatException 不正フォーマットによる
83 void vmdBoneMotion(String boneName, int keyFrameNo)
84 throws MmdFormatException;
87 * ボーン移動モーション情報の通知を受け取る。
88 * <p>座標基準は親ボーンもしくはワールド座標。
89 * <p>{@link #BONEMOTION_LIST}ループの構成要素。
93 * @throws MmdFormatException 不正フォーマットによる
96 void vmdBonePosition(float xPos, float yPos, float zPos)
97 throws MmdFormatException;
100 * ボーン回転モーション情報の通知を受け取る。
101 * <p>回転及び姿勢はクォータニオンによって記述される。
102 * MMDUI上のボーン数値入力YXZオイラー角と等価な回転。
103 * <p>座標基準は親ボーンもしくはワールド座標。
104 * <p>※ボーン種別によっては、無意味な情報。
105 * <p>{@link #BONEMOTION_LIST}ループの構成要素。
106 * @param qx クォータニオン虚部 X
107 * @param qy クォータニオン虚部 Y
108 * @param qz クォータニオン虚部 Z
109 * @param qw クォータニオン実部 W
110 * @throws MmdFormatException 不正フォーマットによる
113 void vmdBoneRotationQt(float qx, float qy, float qz, float qw)
114 throws MmdFormatException;
117 * ボーンモーションX軸移動補間情報の通知を受け取る。
118 * <p>三次ベジェ曲線のP1,P2点に関する情報を受け取る。
119 * <p>{@link #BONEMOTION_LIST}ループの構成要素。
120 * @param xP1x P1点のX座標
121 * @param xP1y P1点のY座標
122 * @param xP2x P2点のX座標
123 * @param xP2y P2点のY座標
124 * @throws MmdFormatException 不正フォーマットによる
127 void vmdBoneIntpltXpos(byte xP1x, byte xP1y, byte xP2x, byte xP2y)
128 throws MmdFormatException;
131 * ボーンモーションY軸移動補間情報の通知を受け取る。
132 * <p>三次ベジェ曲線のP1,P2点に関する情報を受け取る。
133 * <p>{@link #BONEMOTION_LIST}ループの構成要素。
134 * @param yP1x P1点のX座標
135 * @param yP1y P1点のY座標
136 * @param yP2x P2点のX座標
137 * @param yP2y P2点のY座標
138 * @throws MmdFormatException 不正フォーマットによる
141 void vmdBoneIntpltYpos(byte yP1x, byte yP1y, byte yP2x, byte yP2y)
142 throws MmdFormatException;
145 * ボーンモーションZ軸移動補間情報の通知を受け取る。
146 * <p>三次ベジェ曲線のP1,P2点に関する情報を受け取る。
147 * <p>{@link #BONEMOTION_LIST}ループの構成要素。
148 * @param zP1x P1点のX座標
149 * @param zP1y P1点のY座標
150 * @param zP2x P2点のX座標
151 * @param zP2y P2点のY座標
152 * @throws MmdFormatException 不正フォーマットによる
155 void vmdBoneIntpltZpos(byte zP1x, byte zP1y, byte zP2x, byte zP2y)
156 throws MmdFormatException;
159 * ボーンモーション回転量補間情報の通知を受け取る。
160 * <p>三次ベジェ曲線のP1,P2点に関する情報を受け取る。
161 * <p>{@link #BONEMOTION_LIST}ループの構成要素。
162 * <p>クォータニオン間のslerp処理に利用される。
163 * @param rP1x P1点のX座標
164 * @param rP1y P1点のY座標
165 * @param rP2x P2点のX座標
166 * @param rP2y P2点のY座標
167 * @throws MmdFormatException 不正フォーマットによる
170 void vmdBoneIntpltRot(byte rP1x, byte rP1y, byte rP2x, byte rP2y)
171 throws MmdFormatException;
175 * モーフモーション情報の通知を受け取る。
176 * <p>{@link #MORPH_LIST}ループの構成要素。
177 * @param morphName モーフ名。特殊モーフ名「base」は無視してもよい?
178 * @param keyFrameNo フレーム番号
179 * @param flex モーフ変量。通常は0.0以上1.0以下。
180 * @throws MmdFormatException 不正フォーマットによる
183 void vmdMorphMotion(String morphName, int keyFrameNo, float flex)
184 throws MmdFormatException;