お久しぶりです。続きを楽しみにしていた方いましたらごめんなさい。
近況報告を下記につらつらと書いていきます。
半年ほど前に「Kimberlite 開発記録も今回で最終話」を示して Kimberlite から離れ
それからしばらくは Kinect や ARToolkit, オブジェクトの姿勢推定プログラムの作成や数学ライブラリの作成
コンピュートシェーダによる高速化や Webプログラミングの調査、実装、特許取得について調査…などしていました。
しばらくぶりに Kimberlite に機能追加しようとしたところ、今 Kimberlite で何が出来るのか忘れてしまっていました。
過去の記事を頼りに思い出してみましたが、結局のところ開発ログなのでこれだけでは不十分でして…
なので自分で作ったツールの使い方説明書を、色々試しながら何日もかけて作成するとか、おかしなことをやっていました。
気になった点について機能追加やバグ修正を続けていたのが、つい最近のことです。
目指しているものをもう一度ここで確認したいと思います。
あたかも3D空間に自分の手を入れたかのような錯覚を起こすほど、指を含めた手の姿勢推定を行うこと
これがゴールです。
これを実現してから色々なことに挑戦して行きたいと思います。
こうして報告をまとめる作業はそこそこ時間がかかりますが、こうして誰かの目に止まる所にやりたいことを書かないと
結局日々の忙しさに負けて休日に休んでしまうので、これからはもう少し頻繁に報告をまとめていこうと思います。
さて、本題の Kimberlite の進捗について示していきたいと思います。
まずは概要
Collada 1.4, ColladaBinary, Kimberlite ファイルを読み込み、ColladaBin, Kimberlite のパラメータを編集し、書き出せるGUIツールです。
なにソレ?って方のための説明がこちら↓
用語解説
Collada 1.4
XML形式の3Dモデルデータフォーマット。
Blender やその他モデリングツールからモデルデータをこのファイル形式でエクスポートできます。
ColladaBinary
ColladaToBinary Converter より Collada 1.4 をバイナリ形式で書き出したもの。
内製フォーマット(詳細は別途 ColladaBinary1.1Format.xlsx を参照)
Kimberlite
GUIのKimberlite より書き出した3Dシーンデータファイル(バイナリ形式)
ColladaBinary が描画モデル情報と簡単な物理オブジェクト情報を持ち
Kimberlite が物理オブジェクトとモデルの関係性や速度、加速度、コンストレイント情報など、3Dシーンの情報を持つ。
ColladaToBinary
Collada 1.4 をバイナリ形式の ColladaBinary へ変換して書き出す CUIツール
特長
読み込んだ Collada1.4, ColladaBinary, Kimberlite を3D描画します。
Effect, パラメータを編集した結果をその場で確認することができます。
動画で示します。
Blender でオブジェクトを Collada フォーマットで出力します。
Collada を読み込んでオブジェクトを3D表示し、シェーダコードを編集しています。
その後、内製のバイナリフォーマットでファイル出力して再読み込みしています。
Collada の読み込み、シェーダーの編集、バイナリ形式で出力、バイナリ形式の読み込みを確認しました。
3Dツールの基本ですね。
動画で示します。
前回出力した Collada バイナリフォーマットファイルを読み込んで
ノードの姿勢情報の編集を行います。
簡単な物理パラメータの編集と更新の確認を行います。
最後に再度 Collada バイナリフォーマットファイルとして書き出して
再読み込み後、編集が正しく保存されていることを確認します。
動画では何回か示してますが、Kimberlite には描画モードというものがあります。
上記のチェックボックスにより左から順番に
ツリービューノードの描画
物理オブジェクトにアタッチされたノードの描画
物理オブジェクトの描画
グリッド表示
コンストレイントの描画
ボーンの描画
の有効無効を切り替えることができます。
以降の動画も描画モードを切り替える時にコメントしていますので
理解できていない方は注意して視聴してみてください。
動画で示します。
プレートとボールを Blender より Collada 出力、これを読み込んでボールの物理特性を編集して遊びます。
変更するパラメータは質量、シェイプタイプ、反発係数、最後に衝突フィルタグループ値です。
パラメータの数が多いので一部のみの紹介です。
実際の作業ではもっと多くのパラメータを編集して動作に現実味をもたせることになると思います。
動画で示します。
コンストレイント6種を簡単に設定して、簡単にパラメータを編集し
動作確認をしています。
動画で説明はありませんでしたが Shift + A キーでメニューを表示し Constraint を選ぶと
そこから 6種類のコンストレイントを追加することができます。
動画で示します。
前半は Blender からスキンメッシュ用のモデルを作成、これを Collada として出力します。
後半は自作ツール Kimberlite で Collada を読み込んでボーンを物理アニメーションさせます。
これによりスキンメッシュアニメーションを確認します。
いくつかの動画を使って進捗報告をしてみました。
現在は手の物理モデル生成を簡単にするための機能を追加しているところです。
以降に手のモデリングについて示します。
まずは…骨だけで表現してみます。
ここで手の骨の数や名前を知らないことに気がついたので調べてみました。
読むだけではなかなか覚えなかったので描いていることに…
片手だけで骨の数は 29個もあるのか、多いな…
可動範囲について学びたい
教科書(3D踊る肉単)に記述あり。
橈屈、尺屈、掌屈、背屈、内回、外回の限界角度について調べが付きました。
メモにも書いたけど、これ ConeTwist コンストレイントでカバー出来るのかな?
試してみましょう。
ボーンオブジェクトの自動生成について
色々と不満に思う所があったので修正しました。
ジョイント部のコンストレイントの種類を指定可能
ジョイントの長さを指定可能
ジョイントの太さを指定可能
ジョイント同士で衝突するように指定可能
ジョイントオブジェクトも Box 以外にカプセルとか指定できるようにしたいなぁ。
はい、ジョイントオブジェクトも任意のものに置き換えられるように対応しました。
ディフォルトをボックスからカプセルに変えました。(画像はシリンダーで置き換えたもの)
仕切り直して、再度 ConeTwist コンストレイントを試してみます。
テスト用のモデルを作成
上記のモデルを作成して、ConeTwist コンストレイントのパラメータを編集してみようと思います。
はぁ…色々と不満に思う点が出て来ましたので対応します。
ボーンだけ配置すると、ボーンオブジェクト同士を連結します。
これは動画でお見せしましたが、その連結しているオブジェクトを
他の関係ないオブジェクトと交換します。
コンストレイントの交換機能として Shift + D キーで選択した
2つのオブジェクトのコンストレイント情報を交換します。
ReplaceConstraint 機能です。
また、選択したオブジェクトを削除する機能のバグを修正しました。
置換後はボーンオブジェクトを削除します。
同じく、コンテキストメニューから選択したオブジェクトを統合する機能を追加しました。
初期配置から移動すると正しい位置関係で統合出来ない不具合がありましたがこれを解決しました。
統合の際、オブジェクトの描画用ノード情報とコンストレイント情報も正しく引き継ぐように対応
アンドゥ・リドゥにも対応しました。
他にも初期配置から移動したオブジェクト同士で正しい位置関係でコンストレイントを設置出来ない
不具合がありましたが、これも解決しました。
これ関係の数学がうまく解けなくて動作テスト含め機能追加に 2日もかかってしまいました。
コード量は 2000 行程度です。
さて、では ConeTwist コンストレイントの設定を使い倒してみたいと思います。
(…やっとですね)
あー!、CompoundShape のセーブ、ロード未対応だった。
…動作上問題ないので、先に ConeTwist コンストレイントについて見ていきます。
以下、パラメータを変更しながら、わかったことを示します。
Softness 0
BiasFactor 0
RelaxationFactor 1
TwistSpan 0
SwingSpan1 0
SwingSpan2 0
Damping 1
固定されます。
カッチコチです。ビクともしません。
Softness 1
としてみましたが、変化なし。
固定されたまま。
BiasFactor 1
としてみました。プルプル高速に振動します。
振動しますが次第に収束してやはり固定されたまま。
安定していない動作に見える。
Damping 0
としましたが、変化が見受けられず。
小刻みに振動しているように見えるが、固定されたまま。
TwistSpan 0.1
にしてみた所、掌屈、背屈が少しできるようになる。
小刻みに振動していた動作はなくなった。
BiasFactor が振動に起因していたのは確実なのだが、可動範囲を持たせると安定する模様。
TwistSpan 1.1
この値は大きくすればするほど、掌屈、背屈の角度が比例して大きくなることを確認
1.1 で 90°に近づいたのでラジアンとは異なる単位と見ている。(どうかな?)
この状態で Softness 0 を試した所、中央姿勢で固定された。
BiasFactor が高いので安定しないが、確かに固定されている。
Softness 0.2
Softness を徐々に上げたところ、掌屈、背屈の範囲が比例して大きくなることを確認
自由に可動できる範囲は掌屈、背屈に関しては TwistSpan と Softness との連携が必要
ということがわかった。またお互い可動範囲限界でロックされる動作を確認
そこ、柔らかく受け止めてくれないんだ…
RelaxationFactor 0.1
と、1から徐々に下げるも動作に変化なし。
しかし0.1に差し掛かったところで動作不安定になりオブジェクトごと彼方へ飛んで行きました。
読みなおしてもう一度。
SwingSpan1 1
としたところ
橈屈、尺屈の角度が設定できることを確認。
角度は比例して大きくなっていた。
回内、回外動作は確認できず。(むしろそれでいい)
SwingSpan2 1
としたところ、回内、回外動作が実現できることを確認。
範囲についてまとめます。
TwistSpan が掌屈、背屈。
SwingSpan1 が橈屈、尺屈。
SwingSpan2 が回内、回外。
それぞれの可動範囲を設定できることを確認。
そして Softness がこれらの範囲をさらに倍率制御している。
その通りで Softness は 1 以上の値を取ることができ、設定範囲以上の可動範囲を実現することを確認。
BiasFactor 0 にしたところ、制限がなくなりどこまでも回転できるようになることを確認。
RelaxationFactor は 1より小さい値にすると制限範囲よりも大きな範囲で動作できることを確認。
RelaxationFactor を 0.001 にした所、関節はクニャクニャになりました。
RelaxationFactor を 0 にすると制限範囲が意味をなさなくなりました。
おおむね確認したいことはできました。
TwistSpan が掌屈、背屈。
SwingSpan1 が橈屈、尺屈。
SwingSpan2 が回内、回外。
ということですね。
また
Softness 0以上1以下
BiasFactor 0以上1以下
RelaxationFactor 0以上1以下
Softness 1, BiasFactor 1, RelaxationFactor 1 ディフォルトが安定かな?
動画を用いて Kimberlite2 について進捗を報告しました。
機能追加をいくつか
ConeTwist コンストレイントについて掌屈、背屈、橈屈、尺屈、回内、回外の範囲を設定できることを確認
CompoundShape の復元ができないバグは次回に持ち越します。
2013/07/11 初記。
2013/07/21 更新。