ワールド座標系(世界座標系)
< 前へ [ トップへ ] 次へ >

 スクリーン座標系と同様に、ワールド座標系は、恐らく全ての3DCGシステムにおいて必要不可欠な、非常に重要な概念です。RINEARN 3D では、全ての立体は最終的にワールド座標系に配置されます。ワールド座標系を動かせば全ての立体が動きますし、ワールド座標系を回せば全ての立体が回ります。まさに「世界」の基準となる座標系なのです。
 ここでは、ワールド座標系の概念や利点、扱い方について解説します。


 ワールド座標系

 ワールド座標系は、全ての立体及びローカル座標系が配置される、土台のような座標系です。そしてワールド座標系自身は、スクリーン座標系上に直接配置されます。一般にスクリーン座標系上に立体を直接配置することは殆ど無く、立体やローカル座標系はすべてこのワールド座標系上に配置されます。

   
 このようにワールド座標系を用いる利点は、まず第一にカメラ視点の変更を容易にできる事があげられます。仮に多数の立体を直接スクリーン座標に配置してしまうと、視点を変更した際、全ての立体を構成する無数の頂点座標の位置関係を複雑に計算しなおさなければなりません。そこで全立体に共通の座標系、つまりワールド座標系を一枚噛ませて配置しておけば、視点変更の際はワールド座標系だけを動かせばよいので、非常に単純な作業ですみます。
 加えて、ワールド座標系がもたらす第二の利点として、仮想空間上においてカメラ視点に左右されない絶対的な座標が定義できるという点が挙げられます。例えば3Dシューティングゲームなど、広大な舞台において複雑に運動する物体を多数制御しなければならないような場合には、地面に固定された絶対的な座標系を基準として処理を記述するのが好ましい事がよくあります。
 なお、ここではスクリーン座標系にワールド座標系を配置する前提で解説しましたが、抽象化された3Dシステムの中には、ワールド座標系上にスクリーン座標系を配置する操作が可能な場合もあります(変換行列が順変換か逆変換かの違いだけで、処理に本質的な違いはありません)。そういった場合はスクリーン座標系をカメラ座標系と呼ぶ場合もあります。RINEARN 3Dでも、近い将来にこういったカメラ座標系的な配置機能が導入される予定です。


 CoordinateSystem3DEGクラス

 RINEARN-X 3Dでは、ワールド座標系もローカル座標系も、同一のオブジェクトで表されます。これらを表す座標系オブジェクトとして CoordinateSystem3DEG クラスが用意されています。CoordinateSystem3DEG クラスは、完全に座標系と同一視して抽象的に扱う事の出来る、強力なクラスです。

 このクラスのおかげで、プログラマは座標変換行列などの数学的な知識を一切要求されず、ただ座標形上に立体や別の座標系を貼り付けて、それらを組み立てていくだけで、非常に高度な動きを容易に表現することができるのです。
 なお、前節で扱ったスクリーン座標系を表すScreenSystem3DEGクラスは、このCoordinateSystem3DEGクラスを継承し、描画エンジンを内臓したものです。


 立体の配置

・ワールド座標系の取得
 ワールド座標系を自分で宣言しても良いのですが、ここでは第一章で使い慣れた Realtime3DFrame が内部に保持しているワールド座標系を呼び出し、使用してみましょう。これは Realtime3DFrame クラスの getWorldSystem( ) メソッドで取得することができます。


import rxvesapi.system3d.geometry.*;
import rxvesapi.system3d.renderer.*;
import rxvesapi.system3d.model.*;


public class Test{

  public static void main(String[] args){

    /*3D仮想空間*/
    Realtime3DFrame frame = new Realtime3DFrame();

    /*frameのワールド座標系を取得*/
    CoordinateSystem3DEG world = frame.getWorldSystem();

  }
}


・立体の配置
 座標系上に立体を配置するには、CoordinateSystem3DEGクラスの add メソッドを使用します。引数には配置したい立体モデルやポリゴン、構造体などを指定します。


ポリゴンを配置する場合:
add( Element3DEG 配置するポリゴン )

立体モデルを配置する場合:
add( Model3DEG 配置する立体モデル )

構造物を配置する場合:
add( Structure3DEG 配置する構造体 )

 ところで前節でも述べた通り、座標系上に立体を配置しただけでは、立体は画面に描画されない事にご注意ください。描画させるには描画リクエストが必要です。つまり座標系を用いて立体を配置し、画面に描画させるには、「 1.座標系上に配置する  2.スクリーン座標系に描画リクエストをする 」 という 2 つの手順が必要なのです。詳しくは前節をご参照下さい。


 実際に配置する

 ここでは例として、ワールド座標系の ( 0, 0, 0 ) に座標軸モデルを配置してみましょう。


import rxvesapi.system3d.geometry.*;
import rxvesapi.system3d.renderer.*;
import rxvesapi.system3d.model.*;


public class Test{

  public static void main(String[] args){

    /*3D仮想空間*/
    Realtime3DFrame frame = new Realtime3DFrame();

    /*frameのスクリーン座標系を取得*/
    ScreenSystem3DEG screen = frame.getScreenSystem();

    /*frameのワールド座標系を取得*/
    CoordinateSystem3DEG world = frame.getWorldSystem();

    /*座標軸モデル*/
    AxisModel3DEG axis = new AxisModel3DEG();



    /*ワールド座標系に座標軸モデルを配置*/
    world.add( axis );

    /*スクリーン座標系に描画リクエスト*/
    screen.request( axis );


  }
}


▼実行結果

 上のプログラムの実行結果は、Realtime3DFrame クラスの add メソッドで立体を配置した場合と、全く同一の結果になる事に気付かれたでしょうか。実は、第1章でさんざん用いてきた Realtime3DFrame クラスのaddメソッドは、引数に受け取った立体に対して、ワールド座標系への配置とスクリーン座標系への描画リクエストを代行していただけなのです。

< 前へ [ トップへ ] 次へ >