前回は手のモデルを作成しました。
実はそれから少し手を加えて現在は次の形になっています。
発見したことに、コンストレイントの強さは相手の質量に関係していました。
つまり、トラッキングさせたいのであれば、トラック対象の質量は大きめに取る必要があります。
でもそんなことするとモデル全体が手の挙動をしなくなるので、トラック時以外はコンストレイントを外す必要があります。
とりあえず左手のモデルが出来たわけですから、また CREATIVE のテストツールで作業を再開します。
まず、色々と手を加えた Kimberlite をパッケージ化します。
さて、パッケージ化したアセンブリを参照して CREATIVE テストツールを起動
3D ジェスチャ認識プラグインを試してみま…
ん?深度画像のストリームが流れていない?
こんなことは初めてなのですが、なんででしょう?
思い当たるフシが無いので、一旦PC再起動してみましょうか?
再起動したら直りました、一体どういうことだったのでしょう?
気を取り直して、採寸。
モデルの大きさはピッタリのようです。
時間軸を止めているので、再生してみます。
びっくりするくらいスローで再生されました。(なんで?)
もう少し観察すると、最初は普通に動き出すのに、どんどん動きが鈍くなり
最後には止まり、そしてモデルは消えます。(突然描画されなくなる)
意味がわからない、何が違うというのか?
なるほど、フラグ再設定をファイルロード時に行っていたからでした。
再生されないまま強制更新を続けることによって不思議な現象を観測していたようです。
さて、現在は次のようにただ手のモデルが落下するだけです。
指先位置にモデルを配置する技術は087話で手にしましたので
同じように指先のモデルを、指先位置に配置するように動かしてみます。
えーと名前で判別してオブジェクトを特定しているようです。
10倍のモデル表示がまだだったので対応しました。
ここで気付きましたが、まずは肘の位置の表示を行いたいです。
ジェスチャの設定では Elbow を指定しているようですので、取り出せるはずです。
まずはフラグ制御について087話で確認しています。
おもいっきり書いていましたね。
LABEL_BODY_ELBOW_LEFT, LABEL_BODY_ELBOW_SECONDARY を使えば…
あれ、もう一方は Right ではないのか。(追記:RIGHT も受け取れました。)
肘の位置にオブジェクトを描画できました。
肘というより橈骨、尺骨の中間といった位置です。
いえ、この位置は逆に有難いです。
ではオブジェクト名を変更して同じことをしてみます。
名前を変えても同じことが出来ました。
この状態で一旦サーバーに提出します。
モデルを差し替えてみました。
驚きの暴れっぷり…簡単にはいかないですね。
ゆっくりと手の位置にモデルが移動すると思ったのに
真っ先に考えるのは回転抑制です。
コンストレイントの回転姿勢制御を切ってみてどんな結果になるのか見てみます。
で、どうやってコンストレイントを特定する?
名前しかなさそうだが
その前に右手モデルを建設します。(めんどくさいなー)
うぉー頑張れ自分!!
あと少しだ!
ひと通り完了です。
チェックします。
うまく出来ています!
ひとまず Blender での作業はここまでと思われる。
もう一度関節角度の設定を入れて、トラッキングについて考察していきましょう。
トラッキング対象の重さも関係していそうです。
コンストレイントの回転は外すとして、トラッキング対象を静的オブジェクトにしてみたらどうなるでしょうか?
えーと、問題が一つ、コンストレイントを特定したいのですが
コンストレイントはそもそもオブジェクト同士の関係で作るので、コンストレイント自体には名前がついていません。
どうしたものかー
ひらめきました、トラッキング対象が関係しているコンストレイントは一つなので
このオブジェクトから探してみましょう。
おそらく探せるコードとなったと思います。(まだ動かしていませんが)
ということでほぼ完成に近づいたモデルを読み込んでみます。
いやはや、前回と同じように角度設定を入れて、トラッキング対象をKinematicにしてみました。
あと、どうもKinematicオブジェクトにしてアクティベーションステートがSleepに入ると
トラッキングしなくなる様子だったので、DisableDeactivation フラグを入れました。
さて、モデルを読み込むとどうなるでしょうか?
一瞬、指先認識結果が取得できていないだけかと思いましたが、そんなことはありませんでした。
Kinematic 剛体を動かすには別の手段が必要なのだと思います。
ちょっと調べますね。
調べが付きました。
RigidBody の MotionState にて WroldTransform を編集することで Kinematics オブジェクトを移動出来ます。
その他のオブジェクトが付いて来なかったのは、ほかのオブジェクトに拘束されていたからでしょうか?
とりあえず、指先についても MotionState での位置設定に置き換えてみます。
あれ、指先にオブジェクトが付いてこない…
あー、なるほど、Sleep 状態なので引っ張れないのですね。
すべてのオブジェクトのステートを DsiableDeactivate に変更します。
おお、引っ張っていますね。
ただ他のトラッキング対象が置き去り状態なので、どうもうまくいきません。
不要なコンストレイントは無効にしてみます。
動かないトラッキング対象からははがせましたが、腕の位置によって圧迫されていて手の形を保てていません。
ちょっと腕の位置には黙っててもらいましょう。
腕がぷらぷらと垂れ下がっている状態ですが、一応指先位置に合わせるように手のモデルが移動しています。
次に気になるには指の向きですね。
位置だけ合っている状態で向きがあっていないので関節も結構安定していない状態です。
ちょっと考えものですね、考えて答えを導きます。
エージェントシステムを入れてみてはどうでしょう?
研究室にいた頃に先輩の口から出たキーワードでしたが、やっと使う時が来ました。
発想を得ただけで、実際どういうものか知りませんが
マルチエージェントシステムで調べると、大体考えていることと一致してますので、まぁこう呼んで良いと思います。
(そうじゃないと説明出来ませんからね…)
エージェントが各々のオブジェクトの未来の姿勢を過去と現在から導き出します。
まずは右手親指の未来の姿勢決定機構をエージェントに処理させてみます。
なのでエージェントの作成からですね。
知覚で必要になるのは
1.トラック対象
2.親指の指先認識結果
3.親指付け根のコンストレイント
4.トラック対象と繋がるコンストレイント
5.トラック対象がさらに牽引するオブジェクト
の5つです。
まずは基底となるだろう、エージェントに1,3,4,5を保持するものを作ります。
それを継承して2.を保持するエージェントを作ります。
今までの作りで続行すると、3Dウィンドウがオブジェクトの情報を保持していることになりますが
もう少し公的な場所、コンテキストにてこれらの情報を集めることにしました。
一度集めた情報はそこで様々なエージェントから静的にアクセスすることが可能となります。
これでエージェントは1.4.を手に入れることができます。
保持する必要はないですね、コンテキストから常に取得するようにします。
とりあえず、親指の姿勢を MotionState に設定するコードを作ってみましょう。
そこで、いつエージェントを作成するのか考えることになりますが、次に示す通り
モデルをロードし終えた後にエージェントを作成するようにします。
いつ知覚するのか?
エージェントの知覚、思考、行動は指先認識結果がPerCライブラリから送られてきた時にすることにしました。(暫定で)
では、知覚コードを覗いてみます。
1.トラックオブジェクト
2.認識結果
3.トラック対象コンストレイント
4.トラックコンストレイント
5.トラック対象オブジェクト
を集めるわけですから…1.はありますが2.がありませんね。
まずはコンテキスト空間に2.にアクセスできる情報を持たせます。
2.を受け取れるように作りました。
今度は3.が受け取れません。コンテキスト空間に3.を持たせます。
3.を特定できるようにしました。
4.はもともと手に入っていました、5.も3.を特定する過程で手に入るようになりました。
これで知覚できるようになりました。
次は簡単な思考を考えてみましょう。
例えばトラックコンストレイントの有効性を無効にして、トラッキング対象と全く同じ位置に
トラックオブジェクトを移動する思考はどうでしょう?
行動ではその移動先にオブジェクトを移動します。
基底エージェントでそのような思考、行動を取らせることで、オブジェクトは自由落下するのではないでしょうか?
つまり下記の通りの実装を行うと
はい、自由落下しました。
回転を無視してトラックする機構をいれてみて、その通りトラックすることを確認しました。
エージェントシステムは便利ですね。
監督になった気になって、君はこの情報が来たら周りを見てこうしろ、あーしろと命令するだけ
命令に従うロジックを組むのも監督なので、思い通りに動かないエージェントは一人もいません。
そんな調整をいくつか仕込むと下図のとおりの結果を得られます。
見栄えが良くなるよう、ポイントスプライトを半透明にしました。
手のモデルが開いた両手の位置に正しく配置されることを確認できました。
やっと準備運動を終えてスタートラインに立ちました。
これから行なうほんの少しの工夫を行いたくて行いたくて、何年も努力して作業を続けてきました。
まぁ失敗する可能性もかなり濃厚ですが、絶対に出来ないならばその結果を確認して諦めようと思います。
正直早くあきらめたい!そのために絶対に不可能であることを確認したいと思います。
最近は訪れるお客さんもめっきり減ってしまいましたが
細々と作業を続けていきます。
タイトルで示した指先追跡ができましたので、ここで話を切りたいと思います。
次回をお楽しみに!
2014/10/05 初記。
2014/10/18 更新。