[[Tutorial]]

#contents

*自作形状ファイルの読み込み(静止物体) [#fd56e710]

※このチュートリアルはv2.1.0以降対応です。

ここでは形状ファイル(x3d)を作成してSIGVerseに登場させる方法を説明します。

**クライアント側 [#cbb45b7b]
**形状ファイル作成 [#cbb45b7b]
まず静止物体の形状ファイルを作成します。形状ファイルはノードとフィールドからなります。SIGVerseで形状ファイルを読み込むためにGroup, Transform, IndexFaceSetなどのノードを用いて記述します。

ここでは簡単な立方体の形状ファイルを作成します。

***形状ファイル作成 [#b0eabf1f]
サーバ側で
box.wrl
サーバ側でSIGVerse作業ディレクトリに移動し、形状ファイルを作成します。
 $ cd ~/MyWorld
 $ emacs box.x3d
box.x3d
#highlight(xml){{
<?xml version="1.0" encoding="UTF-8"?>
<X3D profile="Interchange">
  <Scene>
    <Group >
      <Transform >
        <Shape>
          <Box size="10 10 10"/>
          <Appearance >
            <Material diffuseColor='0.2 0.8 0.2' />
          </Appearance>
        </Shape>
      </Transform>
    </Group>
  </Scene>
</X3D>
}}

 #VRML V2.0 utf8 CosmoWorlds V1.0
 
 # Need this line to parse this file with Xj3D
 PROFILE Interactive
 
 
 Group
  {
  children
  [
   Transform
   {
    children Shape
     {
      appearance Appearance
      {
       texture ImageTexture
       {
  
       #使用するテキスチャを指定します。
        url  "tumiki_moku.jpg"
        repeatS TRUE
        repeatT TRUE
       }
      }
     geometry IndexedFaceSet
    {
     convex FALSE
     solid FALSE
     coord DEF Coaster_c01GeoPoints Coordinate
     {
     #面を構成する点の位置
      point [
       -5.0 0.0 -5.0,
       5.0 0.0 -5.0,
       5.0 0.0 5.0,
       -5.0 0.0 5.0,
       -5.0 10.0 -5.0,
       5.0 10.0 -5.0,
       5.0 10.0 5.0,
       -5.0 10.0 5.0
      ]
     }
  
     #面を構成する頂点の座標(上記の点の通し番号)
     coordIndex [
      0 3 2 1 -1, 
      4 5 6 7 -1, 
      4 0 1 5 -1, 
      5 1 2 6 -1, 
      6 2 3 7 -1, 
      7 3 0 4 -1
     ]
     texCoord TextureCoordinate
     {
  
      #テキスチャの点の座標
      point [
       0.000000 0.000000
       0.000000 1.000000
       1.000000 1.000000
       1.000000 0.000000
      ]
     }
     #面に張り付けるテキスチャの座標
     texCoordIndex [
      0 1 2 3  -1,
      0 1 2 3  -1,
      0 1 2 3  -1,
      0 1 2 3  -1,
      0 1 2 3  -1,
      0 1 2 3  -1,
     ]
    }
    }
   }
  ]
 }
この形状ファイルは1辺が10の立方体です。

x3dファイルの場合はこちら
以下の行で色(r,g,b)を設定します。緑色に設定しました。
            <Material diffuseColor='0.2 0.8 0.2' />

#ref(box.x3d)
box以外にもsphere,cylinder形状を作成することができます。

//Shapeノードのgeometry値にSphereノードやBoxノードを指定すると正常に読み込まれないので注意が必要です。

ここではIndexedFaceSetノードで静止物体の形状を記述します。''これらのノードは必ずGroupノード、Transformノードの中に記述してください。''

形状ファイルの色づけはテキスチャを用います。
ここでは立方体に張り付ける画像"tumiki_moku.jpg"を指定しました。これは木の木目画像です。
ここで指定した素材はSIGViewerのインストール場所、デフォルトでは

C:\Program Files\SIGViewer_<version>\SIGViewer\media\materials\textures

に準備されています。他にもさまざまな素材が用意されています。また、自分の好きなテクスチャ素材を取得して、ここに保存しておけばそれを読み込むこともできます。

それでは上で作成した形状ファイルを保存します。SIGViewerの実行ファイルがある場所、デフォルトでは


C:\Program Files\SIGViewer_<version>\SIGViewer\media\release

に保存します。

**サーバ側の設定 [#t1c144ba]
次はサーバ側で設定を行います。
***形状ファイル作成 [#d9b3d62d]
上で作成したbox.wrlをサーバ側の

/home/<username>/sigverse-<version>/share/sigverse/data/shape

にコピーします。
***エンティティの設定 [#b46382b1]
エンティティの設定ファイルを作成します。
 $ cd ~/sigverse-<version>/share/sigverse/data/xml
 $ emacs seBox.xml

 <?xml version="1.0" encoding="UTF-8" standalone="no" ?>
 <define-class inherit="Entity.xml" name="box">
 
   <body filename="dummy-body.xml"/>
 
 <!--形状ファイルの指定 -->
 $ emacs box.xml
#highlight(xml){{
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<define-class inherit="Entity.xml" name="box">

  <body filename="dummy-body.xml"/>

  <!--形状ファイルの指定 -->
  <x3d>
    <filename>box.wrl</filename>
    <filename>box.x3d</filename>
  </x3d>
  
 </define-class>

</define-class>
}}

x3dファイルの場合はbox.wrl→box.x3dに指定します。
上で指定したdummy-body.xmlはサーバ側ではエンティティ用にすでに用意されています。

***エンティティにコントローラを取りつける場合 [#mae6a055]
作成したエンティティにコントローラを取りつけて自律動作させたい場合は2行目を修正します。
    <filename>box.x3d</filename>
 
の行で先ほど作成した形状ファイルを指定しました。

***エンティティにコントローラをアタッチする場合 [#mae6a055]
作成したエンティティにコントローラをアタッチして自律動作させたい場合は2行目を修正します。
 <define-class inherit="Entity.xml" name="box">
    ↓
 <define-class inherit="Agent.xml" name="box">

Entity.xmlをAgent.xmlに変更しました。Entity.xmlを指定した場合コントローラの取り付けができないので注意してください。


***世界ファイル作成 [#n22bd9fe]

次に世界ファイルを作成します。

 $ emacs testBox.xml

testBox.xml
 <?xml version="1.0" encoding="utf8"?>
 <world name="boxtest">
 
  <gravity x="0.0" y="-9.8" z="0.0"/>
 
  <!--自作エンティティboxの設定-->
  <instanciate class="seBox.xml">
 
    <set-attr-value name="name" value="box_000"/>
 
    <set-attr-value name="x" value="0.0"/>
    <set-attr-value name="y" value="5.0"/>
    <set-attr-value name="z" value="0.0"/>
 
  </instanciate>
 </world>
#highlight(xml){{
<?xml version="1.0" encoding="utf8"?>
<world name="boxtest">

名前の設定をしなかった場合他のエンティティと見分けることができないので注意してください。
 <gravity x="0.0" y="-980.7" z="0.0"/>

 <!--自作エンティティboxの設定-->
 <instanciate class="box.xml">

   <set-attr-value name="name" value="box_000"/>

   <set-attr-value name="x" value="0.0"/>
   <set-attr-value name="y" value="20.0"/>
   <set-attr-value name="z" value="0.0"/>

   <set-attr-value name="dynamics" value="true"/>
   <set-attr-value name="collision" value="true"/>

 </instanciate>
</world>
}}

立方体を高さ20cmのところに設置します。

***実行 [#dd8bb5f6]
これで準備完了です。それでは実行してみましょう。

 $ ./sigserver.sh  -p 9001 -w testBox.xml
 $ sigserver.sh -w ./testBox.xml

SIGViewerでサーバにつなげてみると木の箱が見えると思います。
SIGViewerでサーバにつなげてみると緑色の箱が見えます。

#ref(box_1.jpg)
#ref(./box_1.PNG,40%)

*テクスチャの登録 [#h8ac8d1e]
テクスチャを新しくSIGVerseに登録するにはテクスチャ設定ファイルを修正しなければなりません。
テクスチャ画像の設定ファイルはSIGViewerのインストール場所の以下のファイルを修正します。
シミュレーションを開始すると箱が落下します。
* ポリゴン形状[#a1dee552]
頂点座標からポリゴン形状を作成する場合はshapeノードの中を以下のように修正します。
 $ emacs box.x3d
#highlight(xml){{
        <Shape>
          <Box size="10 10 10"/>
          <Appearance>
            <ImageTexture url='"man_c01.jpg"' />
          </Appearance>
        </Shape>
}}

C:\Program Files\SIGViewer_<version>\SIGViewer\media\materials\scripts\SIGVerseViewer.material
     ↓
#highlight(xml){{
	<Shape >
	  <Appearance >  
	    <ImageTexture  repeatS="true" url='"checker.png"' repeatT="true"/>  
	  </Appearance>  
	  <IndexedFaceSet  convex="false" coordIndex=" 1 2 3 0 -1 7 6 5 4 -1 5 1 0 4 -1 6 2 1 5 -1 7 3 2 6 -1 4 0 3 7 -1" texCoordIndex=" 0 1 2 3 -1 0 1 2 3 -1 0 1 2 3 -1 0 1 2 3 -1 0 1 2 3 -1 0 1 2 3 -1" solid="false">  
	    <TextureCoordinate  point="0.0 0.0, 0.0 1.0, 1.0 1.0, 1.0 0.0, "/>  
	    <Coordinate  DEF="Coaster_c01GeoPoints"  point="-5.0 0.0 -5.0, 5.0 0.0 -5.0, 5.0 0.0 5.0, -5.0 0.0 5.0, -5.0 10.0 -5.0, 5.0 10.0 -5.0, 5.0 10.0 5.0, -5.0 10.0 5.0, "/>  
	  </IndexedFaceSet>  
	</Shape>
}}

以下の行でテクスチャ"checker.png"を指定しました。
#highlight(xml,firstline[3]){{
	    <ImageTexture  repeatS="true" url='"checker.png"' repeatT="true"/> 
}}
色々なテクスチャがクライアント側のSIGViewerインストール先にサンプルとして用意されています。

このファイルの一番最後を編集します。
テクスチャサンプル場所:
 <sigverseインストール場所>\SIGViewer\media\materials\textures

test.jpgという画像を登録したいときは以下を追加します。
ここに自分専用のテクスチャを追加することも可能です。

 material test
 {
	technique
	{
		pass
		{
			texture_unit
			{
				texture test.jpg
			}
		}
	}
 }
***実行 [#dd8bb5f6]
それでは実行してみましょう。

そしてtest.jpgを
C:\Program Files\SIGViewer_<version>\SIGViewer\media\materials\textures
に保存しておけば読み込めるようになります。
*単純形状 [#f7f8cc8f]
ポリゴンの頂点座標をわざわざ指定せずに単純形状を作成することも可能です。(バージョン111026,ビューワー1.4.2以降対応)
 $ sigserver.sh -w ./testBox.xml

box.x3dを以下のように修正します。
ビューワーで接続する前に以下の設定をしておきます。

ビューワーのメニューバーにある「Settings」をクリックして「Overwrite shape file」にチェックを入れておきます。これによりクライアント側に置かれた形状ファイルが上書きされます。

 <?xml version="1.0" encoding="UTF-8"?>
 <X3D profile="Interchange">
   <Scene>
     <Group >
       <Transform >
         <Shape >
           <Box size="10 10 10"/>
           <Appearance >
             <Material  diffuseColor='0.5 0.5 0.2' />
           </Appearance>
         </Shape>
       </Transform>
     </Group>
   </Scene>
 </X3D>
それではサーバに接続してみましょう。
以下のようなチェック模様の箱が見えます。

読み込んでみると以下のような一辺の長さが10の箱が見えます。
#ref(./box_2.PNG,40%)

#ref(hako.jpg)
※注意)SIGVerseではX3D形式のファイルを読み込み可能ですが、完全には対応しておりません。

対応している形状はBox, Shpere, Cylinderです。(※2011/12時点)
*Old Version [#x6e41d74]
- [[自作の形状ファイルの読み込み(v1.4.8)]]


#highlight(end)


Front page   New List of pages Search Recent changes   Help   RSS of recent changes