Up:Tutorial? Previous:距離センサ? Next: キネクトによるエージェントの操作?
人間エージェントがターゲットのオブジェクトを目で追いかけ、視線の変化と同時に目玉を動かすサンプルを紹介します。
※バージョン111005以降で正常に動作(v121029, v2.0.1以降には未対応)
まずコントローラを作成します。
$ cd ~/sigverse-<version>/bin/NewWorld $ emacs moveEye.cpp
moveEye.cpp
これは人間がターゲット"Toy_0"を目で追いかけ、視線の変化に合わせて黒目を動かすサンプルです。黒目を動かす方法は普通の関節を動かす方法と同じでsetJointAngleを使います。ここで指定した関節名は人間エージェントのそれぞれの関節名に対応する関節軸はJoint定義一覧?を参考にしてください。
次にビューワーで操作可能なエージェントのコントローラを作ります。
$ emacs move.cpp
move.cpp
このコントローラはdynamicsをtrueに設定したときにエージェントを操作することができます。操作方法はビューワーからメッセージを送信してオブジェクトに力を加えます。例えば
z=-500
とメッセージを送信したらz軸のマイナス方向に500(N)の力が働きます。
Makefileを修正してコンパイルします。
$ make
次に設定ファイルを作成します。
$ cd ../ $ emacs xml/eyeWorld.xml
eyeWorld.xml
この世界ファイルでは人間、ペンギン(おもちゃ)、テーブル、椅子が登場します。ペンギンとテーブルはdynamicsをtrueに設定しています。ペンギンがテーブルの上に乗っています。このペンギンに先ほど作成したビューワーで操作できるコントローラを割り当てます。
エージェントまたはエンティティの物理演算用の形状、位置を微調整します。
$ emacs xml/seSidetabe_B.xml
<body filename="dummy-body.xml"/>
の下に以下を加えます。
<simpleShape type="box"> <position x="0" y="-10" z="0"/> <size sx="150" sy="70" sz="80"/> </simpleShape>
テーブルの見た目の形状と物理演算用の形状を一致させるように微調整を行いました。
それでは実行してみましょう。
$ ./sigserver.sh -p 9001 -w xml/eyeWorld.xml
シミュレーションを開始してみると以下のようにテーブルの上にペンギンが乗っていてそれを人間エージェントが見つめています。
#ref(): File not found: "eye_1.jpg" at page "眼球運動"
次にテーブルの上に乗っているおもちゃを動かしてみましょう。 例えばSIGViewerから"Toy_0"に
z=500
というメッセージを送信します。 するとペンギンはz軸方向に力が加わり、机の上を移動します。 人間はそれを目で追いかけ、同時に黒目を動かします。
#ref(): File not found: "eye_2.jpg" at page "眼球運動"
#ref(): File not found: "eye_3.jpg" at page "眼球運動"
顔のズーム
次にy軸方向に力を加えてみます。 以下のメッセージを"Toy_0"に送信します。
y=3000
するとy軸方向に力が加わり、おもちゃのペンギンは飛び跳ねます。 人間エージェントはそれを目で追いかけます。
#ref(): File not found: "eye_4.jpg" at page "眼球運動"