前回はスキンメッシュの描画を確認しました。
今回はその基点となるボーンを物理オブジェクトに置き換えて
スキンメッシュアニメーションを確認します。
色々いじっていたら、出来たようです。
以下、詳しく解説していきます。
前回の時点で正しい位置にボーンを配置できていました。
この配置情報を頼りに、ボーンオブジェクトを作成します。
剛体なのですが、シェイプの作り方につまづきました。
シェイプは必ず重心が原点に来ます。
ただし、ボーンは原点から +Z 方向に長さ 1 のオブジェクトです。
本来の中心は 0, 0, 0.5 なのでオフセットとしてずらす必要があります。
ずらした先にシェイプを置く場合は CompoundShape を使うと解決できると思ったのですが
CompoundShape を使うと重心が原点になっているため、演算させた時の挙動がおかしくなります。
Inatia の計算ではシェイプの中央に重心を置いてくれないようです。
principal なんたらとか使って重心位置をずらせるらしいのですが、手元では確認できず
仕方なくやはりオフセット行列を用いて解決しました。
あとはボーンの長さ分オブジェクトを作ると連結部でぶつかるので、長さを調整します。
衝突形状にしないでセンサオブジェクトにして置くと良い感じでしょうか。
現在はこのようなスキンメッシュオブジェクトを読み込むと
このようにボーンと連結部に ConeTwist コンストレイントを設置する動作をします。
Kimberlite ファイルとして保存し、復元できるかチェックします。
復元こそできるものの、結合が解けていてボーンがバラバラになってしまいました。
なんででしょう?
簡単に調べてみたところ、ConeTwist コンストレイントを作成した後
プロパティを設定している箇所を通ると再現するようです。
なるほど Relaxation を 0 に設定していたからでした。ディフォルト値の 1 に設定することで解決。
おおむねバグ修正が出来たので、テスト用に手のモデルを作成したいと思います。
モデル作成について、まだ機能が足りていないので次の機能を追加します。
・オブジェクトの追加機能
・オブジェクトとオブジェクトの固定アタッチ(親子関係を結ぶ)機能
・選択オブジェクト、コンストレイントの削除機能
・選択オブジェクトのシェイプタイプ切り替え機能(Box→Shpere)など
・選択コンストレイントのタイプ切り替え機能
コンテキストメニューから追加できるようにします。
3Dカーソル位置にスケール1で指定シェイプオブジェクトを作成するコマンドを作ります。
特につまづくことなく実装完了、動作も確認できました。
アンドゥ・リドゥも機能します。
重心が気になるところだが、ここは簡単に CompoundShape で片付けようと思う。
親オブジェクトのシェイプ、子オブジェクトのシェイプを取り出し、親の子どもとして
現在の位置関係からオフセット姿勢行列を計算し、子シェイプとして追加
親オブジェクトのシェイプを交換して、子オブジェクトを削除する。
でやってみる。
できました。
アンドゥ・リドゥできることも確認。
実装は簡単、動作を確認。
アンドゥ・リドゥできることを確認。
対応、動作を確認。
アンドゥ・リドゥできることを確認。
どうやるのでしょう?
今のコンストレイントからオフセットフレームを取り出して、次のコンストレイントを作って
そのオフセットフレームで再配置することで解決できました。
タイプ切り替えもアンドゥ、リドゥできることを確認しました。
さて、ひと通り機能がそろったところで、さっそくモデル作成をしてみたいと思います。
来年は巳年ですし、ヘビのオモチャを作ってみました。
ヒンジコンストレイントを使っているので、尻尾を掴んで動かせば実際遊べます。
おおむね必要な設定コマンドは用意しました、続いて手のモデル作成と
指を含めた手の姿勢推定を行なってみたいと思います。
お楽しみに!
半年以上続けてきた Kimberlite 開発記録も今回で最終話です。
最期に竹ヘビのオモチャを完成させて締めくくります。
テクスチャをテキトーに貼り竹っぽさを出しました。
Blender 上で目と舌を付けて
竹ヘビの完成です。
(今年の年賀状イラストにする予定)
2012/12/10 初記。
2012/12/15 更新。