PMDViewerのライブラリ開発に関する個人的メモ

モーションコントローラにBetweenAS3を利用しつつ、表情だけのモーションと体の動きだけのモーションを合成したモーションを作るうまい実装方法はないか考え中。
0
b2ox @b2ox

BetweenAS3を使ったモーションの連結とかはもうちょっと色々調整の必要がありそうだなぁ。

2010-01-24 03:11:46
b2ox @b2ox

MikuMikuDanceクラスは3Dモデルそのものにポーズ変形のコントローラ1個と複数個のモーションコントローラが登録されている。

2010-01-24 03:16:48
b2ox @b2ox

モーションコントローラは時間軸で制御されてて、再生状態では各時刻ごとにポーズパラメータを取り出し、ポーズコントローラに渡す。 ポーズコントローラは渡されたパラメータに従ってモデルの頂点を更新する。

2010-01-24 03:19:44
b2ox @b2ox

モーションコントローラの時間軸制御はBetweenAS3でTweenを作って時刻ごとのフレーム番号を得るようになっているが、モーションコントローラ自体はTweenではない。

2010-01-24 03:23:07
b2ox @b2ox

モーションコントローラ自体をITweenにするべきかどうか。更にMikuMikuDanceクラスもITweenにすべきかどうか。

2010-01-24 03:25:24
b2ox @b2ox

モーションコントローラはvmd読み込み時にキーフレームのパラメータから補間フレームのパラメータを計算して格納し、それ以降パラメータはリードオンリー。

2010-01-24 03:31:56
b2ox @b2ox

モーションコントローラは並行して作用させることを考慮されていない。例えば表情変化だけのモーションと表情は動かさずに体を動かすだけのモーションを同時に適用するということはありそうだけど今は動作保証外。

2010-01-24 03:41:38
b2ox @b2ox

時刻tでの動作の大雑把な説明としてはposePrams = Motion.getParams(t)で時刻tのポーズパラメータ取得、Pose.setParams(poseParams)でパラメータをポーズコントローラにセット、Pose.applyTp(Model)でポーズ適用。

2010-01-24 03:49:37
b2ox @b2ox

複数のモーションを混ぜるならPose.setParams(Motion[i].getParams(t))のあとにPose.applyTo(Model)すれば一応なんとかなりそう。

2010-01-24 03:53:09
b2ox @b2ox

今のモーションTweenはPose.applyTo(Model)も含んでるから複数適用は拙い。

2010-01-24 03:59:41
b2ox @b2ox

VMDControllerの構成をどうするか悩み中。

2010-01-24 13:36:57
b2ox @b2ox

BetweenAS3で自前のTweenクラスを作りたいときはAbstractTweenを継承してinternalUpdateをoverrideすればよいのかな?

2010-01-24 15:30:48
b2ox @b2ox

tickerはBetweenAS3.asの_tickerが欲しいけどprivateで取れないからnew EnterFrameTickerで作る感じか?

2010-01-24 15:37:49
b2ox @b2ox

BetweenAS3.tweenで生成されるのはObjectTweenでObjectTweenはAbstractTweenの派生だからtickerがとれるか。

2010-01-24 16:07:27
b2ox @b2ox

ParallelTween.as見て思いついた。ポーズをリセットし続けるtween、VMDのモーションパラメータをセットするtween1、同tween2、…、ポーズを適用し続けるtweenの順番でParallelTweenを作れば目的の処理ができそう。

2010-01-25 01:11:05
b2ox @b2ox

Tweenを合成した自作のTweenクラスを作るときはAbstractTweenとIITweenが重要っぽい。

2010-01-25 01:13:50
b2ox @b2ox

今はVMDControllerにもplay, stopを付けてるけどVMDControllerはモーション変更のデータコンテナというかビデオテープみたいな扱いにしてplay, stopはMikuMikuDanceクラスの方だけに付けるようにしたほうが良さそう。

2010-01-25 12:42:58
b2ox @b2ox

ちなみに、ビデオテープという表現にしたのは再生終了位置を記録しているという意味と、MikuMikuDanceクラスが再生機でそれに入れないと再生できない扱いにするという意味を込めてる。

2010-01-25 12:46:17
b2ox @b2ox

internal = BetweenAS3.tween(this, {frameNo:~},...);で一旦フレームベースのアニメを行う内部tweenを作って、

2010-01-25 12:51:42
b2ox @b2ox

AbstractTweenの派生でinternalUpdateで実行する関数を設定できるFuncTweenってのを作って tween = new FuncTween((internal as IITween).ticker, 0, internal.duration)

2010-01-25 12:53:10
b2ox @b2ox

tween.updateFunc = function (t:Number):void{resetParams();(internal as IITween).update(t);applyPose();} とすることでとりあえずもとの奴とほぼ同じ動作になった。

2010-01-25 12:55:12
b2ox @b2ox

あとはupdateFuncに複数のinternalTweenを入れてやれば目的のモーション合成ができる。

2010-01-25 12:57:00