前回の続きです。
次は頂点モーフによる表情アニメでもやろうとかと思ったのですが、
BoneによるSkinningと頂点モーフが
現状のthree.jsでは共存できないことが分かりました。
シェーダー関連をいじってどうにかしないといけない感じです。
なんか手間ヒマ掛かりそうなので、IKを先にやってみることにしました。
基本的にはBoneのマトリクス操作だけで済むはずですので、
three.jsに対する追加や修正はそんなに大きくならないと思われます。
ときに、
IKとは Inverse Kinematics、逆運動学とか言うそうです。
前回やったBoneによるSkinningは、言わばFK。
Forward Kinematics、順運動学とか言うっぽいようです。
IKという言葉とか、それがどういうモノなのか、
というのはそれなりに知ってはいましたが、
実際にやってみるのは初めてだったりします。
さて、まずは
MMDなファイル内のIK情報を変換してJSONへ追加する作業を行いました。
three.jsオリジナルのJSONLoaderでは、
MMDなIK情報は当然サポートしてないのでLoaderも独自に作りました。
といっても、中身はJSONLoaderとほぼ同じだったりしますが。
つづいて、
IKはどうやってプログラムすればいいのかググって情報収集しました。
そしたら既にWebGLでMMDをやられている方を発見しました!
しかもイチからスクラッチで作ってしまったようです。凄いっす!!
ソースも公開されているので参考になりますね。
アルゴリズム的にはこちらがとても参考になります。
サンプルプログラムが公開されているのもありがたい。
手法としてはCCD-IKとかParticle-IKとかがあるようです。
MMDのIK情報には演算の繰り返し数というのがあるので、
CCD-IKを採用すれば良さそうです。
それからソースコード的にはこちらやこちらの第8回が参考になります。
ということでIKやってみました。結果はこれです。
なお、スポットライトはミクさんを追いかけるようにしてあります。
とりあえず、だいぶそれっぽく踊ってくれるようになりました(^_^)
でも、まだ十分にうまく行ってない感があります。
特に足もとが床にめり込んでしまうのが気になりますね。
IKターゲットを追いかければ、
本来はそういうことにはならないはずだと思うのですが・・・。
床にめり込まないようにするのは、
別途処置が必要なのかもしれません。とりあえず保留としておきます。
あと、
IK解決はそれなりに計算量が多いようです。
ブラウザでプロファイルをとってみると処理時間は多めなようです。
ベクトルや行列演算などを繰り返すので、しょうがない感じではあるのですが
差がある一定以内になったら計算を打ち切る等の
対策をやった方がいいかもしれませんね。
あるいは、Workerスレッドを使って並列にやらせる手もありそうですが、
どこかで同期を取る必要があるので手間かかるかもしれないですね。
次回は表情モーフに挑戦する予定です。
ついにシェーダー周りをいじくることになりそうです(^_^;)