トップページ > Java3D入門 > Java3Dの座標変換(3)

回転について

物体をまわしてみます

回転の座標変換をするためには、「回転軸」が必要です。 もっとも基本的な回転メソッドには3種類用意されています。それぞれ、X軸、Y軸、Z軸を回転軸とします。

引数の“angle”(アングル)は回転角を表します。単位はラジアンです。 回転方向の正の向きは、右ネジの向きです。 (右ネジを回して進む向きが、座標軸の正の向きと同じ場合を考えます。その時のネジの回転方向が 回転の正の向きとなっています。)


rotX(double angle)  :X軸を中心とした回転
rotY(double angle)  :Y軸を中心とした回転
rotZ(double angle)  :Z軸を中心とした回転

回転の座標変換のためのメソッドでは、引数がdouble型になっています。 Javaではπラジアンを“Math.PI”という形で使用することができます。 このMath.PIもdouble型で定義されています。ただし、基本的に Java3Dで使用するメソッドはfloat型の引数を取るものが多く、 かつ、float型で十分な場合が多数あるので今回のテストプログラムを含め これから書くプログラムはrotメソッドの引数をすべてfloatとしています。

ソースコード : Rot_test.java

//******************************************************************************
//Java3D Rot_test
//回転の座標変換
//******************************************************************************


//==============================================================================
//インポート・ファイル
import javax.media.j3d.*;

import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.Box;
import javax.vecmath.*;

import java.awt.*;

import javax.swing.*;



//==============================================================================
//メイン・クラス
public class Rot_test
{

 //=============================================================================
 //メイン・メソッド
 public static void main(String[] args)
 {
  Rot_test test = new Rot_test();
 }


 //=============================================================================
 //コンストラクタ
 public Rot_test()
 {

  //============================================================================
  //まずは、基礎フレームの設定。
  //============================================================================

  JFrame frame = new JFrame();
  frame.setSize(250,250);
  frame.setTitle("Rot_test");
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  JPanel cp = new JPanel();
  cp.setLayout(null);
  frame.add(cp);


  //============================================================================
  //次にJava3D関係の設定。
  //============================================================================

  GraphicsConfiguration g_config = SimpleUniverse.getPreferredConfiguration();
  Canvas3D canvas = new Canvas3D(g_config);
  canvas.setBounds(0,0,250,250);
  cp.add(canvas);

 
  //============================================================================
  //空のSimpleUniverseを生成。
  //============================================================================
 
  SimpleUniverse universe = new SimpleUniverse(canvas);
  frame.setVisible(true);


  //============================================================================
  //視点の設定
  //============================================================================
  ViewingPlatform camera = universe.getViewingPlatform();
  camera.setNominalViewingTransform();


  //============================================================================
  //ライトの設定
  //============================================================================

  Color3f light_color = new Color3f(1.0f,1.0f,1.0f);
  Vector3f light_direction = new Vector3f(0.2f,-0.2f,-0.6f);
  DirectionalLight light = new DirectionalLight(light_color,light_direction);
  BoundingSphere bounds = new BoundingSphere();
  light.setInfluencingBounds(bounds);
  BranchGroup group2 = new BranchGroup();
  group2.addChild(light);
  universe.addBranchGraph(group2);


  //============================================================================
  //Boxを作る
  //============================================================================

  Appearance appearance = new Appearance();
  Material material = new Material();
  material.setDiffuseColor(0.9f,0.75f,0.75f);
  appearance.setMaterial(material);
  Box box = new Box(0.3f,0.3f,0.3f,appearance);


  //============================================================================
  //BoxをTransfomrGroupに追加。さらにTransformGroupをBranchGroupへ登録。
  //============================================================================

  BranchGroup group1 = new BranchGroup();
  TransformGroup transform_group = new TransformGroup();
  transform_group.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  transform_group.addChild(box);
  group1.addChild(transform_group);
  universe.addBranchGraph(group1);

  //============================================================================
  //回転します。
  //============================================================================

  //Transform3Dを生成
  Transform3D transform1 = new Transform3D();

  //Transform3Dに、Y軸を回転軸として45度(π/4ラジアン)の回転を登録
  transform1.rotY(Math.PI/4);

  //TransformGroupにTransform3Dを登録。
  transform_group.setTransform(transform1);


 }

}
//ソースコードここまで。
//******************************************************************************

実行画面

Y軸を中心として回転している様子が確認できました。今回のソースコードについては、 コメントそのまんまのことしかやっていませんので解説を省きます。




前へ   次へ