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 要素は属性が共通しています。それぞれの属性は、変換行列の要素を表します。
Value11 | Value12 | Value13 | Value14 |
Value21 | Value22 | Value23 | Value24 |
Value31 | Value32 | Value33 | Value34 |
Value41 | Value42 | Value43 | Value44 |
何も変換を行わない、つまり、中心に物体を配置する場合は次のような変換行列になります。
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 |
例えば、x, y, z 軸に沿った移動は、Value14, Value24, Value34 の値を変えることで行います。
Value11 = 1 | Value12 = 0 | Value13 = 0 | Value14 = dx |
Value21 = 0 | Value22 = 1 | Value23 = 0 | Value24 = dy |
Value31 = 0 | Value32 = 0 | Value33 = 1 | Value34 = dz |
Value41 = 0 | Value42 = 0 | Value43 = 0 | Value44 = 1 |
ここで、dx, dy, dz は、メートル単位で指定します。
物体を回転させるには、以下の要素(回転行列R)を変更します。
Value11 | Value12 | Value13 |
Value21 | Value22 | Value23 |
Value31 | Value32 | Value33 |
- x軸上の回転行列(RX)
-
Value11 = 1 Value12 = 0 Value13 = 0 Value21 = 0 Value22 = cosφ Value23 = -sinφ Value31 = 0 Value32 = sinφ Value33 = cosφ - y軸上の回転行列(RY)
-
Value11 = cosφ Value12 = 0 Value13 = sinφ Value21 = 0 Value22 = 1 Value23 = 0 Value31 = -sinφ Value32 = 0 Value33 = cosφ - z軸上の回転行列(RZ)
-
Value11 = cosφ Value12 = -sinφ Value13 = 0 Value21 = sinφ Value22 = cosφ Value23 = 0 Value31 = 0 Value32 = 0 Value33 = 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 = z | Value12 = 0 | Value13 = 0 |
Value21 = 0 | Value22 = z | Value23 = 0 |
Value31 = 0 | Value32 = 0 | Value33 = z |
z は、ズームする倍率です。
参考文献
- Lego Mindstorms Simulator Creating LMS Scenes 上の例はここにある例に少し手を加えたものです。