■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 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. 不許無断複製 |