■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
                      2008年07月20日

    楽しいJava講座 - 初心者から達人へのパスポート
                  vol.112

                                セルゲイ・ランダウ
 バックナンバー: http://www.flsi.co.jp/Java_text/
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■


[このメールマガジンは、画面を最大化して見てください。]


========================================================
◆ 01.3Dグラフィックスのアプリケーション開発
========================================================


では、前回最後に編集したinitialize()メソッド

--------------------------------------------------------
   private void initialize() {
      this.setSize(300, 200);
      this.setContentPane(getJContentPane());
      this.setTitle("少し回転したColorCube");
     
      GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
      Canvas3D canvas = new Canvas3D(config);
      SimpleUniverse universe = new SimpleUniverse(canvas);
      BranchGroup group = new BranchGroup();
      TransformGroup transGroup = new TransformGroup();
      transGroup.addChild(new ColorCube(0.3));
      Transform3D trans = new Transform3D();
      trans.setRotation(new AxisAngle4d(1.0, 1.0, 1.0, Math.PI / 4));
      transGroup.setTransform(trans);
      group.addChild(transGroup);
      universe.getViewingPlatform().setNominalViewingTransform();
      group.compile();
      universe.addBranchGraph(group);
      getJContentPane().add(canvas);
   }
--------------------------------------------------------

の編集内容を確認しましょう。

このソース・コードは、vol.110のときのソース・コードとは、

--------------------------------------------------------
      TransformGroup transGroup = new TransformGroup();
      transGroup.addChild(new ColorCube(0.3));
      Transform3D trans = new Transform3D();
      trans.setRotation(new AxisAngle4d(1.0, 1.0, 1.0, Math.PI / 4));
      transGroup.setTransform(trans);
      group.addChild(transGroup);
--------------------------------------------------------

の部分が異なります。

まず最初に、今回もTransformGroupのオブジェクトを使っていますが、前回とは
異なり、ViewingPlatformから取り出したものではありません。
つまり、視点の座標変換の情報を設定するためのものではありません。今回は
立方体の座標変換、つまり立方体のほうを移動するためのものです。

というわけで、TransformGroupのコンストラクターを呼び出して、新規にオブジェ
クトを生成しています。

そして、そのTransformGroupオブジェクトに対して、addChild()メソッドで立方体
を(子供のノードとして)追加しています。

その後、Transform3Dオブジェクトに対してsetRotation()というメソッド
を実行することによって座標変換を設定しています。
このsetRotation()というのは、回転移動を行わせるための座標変換を設定する
ものです。そして、ここでその引数に指定しているAxisAngle4dは、回転を表す
クラスで、回転軸と回転の角度の情報を保持します。
ここでは、原点から点(1.0, 1.0, 1.0)に向かうベクトルを回転軸とし、
回転の角度がπ/4(ここでπ(パイと読む)は円周率を表し、JavaではMathクラス
のスタティック・フィールドであるPI(パイ)つまりMath.PIが円周率の値を保持
しています)ラジアン(ラジアンは角度の単位で、πラジアンは180度に等しい。
したがって、π/4ラジアンは45度に等しい)になるようにAxisAngle4dのインスタ
ンス生成を行い、それをsetRotation()メソッドの引数にしています。
(なお、数学の標準的な角度の値では、正の数値は左回り(時計の針の回り方とは
逆)を表します。ベクトルをネジに見立てると、右ネジが進む向きがベクトルの向き
になり、その回転方向が正の角度に対する回転方向になります。)

そして、そのTransform3Dオブジェクトを先ほどのTransformGroupオブジェクトに
設定(setTransform()メソッドを使用)しています。

こうすれば、この立方体に回転(原点から点(1.0, 1.0, 1.0)に向かうベクトルを
回転軸とし、π/4ラジアンだけ回転させる)を行わせることができます。

というわけで、前回このプログラムを実行したとき、立方体が斜め方向の(見えない)
軸の回りに少し回転していたのがわかったでしょう。


ところで、TransformGroupオブジェクトはBranchGroupオブジェクトと違って、
宇宙につなぎとめることはできません。
というわけで、代わりにTransformGroupオブジェクトはBranchGroupオブジェクトに
子供のノードとして追加(addChild)しておき、BranchGroupオブジェクトを宇宙に
つなぎとめる(universe.addBranchGraph(group))という手順を踏むのです。


では、次にこの立方体に別の移動をおこなってみましょう。



では、今日はここまでにします。

何か、わからないところがありましたら、下記のWebページまで質問を
お寄せください。



┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
★ホームページ:
      http://www.flsi.co.jp/Java_text/
★このメールマガジンは
     「まぐまぐ(http://www.mag2.com)」
 を利用して発行しています。
★バックナンバーは
      http://www.flsi.co.jp/Java_text/
 にあります。
★このメールマガジンの登録/解除は下記Webページでできます。
      http://www.mag2.com/m/0000193915.html
★このメールマガジンへの質問は下記Webページにて受け付けて
 います。わからない所がありましたら、どしどしと質問をお寄
 せください。
      http://www.flsi.co.jp/Java_text/
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

Copyright (C) 2008 Future Lifestyle Inc. 不許無断複製