座標系の平行移動と回転
< 前へ [ トップへ ] 次へ >

 ここでは、座標系を動かすための基本的な操作である、平行移動と回転について解説します。
 RINEARN-X 3Dでは、座標系の移動や回転は非常に簡単に扱う事ができるよう工夫されています。基本的には、第1章で扱った立体モデルやポリゴンの操作とほとんど同じで、moveメソッドやrotメソッドを呼び出すだけで動かせます。ただ注意が必要な点として、回転には「自転」「公転」の2種類が存在します。


 平行移動


 座標系を平行移動するには、CoordinateSystem3DEGクラスの move メソッドを使用します。

move( double X変位, double Y変位, double Z変位 )

 例としてローカル座標系に座標軸モデルを配置し、X方向に 1 、Y方向に 2 、Z方向に 3 だけ平行移動させてみましょう。なお、この例文は既に前節で扱ったため、全く同一の結果になります。


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


import java.awt.Color;


public class Test{

  public static void main(String[] args){

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

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

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


    /*ローカル座標系を用意*/
    CoordinateSystem3DEG local
      = new CoordinateSystem3DEG();
    local.move( 1.0, 2.0, 3.0 ); /*平行移動*/
    world.add( local ); /*ワールド座標系上に配置*/


    /*座標軸モデル1*/
    AxisModel3DEG axis1 = new AxisModel3DEG();
    world.add( axis1 ); /*ワールド座標系上に配置*/
    screen.request( axis1 ); /*描画リクエスト*/

    /*座標軸モデル2*/
    AxisModel3DEG axis2 = new AxisModel3DEG();
    local.add( axis2 ); /*ローカル座標系上に配置*/
    screen.request( axis2 ); /*描画リクエスト*/

  }
}

▼実行結果


なお、座標系を配置(add)した後の平行移動操作も常に反映されます。


 回転

 RINEARN-X 3Dでは、座標系の回転操作に「自転」と「公転」の2種類をサポートしています。

・自転 ( spin )
 座標系の自転とは、自分自身の座標軸を回転軸とする回転です。例えばX軸まわりの自転を扱う spinX メソッドを呼び出すと、その座標系は、自身のX軸を回転軸に回転します。

・公転 ( rot )
 座標系の公転とは、自身が配置されている座標系(親座標系)の座標軸を回転軸とする回転です。例えばX軸まわりの公転を扱う rotX メソッドを呼び出すと、その座標系は、親座標系のX軸を回転軸に回転します。


 自転 ( spin )

 まず扱うのは自座標系上で定義される回転軸まわりの回転、自転です。
 RINEARN-X 3Dでは、公転・自転ともに非常に自由度の高い、強力なメソッドが用意されています。X軸などの座標軸周りの回転に加え、任意の軸ベクトルまわりの回転もサポートされています。

・座標軸まわりの自転
 もっとも基本的なのがX軸やZ軸などの座標軸まわりの自転です。X軸のまわりの自転は spinX メソッドを用います。同様にY軸まわりなら rotY 、Z軸まわりなら spinZ を用います。

spinX( double 回転角度 )

 回転方向はX軸の方向に右ねじをねじ込む方向を正とします。また回転角度はラジアン(rad)で指定します。なおラジアンとは、180度をπ(≒3.141592653589793)とする角度の表記法です。詳しい意味は割愛しますが、普通に使う分には単に値のスケールが違うだけです。具体的には180度でπラジアンなので、度をラジアンに変換するには π/180 をかければ良いだけです。例えば60度なら

60[°] = 60×(π/180) [rad] ( = π/3 [rad] )

となります。なお精密なπの値はJava言語のMathクラスに標準で用意されており、Math.PI として double 値が取得できます。
 それでは、例としてローカル座標系をワールド座標系の ( 0, 0, 3 ) に配置し、X軸まわりに60度だけ自転させてみましょう。


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


import java.awt.Color;


public class Test{

  public static void main(String[] args){

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

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

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


    /*ローカル座標系を用意*/
    CoordinateSystem3DEG local
      = new CoordinateSystem3DEG();
    double angle = Math.PI*60.0/180.0; /*60度のラジアン角*/
    local.move( 0.0, 0.0, 3.0 );
    local.spinX( angle ); /*X軸まわりの自転*/
    world.add( local ); /*ワールド座標系上に配置*/


    /*座標軸モデル1*/
    AxisModel3DEG axis1 = new AxisModel3DEG();
    world.add( axis1 ); /*ワールド座標系上に配置*/
    screen.request( axis1 ); /*描画リクエスト*/

    /*座標軸モデル2*/
    AxisModel3DEG axis2 = new AxisModel3DEG();
    local.add( axis2 ); /*ローカル座標系上に配置*/
    screen.request( axis2 ); /*描画リクエスト*/

  }
}


▼実行結果


・原点を通る任意の軸ベクトルまわりの自転
 続いて、自座標系の原点を通る任意の方向ベクトルを軸とした自転操作を説明しましょう。これには spin メソッドを使用します。

spin( double 回転角度,
       double 軸ベクトルX成分,
       double 軸ベクトルY成分,
       double 軸ベクトルZ成分
)

 回転方向は、軸ベクトルの向きに右ねじをねじ込む回転方向を正とします。
 例えば先ほどの例文プログラムで、原点を通り方向ベクトル( 1, 2, 3 )を持つ軸のまわりに60度自転させるには、spinX の部分を以下のように書き換えます。


