Up:Tutorial? Previous:物体を持つ動作?
ここではBVH形式のモーションデータをSIGVerseで読み込むサンプルを紹介します。(※このサンプルはバージョン110223以降で正常に動作します。)
まずSIGVerseがインストールされたディレクトリに移動します。
$ cd ~/sigverse-<version>/bin
次に以下のディレクトリからサンプルコードを取得し、展開します。
$ cp /home/SIGVerse/samples/readBVH.tar.gz . $ tar zxvf readBVH.tar.gz $ cd readBVH
このパッケージの中には以下のファイルが含まれています。
それでは早速コンパイルをしてみましょう。
Makefileを自分の環境に合わせて修正します。
$ emacs Makefile
#SIGVerseソースの場所指定
SIG_SRC  = /home/<user-name>/sigverse-<version>/include/sigverse
#オブジェクトファイルの指定
OBJS     =  BVH.o BVHController.so BVHController.o 
all: $(OBJS) 
#コンパイルを行います。
BVHController.o: BVHController.cpp
        g++ -DCONTROLLER -DNDEBUG -DUSE_ODE -DdDOUBLE -I$(SIG_SRC) - I$(SIG_SRC)/comm/controller -fPIC -c -o $@   $<
BVH.o: BVH.cpp
        g++ -DCONTROLLER -DNDEBUG -DUSE_ODE -DdDOUBLE -I$(SIG_SRC) - I$(SIG_SRC)/comm/controller -fPIC -c -o $@ $<
BVHController.so: BVHController.o BVH.o
        g++ -shared -o BVHController.so BVHController.o BVH.o
SIG_SRC = /home/<user-name>/sigverse-<version>/include/sigverse
の部分の<user-name>, <version>をそれぞれ自分のユーザ名、バージョン番号に置き換えます。
コンパイルします。
$ make
BVHController.soが作成されたらコンパイルは成功です。
次にbvhファイル読み込み用のサンプル形状モデルをパスが通ったshapeディレクトリに置きます。
$ cp bvh_man.x3d ../../share/sigverse/data/shape/
クライアント側のSIGViewerのインストール場所 (デフォルトでは C:\Program Files\SIGViewer_<vesion>\SIGViewer\release) にも同様のファイルを置きます。
次に世界ファイルとエージェント設定ファイルをxmlディレクトリに置きます。
$ cp BVHWorld.xml ../xml/ $ cp Man-bvh.xml ../xml/ (※コピー先 ../../share/sigverse/data/xml/)
読み込ませたいbvhファイルを取得してカレントディレクトリ(~/sigverse-<version>/bin/readBVH)に置きます。本ページのサンプルではPV STUDIOから取得したbvhのサンプルデータAction_Kick_bvh.bvhを読み込ませます。
次に読み込ませたいbvhのファイル名を世界ファイルに記述します。
$ cd .. $ emacs BVHWorld.xml
<!--BVHファイル名の指定-->
       <set-attr-value name="BvhFile" value="./readBVH/filename.bvh"/>
↓
<!--BVHファイル名の指定-->
       <set-attr-value name="BvhFile" value="./readBVH/Action_Kick_bvh.bvh"/>
bvhファイルはSIGVerseを実行するディレクトリからのパスを指定します。
BVHWorld.xml
<?xml version="1.0" encoding="UTF-8"?>
<world name="newworld">
<!--重力の設定-->
  <gravity x="0.0" y="-9.8" z="0.0"/> 
<!--エージェントMan-niiの設定-->
  <instanciate class="Man-bvh.xml"> 
<!--エージェント名--> 
        <set-attr-value name="name" value="man_000"/> 
<!--C++言語の指定-->
        <set-attr-value name="language" value="c++"/> 
<!--オブジェクトファイルBVHController.soの指定-->
        <set-attr-value name="implementation" value="./readBVH/BVHController.so"/>
<!--BVHファイル名の指定-->
        <set-attr-value name="BvhFile" value="./readBVH/Action_Kick_bvh.bvh"/> 
<!--動力学演算をfalseに設定-->
        <set-attr-value name="dynamics" value="false"/> 
<!--エージェントの位置(x,y,z)-->
       <set-attr-value name="x" value="0.0"/>
       <set-attr-value name="y" value="50.0"/>
       <set-attr-value name="z" value="0.0"/> 
 </instanciate>
</world>
これで準備は整いました。それでは実行してみましょう。
$ ./sigserver.sh -p 9001 -w xml/BVHWorld.xml
SIGViewerでサーバに接続するとエージェントが手を広げて立っているのが見えます。 Sendボタンを押してシミュレーションを開始するとbvhファイルの読み込みが開始され、エージェントが動き始めます。
エージェントがキックします。
bvh読み込みサンプルモデル(bvh_man.x3d)で定義された関節名は以下のようになっています。すべての関節がローカル座標系におけるx,y,z軸を中心に回転するように定義されいています。