忍者ブログ
[291] [293] [290] [289] [288] [287] [286] [285] [284] [283] [282]

DATE : 2024/03/29 (Fri)
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


DATE : 2007/04/14 (Sat)

場面設定ファイルは次のように記述します。

<?xml version="1.0" encoding="UTF-8"?>
<Scene 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:noNamespaceSchemaLocation="../../Config/Scene/Scene.xsd">

  <Floor Length="1.0" Width="1.0" 
    GifFilename="scenario/example/floor.gif" />

  <Lights>
    <SpotLight 
      PositionX="-0.5" PositionY="0.5" PositionZ="1"          
      DirectionX="0.5" DirectionY="-.5" DirectionZ="-1"          
      Concentration="40" SpreadAngle="3" 
      Red="220" Green="50" Blue="50" />
    <SpotLight 
      PositionX="0" PositionY="0" PositionZ="2"          
      DirectionX="0" DirectionY="0" DirectionZ="-1"          
      Concentration="100" SpreadAngle="30" 
      Red="150" Green="150" Blue="150" />
  </Lights>
  
  <StaticObjects>
    <WorldObject>
      <ParentTransformGroup 
        Value11="1" Value12="0" Value13="0" Value14="0" 
        Value21="0" Value22="1" Value23="0" Value24="0" 
        Value31="0" Value32="0" Value33="1" Value34="0" 
        Value41="0" Value42="0" Value43="0" Value44="1"> 
        <ChildTransformGroup 
           Value11="1" Value12="0" Value13="0" Value14="0" 
           Value21="0" Value22="1" Value23="0" Value24="0" 
           Value31="0" Value32="0" Value33="1" Value34="0" 
           Value41="0" Value42="0" Value43="0" Value44="1">
           <Box 
             Width="0.12" Length="0.08" Height="0.10" 
             Red="200" Green="200" Blue="0" /> 
        </ChildTransformGroup>
      </ParentTransformGroup>
    </WorldObject>
  </StaticObjects>

  <Cameras>
    <Camera name="Camera 0">
      <TransformGroup 
        Value11="0.8338244" Value12="0.12909822" Value13="-0.53672206"          
        Value14="-1.4949298" Value21="-0.529671" Value22="0.4610073"          
        Value23="-0.71198374" Value24="-2.0976896" Value31="0.15551695"          
        Value32="0.87795556" Value33="0.45277873" Value34="1.1544305"          
        Value41="0.0" Value42="0.0" Value43="0.0" Value44="1.0" />
    </Camera>
  </Cameras>

</Scene>

Floor 要素

  <Floor Length="1.0" Width="1.0" 
    GifFilename="scenario/example/floor.gif" />

床画像を設定します。例えば、ライントレースをシミュレートする場合はラインの描かれた画像を用意します。

Length 属性
床の縦方向の長さを指定します。単位はメートルです。例えば、1.0と指定した場合は、1.0メートルとなります。
Width 属性
床の横方向の長さを指定します。単位は Length 属性と同じです。
GifFilename 属性
床画像のパスを指定します。パスは、LMS がインストールされたディレクトリからの相対パスです。「Gif」Filename という名前ですが、GIF 形式の他に、PNG 形式や JPEG 形式の画像も使えます。画像の大きさは、縦横ともにピクセル数が2の倍数でなければなりません。

光センサーで読み取った床の明るさは、床画像の明るさと等しくなります。しかし、現実には完全に白い紙はありませんし、マインドストーム本体などが床に影を落とします。シミュレータと現実とではまずこの部分で大きな違いが出てきます。

Lights 要素

  <Lights>
    <SpotLight 
      PositionX="-0.5" PositionY="0.5" PositionZ="1"          
      DirectionX="0.5" DirectionY="-.5" DirectionZ="-1"          
      Concentration="40" SpreadAngle="3" 
      Red="220" Green="50" Blue="50" />
    <SpotLight 
      PositionX="0" PositionY="0" PositionZ="2"          
      DirectionX="0" DirectionY="0" DirectionZ="-1"          
      Concentration="100" SpreadAngle="30" 
      Red="150" Green="150" Blue="150" />
  </Lights>

光源を設定します。とりあえずは、上の例の通りで十分です。

ひとつひとつの光源は、SpotLight 要素で指定します。

PositionX, PositionY, PositionZ 属性
光源の位置を設定します。床の中心が原点です。x は右方向、yは上方向、zは手前方向に向かって増大します。単位はメートルです。例えば、「PositionX="0.5" PositionY="0.5" PositionZ="1.0"」の場合は、右上の隅の1m上に光源を置くことになります。
DirectionX, DirectionY, DirectionZ 属性
光源の発する光の方向を指定します。例えば、手前から奥の方向に照らす場合は、DirectionZ 属性を -1.0 に設定します。PositionX, PositionY, PositionZ に対応する属性に、正負を逆転した値を指定すれば、床の中心を照らす光になります。
Concentration 属性
光の強さを百分率で指定します。
SpreadAngle 属性
光の広がり具合を角度で指定します。
Red, Green, Blue 属性
光の色を指定します。各属性は0~255までの値で、大きな値ほど色が濃くなります。光の色を指定する属性ですが、色料の三原色に基づいて指定します。

SpotLight 属性を並べれば、複数の光源を配置することができます。

