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

 ここでは、座標系を動かすための基本的な操作である、平行移動と回転について解説します。
 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 );

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


スポンサーリンク


スポンサーリンク

この階層の目次
お知らせ

Vnanoのソースコードと開発リポジトリをGitHubで公開
2018年09月30日 - 現在開発中の、ソフトウェア上でのスクリプト処理用途に向けた小型・軽量スクリプトエンジン「 Vnano 」のソースコード&リポジトリを公開しました。ビルド・使用方法や、現状の段階と今後などを解説します。

リニアングラフ3D&2D Ver.5.6 リリース! Java言語のプログラムからも制御可能に
2018年08月19日 - 約5年ぶりの大きなバージョンアップを迎えた、新しいリニアングラフ Ver.5.6の特徴をご紹介します。UIがリファインされ、Java言語でグラフ描画ライブラリとして使う事も可能になりました。

ライセンスの緩和方向への改訂を実施、条件を満たす場合のソフトの再配布などが可能に
2018年07月16日 - RINEARNでは2018年7月に、ソフトウェアライセンスの緩和方向への改訂を実施しました。新ライセンスでは、いくつかの条件を満たす場合において、ソフトの再配布などが無申請で可能になりました。

コードアーカイブ新着
配列を3Dグラフにアニメーションプロットする(点/線グラフ)

座標値配列の内容を、3次元の点/線グラフに連続でプロットし、アニメーションさせるサンプルプログラムです。
2018年11月14日
配列を2Dグラフにアニメーションプロットする

座標値配列の内容を、2次元グラフに連続でプロットし、アニメーションさせるサンプルプログラムです。
2018年11月13日
配列を3Dグラフにプロットする(曲面/メッシュグラフ)

座標値配列の内容を、3次元の曲面/メッシュグラフにプロットするサンプルプログラムです。
2018年11月12日
ファイルを3Dグラフにプロットする(曲面/メッシュグラフ)

座標値ファイルの内容を、3次元の曲面/メッシュグラフにプロットするサンプルプログラムです。
2018年11月11日
連番画像をアニメーション再生する簡易ツール

フォルダ内の連番画像ファイルを、動画への変換不要で、そのままアニメーションとして再生できる簡易ツールです。
2018年09月04日
公式Twitterアカウント

スポンサーリンク