/*60度のラジアン角*/
double angle = Math.PI*60.0/180.0;

/*ベクトルまわりの自転*/
local.spin( angle, 1.0, 2.0, 3.0 );


・任意の点を通り、任意の方向を向いた軸ベクトルまわりの自転
 最後に、自座標系の任意の点を通り、任意の方向を向いたベクトルを軸とする自転操作について説明しましょう。これは最も高度な回転ですが、同時に最も使用頻度の高い操作となるでしょう。とても便利な操作です。

spin( double 回転角度,
       double 軸ベクトル方向X成分,
       double 軸ベクトル方向Y成分,
       double 軸ベクトル方向Z成分,
       double 軸ベクトル始点X座標,
       double 軸ベクトル始点Y座標,
       double 軸ベクトル始点Z座標
)

 回転方向は、軸ベクトルの向きに右ねじをねじ込む回転方向を正とします。
 例えば、先ほどの例文プログラムで、点( 1, 0, 0, )を通り方向ベクトル( 1, 2, 3 )をもつ軸のまわりに60度自転させるには、spinXの部分を以下のように書き換えます。


/*60度のラジアン角*/
double angle = Math.PI*60.0/180.0;

/*自在自転*/
local.spin( angle, 1.0,2.0,3.0, 1.0,0.0,0.0 );



 公転 ( rot )


 続いて扱うのは親座標系上で定義される回転軸まわりの回転、公転です。RINEARN-X 3Dでは、公転・自転ともに非常に自由度の高い、強力なメソッドが用意されています。X軸などの座標軸周りの公転に加え、任意の軸ベクトルまわりの公転もサポートされています。

・座標軸まわりの公転
 もっとも基本的なのがX軸やZ軸などの座標軸まわりの公転です。X軸のまわりの公転は spinX メソッドを用います。同様にY軸まわりなら rotY 、Z軸まわりなら spinZ を用います。

spinX( double 回転角度 )

 回転方向はX軸の方向に右ねじをねじ込む方向を正とします。また回転角度はラジアン(rad)で指定します。
 それでは、例としてローカル座標系をワールド座標系の ( 0, 0, 3 ) に配置し、その上に座標軸モデルを配置して、親座標系のX軸まわりに60度だけ公転させてみましょう。


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


import java.awt.Color;


public class Test{

  public static void main(String[] args){

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

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

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


    /*ローカル座標系を用意*/
    CoodinateSystem3DEG local = new CoordinationSystem();
    local.move( 0, 0, 3 ); /*平行移動*/
    double angle = Math.PI*60.0/180.0;/*60度のラジアン角*/
    local.rotX( angle ); /*X軸まわりの自転*/
    world.add( local ); /*ワールド座標系上に配置*/


    /*座標軸モデル1*/
    AxisModel3DEG axis1 = new AxisModel3DEG()
    world.add( axis1 ); /*ワールド座標系上に配置*/
    screen.request( axis1 ); /*描画リクエスト*/

    /*座標軸モデル2*/
    AxisModel3DEG axis2 = new AxisModel3DEG()
    local.add( axis2 ); /*ローカル座標系上に配置*/
    screen.request( axis2 ); /*描画リクエスト*/

  }
}

▼実行結果


・原点を通る任意の軸ベクトルまわりの公転
 続いて、親座標系の原点を通る任意の方向ベクトルを軸とした公転操作を説明しましょう。これには rot メソッドを使用します。

rot( double 回転角度,
      double 軸ベクトルX成分,
      double 軸ベクトルY成分,
      double 軸ベクトルZ成分
)

 回転方向は、軸ベクトルの向きに右ねじをねじ込む回転方向を正とします。
 例えば、先ほどの例文プログラムで、原点)を通り方向ベクトル( 1, 2, 3 )をもつ軸のまわりに60度公転させるには、spinXの部分を以下のように書き換えます。


/*60度のラジアン角*/
double angle = Math.PI*60.0/180.0;

/*ベクトルまわりの公転*/
local.rot( angle, 1.0, 2.0, 3.0 );


・任意の点を通り、任意の方向を向いた軸ベクトルまわりの公転
 最後に、親座標系の任意の点を通り、任意の方向を向いたベクトルを軸とする公転操作について説明しましょう。これは最も高度な回転ですが、同時に最も使用頻度の高い操作となるでしょう。とても便利な操作です。

rot( double 回転角度,
      double 軸ベクトル方向X成分,
      double 軸ベクトル方向Y成分,
      double 軸ベクトル方向Z成分,
      double 軸ベクトル始点X座標,
      double 軸ベクトル始点Y座標,
      double 軸ベクトル始点Z座標
)

 回転方向は、軸ベクトルの向きに右ねじをねじ込む回転方向を正とします。
 例えば、先ほどの例文プログラムで、点( 1, 0, 0, )を通り方向ベクトル( 1, 2, 3 )をもつ軸のまわりに60度公転させるには、rotXの部分を以下のように書き換えます。


/*60度のラジアン角*/
double angle = Math.PI*60.0/180.0;

/*自在公転*/
local.rot( angle, 1.0,2.0,3.0, 1.0,0.0,0.0 );

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