title.png

Xi-TRACE超入門


用意していただくもの

 Xi-TRACEは、テキスト記述型のレイトレーシングソフトウェアです。従って、Xi-TRACEには、よくある3D-CADのようなインターフェイスはありません。Xi-TRACEのデータを記述するために、適切なテキストエディタを用意してください。ご自分で使い慣れたエディタがあればそれを使っていただければ結構です(エディタの使い方については、お使いのエディタのマニュアルをご覧ください)。


はじめに

 レイトレーシングというのは、3Dのコンピュータグラフィックスを生成するアルゴリズムの一種で、目に届いた光線(レイ;ray)を逆にたどって(トレース;trace)目に映った映像を生成するアルゴリズムです。レイトレーシングはそのアルゴリズム上、膨大な計算を必要とし、ちょっとした作品でも、計算させるには時間がかかります。代わりにレイトレーシングは、反射による写り込みや、透明な物体の屈折、精密な影などの表現が可能であり、「綺麗な静止画」を生成するアルゴリズムとして群を抜いています。
 さて、話しは変わりますが、本文中にMODELAという言葉が出てきます。これは、Xi-TRACEでレイトレーシングのデータを作成する時に使用する言語の名前で、MODELing LAnguageから名付けたスクリプト言語です。


一番簡単なサンプル

 まずは、Xi-TRACEでレイトレーシングをする上で、最小限、これだけは設定しなければならないパラメータを示す意味で、何もない空間に赤い色の球体を1個だけ配置した画像をレイトレーシングしてみましょう。

物体の定義

 MODELAで球面を定義するには、sphereという命令を使います。

  sphere x,y,z, r;

 図3-1に示すように、MODELAでは三次元空間の座標値を、左手系で指定します。
 左手系について少し説明します。まず、人指し指をy軸の正方向、中指をx軸の正方向に見立て、2本の指を直角にします。さらに、人指し指、中指の両方に直角になるように親指を立ててください。この時、親指の差している方向がz軸の正方向になるのですが、同じことを右手で作った時と左手で作った時とでは、ちょうどz軸の方向が逆になっているのがわかりますか?これが、右手系と左手系との違いです。

FIG3-1
図3-1

 sphere命令に限らず、各命令のパラメータはカンマ(,)で区切り、命令の最後にはセミコロン(;)を書きます。このsphere命令では、座標(x,y,z)を中心とする半径rの球面が定義されます。ここでは簡単のため、原点(0,0,0)を中心として、半径10の球面を使いましょう。

  sphere 0,0,0, 10;

属性の宣言

 物体は、全て属性(attribute)というものを持っています。属性とは、その物体の色や屈折率、反射率、透過率、カラーマッピングなどの情報のことで、物体が「どう見えるか」を決定する、非常に重要なパラメータです。ここでは、最低限設定すべきパラメータに関してのみ説明します。残りのパラメータについては、マニュアルをご覧ください。
 属性はattr命令を使って宣言します。

  attr name={ <パラメータ> };

 属性はそれぞれ名前を持っていて、この名前に対して属性を定義するようになっています。nameのところに書かれたものが属性名で、続く「={」と、「};」との間に様々なパラメータを設定します。ここでは赤色の属性を宣言してみます。それには、パラメータcolorと、diffで十分ですので、この2つについて説明します。

  attr name=
  {
    color r,g,b;
    diff Rdif,Iamb;
  };


 colorは、その名の通り、物体の色を決定するパラメータです。色はRGBで指定し、R、G、Bの各色の強度を0と1の間で設定します。色の強度は、0で一番暗くなり、1で一番明るくなります。従って、赤色にしたいと思えば、rを明るくしてg、bを暗くすれば良いので、rを1、g、bを0と設定します。

  color 1,0,0;

 少し暗い赤色でしたら、

  color 0.9,0,0;

ですし、灰色でしたら、

  color 0.5,0.5,0.5;

