スクリーン座標系(画面座標系)
< 前へ [ トップへ ] 次へ >

 前回までは、座標系の概念や種類について、文章主体の説明を行ってきました。今節からは、実際に例題プログラミングを交えながら、RINEARN 3Dにおける座標系の扱いを習得していきましょう。
 まず始めに扱うのは、3Dコンピュータグラフィックスにおいて必要不可欠な座標系である、スクリーン座標系です。


 スクリーン座標系

・スクリーン座標系
 前節でも述べましたが、スクリーン座標系は、パソコンの画面に張り付いた形で存在する特別な座標系です。もう少し詳しく言うと、画面の中心を原点とし、画面右方向にX軸、上方向にY軸、手前方向にZ軸がある座標系として定義されています。ユーザーが方向設定を明示的に変更しない限り、いかなる時もこの位置関係は変わりません。

  
 スクリーン座標系で Z = 0 の面、即ち X-Y 平面は、パソコンの画面と一致します。そしてZ軸の正の方向にある領域は画面の手前、つまりユーザーのいる現実の世界です。反対にZ軸の負の方向にある領域は画面の奥、すなわち3D仮想空間の中です。このようにスクリーン座標系は、現実世界と3D仮想空間との間を繋ぐ座標系であると言えるでしょう。

・スクリーン座標系と描画エンジン
 さて、パソコンの画面上には、3D仮想空間の様子をスクリーン座標系のX-Y平面に投影した映像を描画する必要があります。この役目は一般の3Dシステムでは3D描画エンジンや、専用ハードウェアの役目ですが、RINEARN 3Dではスクリーン座標系が描画機能も兼ね備えたものとして設計されています。


 ScreenSystem3DEGクラス

 RINEARN-X 3Dではスクリーン座標系を表すオブジェクトとして ScreenSystem3DEG クラスが用意されています。
 もし自分で独自の表示システムを開発したい際には、ScreenSystem3DEG クラスを自分で宣言し、そこから出力されてくる3Dコンピュータグラフィックス画像をパソコン画面上に表示するように設計します。しかしそれに関する詳しい話は第3章に譲るとして、ここでは第1章に引き続き Realtime3DFrameクラスを使用しましょう。
 Realtime3DFrameクラスは3Dコンピュータグラフィックスを画面上に表示するシステムですから、当然ながら内部に画面座標系を保持しています。この画面座標系は getScreenSystem( ) メソッドで取得する事ができます。


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();


  }
}



 立体の配置と描画リクエスト

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


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

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

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

 ところで、座標系上に立体を配置しただけでは、立体は画面に描画されません。座標系上に配置するという行為は、単に立体の位置関係を指定しただけであり、描画登録はまた別の話なのです。立体を描画させたい場合は、スクリーン座標系にその立体を 「 描画リクエスト 」 しなければなりません。

・描画リクエストとキャンセル
 スクリーン座標系に立体を描画リクエストするには、ScreenSystem3DEGクラスの request メソッドを使用します。引数には描画させたい立体モデルやポリゴン、構造体などを指定します。


ポリゴンを描画させたい場合:
request( Element3DEG 配置するポリゴン )

立体モデルを描画させたい場合:
request( Model3DEG 配置する立体モデル )

構造物を描画させたい場合:
request( Structure3DEG 配置する構造体 )

なお、既に描画されている立体の描画リクエストを取り消すには、ScreenSystem3DEGクラスの cancel メソッドを使用します。引数には、描画リクエストを取り消したい立体モデルやポリゴン、構造体などを指定します。


 実際に配置する


 ここでは例として、スクリーン座標系の ( 0, 0, -10 ) に座標軸モデルを配置してみましょう。なお、( 0, 0, -10 ) とは、スクリーン座標系の原点つまり画面の中心から、「 X(右)方向に0, Y(上)方向に0, Z(手前)方向に-10 」 つまり画面奥へ 10 だけ行った位置を表します。
 なお、画面から 10 だけ奥へ配置する理由は、あまりにも画面に近過ぎると遠近感で大きくなりすぎて表示できないからです。


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();

    /*座標軸モデル*/
    AxisModel3DEG axis = new AxisModel3DEG();
    axis.move( 0.0, 0.0, -10.0 );


    /*スクリーン座標系に座標軸モデルを配置*/
    screen.add( axis );

    /*描画リクエスト*/
    screen.request( axis );


  }
}

▼実行結果


 マウスで視点を操作しても、座標軸モデルが定位置にへばりついて全く動かない様子が体感できたかと思います。このようにスクリーン座標系は常に画面に対して固定されているので、スクリーン座標系上に直接立体を配置すると、つねに視点から定位置にある立体を表現する事ができます。
 この方法は例えば、シューティングゲームなどで自分の操縦する戦闘機などを表示するのに向いているでしょう。また、常に立体を斜め上方から照らしたい場合などに、スクリーン座標系上に光源を配置するという手法も考えられます。

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