はじめに言っておきます、今回はコンテンツがちょっとエッチなので注意してください。
今回はラグドールの作成を行います。
不具合?だと思いますが、関係ないオブジェクトを追加してもここまで作ってきたスキンメッシュは機能するのに
本体のアリスをColladaに含めるとスキンメッシュがただのソリッドになります。
(スキンメッシュアニメにならなくなる。)
このように、アリスの一部(パンツ)を含めるだけでも、スキンメッシュアニメに失敗します。
原因だけ求めておきます。
絞り込みで表情のモーフ情報を入れるか、入れないかで現象が発生するしないといった状態になることを確認
モーフもたくさんあるので、一つにしても同じことが起きるか確認します。
モーフ一つだけでは起きませんでした。そしてモーフを2つにすることで再現することを確認しました。
Collada の詳細を追います。
日本語がモーフ内にあると文字化けして Collada を開けません。
ここはモーフ2つとも英語表記に直して、差分を確認します。
ジオメトリノードが増えただけですね。
あとコントローラノードのモーフの情報が増減しただけでした。
そしてリネームした所、問題は再現しなくなりました。
モーフを全てリネームすると解決するのか確認します。
解決しました。
場合によっては、FBX で書き出して、これを Collada に変換すれば
データ内のリネームは不要だったかもしれませんね。
引き続き、本体のボーンの設定を続けます。
こういうことができるか気になったので調べました。
問題なく、ズレなくオブジェクトとボーンを置換できていることを確認しました。
メッシュを分割して再度編集を再開します。
まずは本体のLowBodyにボーンを配置します。
加えてその LowBody に付随して移動するオブジェクトを配置、それぞれの位置にボーンを配置します。
まだ、オブジェクトとスキンメッシュの情報を構築していないので
次に示すようなオブジェクトがはじき出されるだけです。
ひとまずスキンメッシュを設定しても問題は起きていないので、作業を続けます。
パーツごとにリネームして分割し、マテリアルを独立させました。
ここからボーンを追加していきます。
バグではないですが、意図しない問題に直面しました。
コンストレイントが安定しません。
ConeTwist コンストレイントでスカートのひらひらを表現しようとしましたが
ひらひらではなく、そこにバネでも仕込まれたような、激しい振動を始めます。
調べた感じですと、オブジェクトの薄さがかなり響いている様子。
あまり薄いオブジェクトを作らないように調整して結果を再確認しました。
また、オブジェクトの密度をすべて100倍薄めて、現実的な数字に書き換えました。
だいぶ安定してきました。(それでもまだ暴れます)
まだスカートの付け根の位置が高すぎる様子なのでもう少し低くします。
また、太ももがスカートに当たる時にスカートが広がるように調整します。
ちょっとまだ見せられない状態なので、付いて来ない上半身の方もボーンの設定をします。
毎日少しずつボーンの設定が進みます。
手だけで16個もボーンを設定しなければならず、結構大変です。
指先の関節の角度制限を少し開放すると暴れる暴れる…
ちょっとコンストレイントの値も見なおしてみます。
それらしい Damping の値を 0 から 1.5 にしてみます。
ConeTwist コンストレイントの不思議?なところはこの Damping パラメータを外から参照できないところ…
あまり効果が無い様子
ほかのパラメータもいじってみましょう。
Bias 値が Relaxation 値を上回ると激しく振動します。
Relaxation を Bias より大きくすれば安定するのですが、あまり大きな値にすると柔らかくなりすぎて
軟体動物になってしまいます。
Bias を 0.5 にして Relaxation を 1.5 くらいにして試してみます。(もともと両方1.0でした)
うーん、これでは柔らかすぎます。
Relaxation を 0.6f くらいにして、安定化のため Bias を 0.1f くらいにしてみてはどうでしょう?
まぁこんなところでしょうか。
これらのパラメータは設定出来ますが、取得ができないので困った。
別途、追加パラメータ格納場所を作り、そこに初期値を設定するようにして対応しました。
まだ、頭の部分が未設定です。
頑張ってボーンを仕込みます。
うーむ、非カリングシェーダにしたいのと、PointToPoint をエディタ内で追加した時の位置ズレをどうにかしたい。
まずは P2P コンストレイント追加コードを修正します。
またもう一つ課題が、例えば頭の中に舌や眼が埋まっている場合、これに衝突形状を付けると重なってしまう。
衝突フラグを切り替えることになるが、名前解決はどうする?
まずコンストレイントの不具合を解決しました。
また発見したことに D6 コンストレイントの全ての可動領域を0とした時
かなり強力な制約となることを確認しました。(ConeTwist の数百倍?硬い)
ちょっと固定するコンストレイントについてはこちらを利用してみたいと思います。
また、コンストレイントの初期値も統一します。
統一しました。
また発見したことに、固定する目的でコンストレイントを利用するならば Hinge の1軸を固定した方が良いです。
これ以上硬いコンストレイントはなさそうなので、対応してみます。
カリングについて調べます。
下記をレンダリングパスで
SetRasterizerState( CullingState );
とすれば OK だそうです。
動作確認できました。
両面表示したいマテリアルだけ CullMode = None; とすれば良さそうですね。
あと途中で気になったので FSAA を入れてみました。
が、結果に変化はなく、あと何か見落としていると思うのですが、探すのも本筋から外れてしまうのでモヤっとしたまま
修正を元に戻しました。
コンストレイントは D6 や Hinge を使って固定強度が増すと思われていましたが、実際使ってみると柔らかい…
硬いと感じたのはワールドに固定した時だけでした。(ぬか喜びでした)
あと Hinge を宙空に括りつける場合に意図しない姿勢になる不具合があったので調査して修正。
(けっこう難しい不具合でした。一旦コンストレイントを作り、
相手の rigidBody を引っこ抜いて、もう一回その rigidBody と結びつけるという方法で解決)
さて、関節は ConeTwist で固めていきます。
あともう一点、衝突判定をしないオブジェクトをどのようにして名前解決しましょうか?
プリフィックスはシェイプタイプに使っているので、サフィックスに衝突フラグ or 便利フラグを埋めましょう。
たとえば _NoCollision とか。
これが名前にあると、他のオブジェクトとは衝突しないことになる。
できました。
衝突しないことを確認しました。
さてさて、技術的な課題をクリアしたので、ボーンを入れていく作業を再開します。
本体の左半分の設定が完了しました。
この作業しんどい…
やっと本体のボーンを埋めました。
こちらが衝突形状を表示した状態。
こちらが衝突形状を非表示にした状態です。
まだ、体の周りのアクセサリーが外れてしまう状態なので、くっつけます。
髪飾りを付けました。
続いて、ネックアクセサリー、ホルスターと腕輪を付けます。
ひと通りのボーンの仕込みが完了しました。
下図はボーンだけの状態を示す Blender の編集画面です。
ちょうど一週間かけました。(会社に行く前の1時間、帰宅して寝るまでの2時間を使って…疲れた。)
まだまだ気になる点が多いです。
シミュレートさせてみます。
うーん、足の当たり判定がスカスカなので、足が重なったり
スカートが身体の中にめり込んだりする現象が目立ちます。
ConeTwist のオフセット値も選択し直すと元に戻るのも気になりますね。
あ、パンツがとれてしまいました。(この絵やばい…)
あと、眼を可動できるようにしてみたのですが、コンストレイントで調整するのが難しいです。(頭に固定します)
ほか、コンストレイントの IsEnable フラグが復元できていない様子、デバッグします。
せっかく関節角度などの調整を行いましたが、もう一度作り直します。
まず IsEnable フラグが復元しなかったのは単なる設定漏れでした。(修正完了)
また不具合を発見、復元した時に ConeTwist の TwistSpan, Swing1, 2 の値などが復元されません。
また、基準姿勢も保存時の状態で固定されているようです。(どういうこと?)
あー最近修正したコンストレイントの追加コマンドでユーザーデータの初期値を設定していたためでした。
ユーザーデータはコマンドで初回作成するで良いのですが、ほかのパラメータの初期化もそれに合わせて行われるとちょっと…
ひとまずコマンドを実行してから、状態を復元するように修正を入れました。
ConeTwist のオフセット値も持続するようにしました。
残りは Blender 側の設定だけですね。
Compound を駆使して、回転抑制や、当たり判定の誤差を修正してみます。
いい感じです。
今回はラグドールを作成し、そこで問題を洗い出してバグ修正を大幅に入れました。
だいぶツールが安定してきた感じです。
当たり判定とコンストレイントだけの図
スキンメッシュと一緒に描画
スキンメッシュだけ(頂点モーフは入っていませんが、初期設定で表情をつくってCollada出力はできます。)
足を組ませてみます。
先程は膝の間を抜け落ちてしまいましたが、今回は大丈夫でした。
全部物理演算するオブジェクトなので、なんていうか
ポーズを取らせるのが大変です。
さて、ポーズを取らせるのが今回の目的ではなく
ラグドールを作成して、それに関わる不具合を取り除くことだったので目的は達成されました。
今回作ったデータはいつの日か役に立つと願い、バージョン管理に入れておきます。
しかし、アリスのモデルはかわいいですね。
結構めんどくさい作業でしたが、ここまで頑張ることができました。
次回は、ラグドール作成で得たノウハウを使って手のモデル作成に入ります。
お楽しみに!
2014/09/15 初記。
2014/09/23 更新。