と言う感じで指定すれば良いでしょう。
 diffは、拡散反射(diffused reflection)に関するパラメータです。物体の色は普通、この拡散反射によって観測されます。拡散反射のし易さを百分率(パーセント)で表したものを拡散反射率と呼び、もし、拡散反射率;Rdifを0%に設定すると、その物体は黒色になります。今は赤い色にしたいので、拡散反射率を100%に設定しましょう。MODELAでは、百分率(パーセント)で指定するパラメータは全て0と1の間の数値で表現します。したがって、Rdifを100%にしたいなら、1を設定します。同じ様に、80%なら0.8、72.5%なら0.725となります。

  diff 1,Iamb;

 diffにおけるIambというパラメータは、非常に特殊な使い方なので、通常は0にする物だと考えてください。

  diff 1,0;

 これで赤い色を発色させるための属性を設定することができます。名前は、"Red"としておきましょう。

  attr Red=
  {
    color 1,0,0;
    diff 1,0;
  };


 この属性を先程の球面に適応する方法は簡単です。球面を定義する前に、属性を宣言しておけば良いのです。

  attr Red=
  {
    color 1,0,0;
    diff 1,0;
  };
  sphere 0,0,0, 10;


 これでsphereの色(属性)は、"Red"になります。

環境の設定

 ここでお話しする「環境」は、レイトレーシングの中の世界、たった今、赤い色を設定したり、半径10の球面を配置したりした、その世界の「環境」設定のことです。たとえば、背景を何色にするかとか、周囲から来る光の強さをどれくらいにするか、などが環境設定に含まれます。MODELAには、環境一般に関して一括して指定する、ambi命令があります。

  ambi index, sky_r,sky_g,sky_b, Iamb, half,Tdif;

 パラメータを1つ1つ説明して行きましょう。indexは、空間の屈折率です。今作っているCGの「世界」を我々が普通に暮らしている、この地球上を想定するなら、空間は空気で満たされており、空気の屈折率は、1.000294といった値ですから、まあ、1に設定しておけば良いでしょう。もし、海の中など、水中のCGを作ろうとしているなら、水の屈折率は1.33なので、indexは1.33に設定します。

  ambi 1, sky_r,sky_g,sky_b, Iamb, half,Tdif;

 次の(sky_r,sky_g,sky_b)は、背景の色です。要は、どの物体とも交点を持たなかった視線はこの色になるわけです。今はとりあえず、灰色を設定しておきましょう。デフォルトの状態では、色はRGB色座標系で設定しますので、灰色は、(0.5,0.5,0.5)となります。

  ambi 1, 0.5,0.5,0.5, Iamb, half,Tdif;

 Iambは、環境から来る光の強さです。図3-2に示すように、環境から来る光には、やってくる方向も、遮る物体もありませんので、後で設定(説明)する光線源からの光に対して、下駄として働きます。つまり、光線源からの光が遮られて暗く影になるような所でも、この環境から来る光の分だけは明るく照らされることになります。

FIG3-2
図3-2

 設定値ですが、例えば、明るい部屋の中や、曇りの日の屋外などを表現しようとするときには、0.4〜0.6位の大き目の値にします。曇りの日には、太陽からの光が雲で一旦散乱されて、いろんな方向からとんでくる光が増えるためです。部屋の中なども、電灯の光が壁や天井などで散乱されるので、Iambにあたる光の成分が多くなります。Iambをどの位の値にすれば良いか、決定するのに悩んだら、0〜0.2位の小さな値を設定しておけば良いでしょう。一度レイトレーシングしてみて、とくに影の感じが不自然に思えたら、少し大きな値を設定してみましょう。少し慣れが必要ですが、難しいことはありません。

  ambi 1, 0.5,0.5,0.5, 0.2, half,Tdif;

 halfとTdifについては、ここでは省略します。詳しくは、マニュアルをご覧ください。この2つのパラメータを無効にする設定値は、0です。

  ambi 1, 0.5,0.5,0.5, 0.2, 0,0;

視野の設定

 次のステップは、視野の設定です。つまり、ここまで設定してきたCGの世界の、「なに」を「どの位置」から「どんな大きさ」で、「どこを上に」して見るのか、を設定します。
 命令はviewと言います。

  view wid/2, top_x,top_y,top_z, ref_x,ref_y,ref_z, eye_x,eye_y,eye_z;

 図3-3に視野と各パラメータとの関係を示します。