StaticObjects 要素

  <StaticObjects>
    <WorldObject>
      <ParentTransformGroup 
        Value11="1" Value12="0" Value13="0" Value14="0" 
        Value21="0" Value22="1" Value23="0" Value24="0" 
        Value31="0" Value32="0" Value33="1" Value34="0" 
        Value41="0" Value42="0" Value43="0" Value44="1"> 
        <ChildTransformGroup 
           Value11="1" Value12="0" Value13="0" Value14="0" 
           Value21="0" Value22="1" Value23="0" Value24="0" 
           Value31="0" Value32="0" Value33="1" Value34="0" 
           Value41="0" Value42="0" Value43="0" Value44="1">
           <Box 
             Width="0.12" Length="0.08" Height="0.10" 
             Red="200" Green="200" Blue="0" /> 
        </ChildTransformGroup>
      </ParentTransformGroup>
    </WorldObject>
  </StaticObjects>

物体を配置します。個々の物体は、WorldObject 要素で指定します。

WorldObject 要素内には、ParentTransformGroup 要素を記述し、その要素内には ChildTransformGroup 要素を記述します。そして、ChildTransformGroup 要素内に Box 要素を指定することで、物体を配置できます。

ParentTransformGroup 要素や ChildTransformGroup 要素では、物体の配置する位置を指定します。そのうち、ParentTransformGroup 要素は場面全体から見た物体の位置(ワールド座標)を、ChildTransformGroup 要素は物体を中心に見た位置(ローカル座標)を指定します。

ParentTransformGroup 要素と ChildTransformGroup 要素は属性が共通しています。それぞれの属性は、変換行列の要素を表します。

Value11Value12Value13Value14
Value21Value22Value23Value24
Value31Value32Value33Value34
Value41Value42Value43Value44

何も変換を行わない、つまり、中心に物体を配置する場合は次のような変換行列になります。

Value11 = 1Value12 = 0Value13 = 0Value14 = 0
Value21 = 0Value22 = 1Value23 = 0Value24 = 0
Value31 = 0Value32 = 0Value33 = 1Value34 = 0
Value41 = 0Value42 = 0Value43 = 0Value44 = 1

例えば、x, y, z 軸に沿った移動は、Value14, Value24, Value34 の値を変えることで行います。

Value11 = 1Value12 = 0Value13 = 0Value14 = dx
Value21 = 0Value22 = 1Value23 = 0Value24 = dy
Value31 = 0Value32 = 0Value33 = 1Value34 = dz
Value41 = 0Value42 = 0Value43 = 0Value44 = 1

ここで、dx, dy, dz は、メートル単位で指定します。

物体を回転させるには、以下の要素(回転行列R)を変更します。

Value11Value12Value13
Value21Value22Value23
Value31Value32Value33
x軸上の回転行列(RX)
Value11 = 1Value12 = 0Value13 = 0
Value21 = 0Value22 = cosφValue23 = -sinφ
Value31 = 0Value32 = sinφValue33 = cosφ
y軸上の回転行列(RY)
Value11 = cosφValue12 = 0Value13 = sinφ
Value21 = 0Value22 = 1Value23 = 0
Value31 = -sinφValue32 = 0Value33 = cosφ
z軸上の回転行列(RZ)
Value11 = cosφValue12 = -sinφValue13 = 0
Value21 = sinφValue22 = cosφValue23 = 0
Value31 = 0Value32 = 0Value33 = 1

各軸上の回転を合成するには、合成したい回転行列同士を乗じます。例えば、x 軸上の回転と y 軸上の回転を合成するには、R = RX × RY とします。

(;^ω^)行列演算をしないといけないので、ここらへんの設定は結構面倒です。

Box 要素では、物体の大きさなどを指定します。

Width 属性
物体の表面の横幅です。メートル単位です。
Height 属性
物体の高さです。単位は Width 属性と同じです。
Length 属性
物体の表面の縦幅です。単位は Width 属性と同じです。
Red, Green, Blue 属性
物体の色です。Light 要素の属性と同じです。

ChildTransformGroup 要素は複数並べることができます。そのため、複雑な形状の物体も定義することができます。

物体を置かない場合は、次のように StaticObjects 要素を定義します。

  <StaticObjects> </StaticObjects>

Cameras 要素

  <Cameras>
    <Camera name="Camera 0">
      <TransformGroup 
        Value11="0.8338244" Value12="0.12909822" Value13="-0.53672206"          
        Value14="-1.4949298" Value21="-0.529671" Value22="0.4610073"          
        Value23="-0.71198374" Value24="-2.0976896" Value31="0.15551695"          
        Value32="0.87795556" Value33="0.45277873" Value34="1.1544305"          
        Value41="0.0" Value42="0.0" Value43="0.0" Value44="1.0" />
    </Camera>
  </Cameras>

画面に場面を映すためのカメラを配置します。カメラは複数は位置することができ、LMS のメニューから切り替えることができます。とりあえずは、上の例の通りで十分です。

個々のカメラは、Camera 要素で定義します。name 属性で、カメラの名前を設定します。

Camera 要素では、TransformGroup 要素を定義することでカメラの位置を設定します。その属性は、StaticObjects 要素の ParentTransformGroup 要素や ChildTransformGroup 要素と同様です。ただし、回転行列R に次の行列Sを乗じる(R × S)と、カメラをズームすることができます。

Value11 = zValue12 = 0Value13 = 0
Value21 = 0Value22 = zValue23 = 0
Value31 = 0Value32 = 0Value33 = z

z は、ズームする倍率です。

参考文献

PR
●この記事にコメントする
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード
●この記事へのトラックバック
この記事にトラックバックする:
忍者ブログ [PR]
ブログ内検索
最近の状況
リンク
カレンダー
02 2024/03 04
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
使用許諾
最新コメント
(08/15)
(05/04)
(03/06)
(03/04)
(09/25)
最新トラックバック
ブログ内検索
最近の状況
リンク
カレンダー
02 2024/03 04
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
使用許諾
最新コメント
(08/15)
(05/04)
(03/06)
(03/04)
(09/25)
最新トラックバック