FIG3-3
図3-3

 それでは、考え方の順番にそって説明していくことにしましょう。まず、「なに」を見るのか?自分が一番注目したい点、つまり、画面の真ん中に持ってきたい点のことを注目点、あるいは参照点とよび、(ref_x,ref_y,ref_z)と表現しています。先程作った球体は、原点(0,0,0)に配置したので、原点に注目すれば、球体は、画面の中央に描画されることになりますから、参照点は(0,0,0)に設定しましょう。

  view wid/2, top_x,top_y,top_z, 0,0,0, eye_x,eye_y,eye_z;

 今設定した参照点を「どの位置」から見るのか?この位置のことを視点と呼び、ここでは、(eye_x, eye_y, eye_z)で表現されています。
 さて、ここで考えてみてください、直径20mm(2cm)程のビー玉があったとしましょう。これを2kmも3kmも離れたところから、超々望遠レンズで覗く人って、はたしているのでしょうか?
 今、作った球体は、半径を10としました。「10」という数字には単位が付いていませんが、そんなものは、CGの世界では勝手に付ければ良いのです。10mmと思っても、10cmでも、10mでも、10kmでも、誰も文句は言いません、架空の世界ですから。自分が考え易い単位を設定すれば良いでしょう。
 ビー玉の例から、先程の球体の半径を10mmと考えましょうか、どれ位離れて眺めますか?300mm(30cm)ほど離れることにしましょうか。幸い、球体には方向性がありません。ということは、どの方向から見ても見える形は同じですので、参照点から、z軸上を300(mm)離れた点(0,0,300)を視点としましょう。

  view wid/2, top_x,top_y,top_z, 0,0,0, 0,0,300;

 次は「どんな大きさ」で見るのか?ですね。先程作った球体は、半径を10としました。そして、この球体の中心に注目するようにviewを設定しましたね。球体は、半径10、直径20ですから、画面の横幅を20に設定すれば、画面一杯に球体が表示されるはずです。ただ、これでは画面のほぼ全体が球体(の一部)で埋まってしまいますので、少し余裕をもって、画面の幅を30位にします。今決めた30という値は、画面の横幅(wid)です。view命令で設定するときには、画面の横幅の1/2(wid/2)を使いますので、ここには15を設定します。

  view 15, top_x,top_y,top_z, 0,0,0, 0,0,300;

 最後に「どこを上に」して見るのか?画面の中で、「上」にしたい方向を設定します。今回は球体が1個だけですので、どの方向を「上」にしても見え方は変わりませんので、今回は、y軸の正の方向(0,1,0)を「上」にして見ることにします。これでviewの全てのパラメータが埋まりました。

  view 15, 0,1,0, 0,0,0, 0,0,100;

光線源の設定

 さて、今回のサンプルを完成させる最後の項目は、光線源です。X-TRACEでは、3種類の光線源が使えて、それぞれに少しづつ性格が違います。ここでは、太陽のような光線源をシミュレートする、平行光線源、infの使い方をご紹介しましょう。infのパラメータは次のようになっています。

  inf a,b,c, r, Ir,Ig,Ib;

 この光線源は、無限に遠いと考えられる所に存在する光線源からの光をシミュレートする物です。従って、光線源の位置を設定することができません。座標値が「無限大∞」になってしまうからです。そこで、この光線源の設定には、光線源の中心が存在する方向を、ベクタ(a,b,c)で指定します。先程の球体を、向かって右斜め後、上方から照らすようにするなら、光線源は、(1,1,1)の方向にあれば良いですね。

  inf 1,1,1, r, Ir,Ig,Ib;

 見掛けの大きさ;rは、図3-4に示すように光線源自体を見たときの角度で、単位は「度(degree)」です。先程決定したばかりの光線源の存在する方向は、視点の後側になるため、光線源自体が視界に入ってくることはありません。この場合、見掛けの大きさは0に設定しても構いません。

FIG3-4
図3-4

 参考までに、作者が良く使う平行光線源の見掛けの大きさをご紹介しましょう。それは、太陽や月の見掛けの大きさで、これはだいたい0.267になります(atan(0.7×106/(1.5×108))=0.267; 太陽の赤道半径0.7×106km、太陽と地球との距離1.5×108km)。今回は、どうせ光線源自体が見えることはないので、0で良いのですが、イメージは大切ですので、この値を使っておきましょう。「右斜め後、上方から太陽に照らされる、赤い球体」と言うイメージです。

  inf 1,1,1, 0.267, Ir,Ig,Ib;

 あとは光線源の光の強度(Ir,Ig,Ib)ですが、「太陽」をイメージしたのですから、色は白色です。光の強度は、属性のところの物体の色と同じで、0〜1の間で強度を表現します。晴れの日の「太陽」のイメージで、一番明るく、(1,1,1)に設定しましょう。

  inf 1,1,1, 0.267, 1,1,1;

まとめ

 1個の球体を表示するための、最低限の定義と設定が終わりました。まとめてみましょう。

  attr Red=
  {
    color 1,0,0;
    diff 1,0;
  };
  sphere 0,0,0, 10;
  ambi 1, 0.5,0.5,0.5, 0.2, 0,0;
  view 15, 0,1,0, 0,0,0, 0,0,100;
  inf 1,1,1, 0.267, 1,1,1;


 これをこのままファイルに納めてX-TRACEに読み込ませても「X-TRACEのファイルではない」といって、はじかれてしまうでしょう。X-TRACEでは、全てのファイルは、ある命令で始まっていなければなりません。その命令は、まさにそのまま、「xtrace」です。今は難しいことは考えず、とにかく、ファイルの頭にxtrace命令を置いて、記述全体を中括弧「{}」で括ってください。

  xtrace
  {
    attr Red=
    {
      color 1,0,0;
      diff 1,0;
    };
    sphere 0,0,0, 10;
    ambi 1, 0.5,0.5,0.5, 0.2, 0,0;
    view 15, 0,1,0, 0,0,0, 0,0,100;
    inf 1,1,1, 0.267, 1,1,1;
  }


 xtrace命令には、特に意味は持ちませんが、注釈がわりの名前を付けることもできます。例えば次のように。

  xtrace "sample data no.1"
  {
    :
  }


レイトレーシングしてみる

 前節で作ったファイルに適切な名前を付けてセーブします。ここでは、"sample.xitr"という名前にしましょう。

  Xi-TRACEデータ:sample.xitr

 あとは、このファイルをXi-TRACEの「ファイルメニュー ⇒ 開く」で開くか、Xi-TRACEを起動しておいて、メニューのついているメインウインドウにDrag&Dropすれば、データを読み込みはじめます。記述に誤りがなければ、レイトレーシングを開始し、赤い球体の映像が生成されます。
 うまくできていれば、図4-1の様な絵ができあがるはずです。

FIG4-1
図4-1

おわりに

 このドキュメントは、ユーザの皆様へXi-TRACE記述言語MODELAへの足がかりを提供するためのものです。これだけでは、Xi-TRACEの実力の0.1%も使いこなせていません。Xi-TRACEは、マッピング、反射対、屈折、論理結合による複雑な物体定義、メタボール、ポリゴンなど、市販ソフトウェア級の機能を持ち、また、記述言語MODELAは、変数(ローカル/グローバル変数)、手続き(サブルーチン)、制御構文(if、while他)、文字マクロなど、C言語やPASCAL言語のような、構造化記述言語としての一通りの機能を備えた強力なツールなのです。
 本ドキュメントでXi-TRACEへの足がかりをつかんだら、マニュアルを見ながら、少しづつ作品に「色」を加えていってください。もし「これがやりたいのだが、方法がわからない」など、壁にぶつかったら、メールをください可能な限り対応します。そして、自信作が完成したら作者に送ってください。ユーザ様からの作品を見るのも作者の楽しみの一つなのです。


xitrace