■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 2008年07月13日 楽しいJava講座 - 初心者から達人へのパスポート vol.111 セルゲイ・ランダウ バックナンバー: http://www.flsi.co.jp/Java_text/ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ [このメールマガジンは、画面を最大化して見てください。] ======================================================== ◆ 01.3Dグラフィックスのアプリケーション開発 ======================================================== さて、前回作成したColorCubeJFrameでは、立方体を真正面から 見ていましたから、正方形に見えただけでした。 では、視点の位置をずらしてみましょう。 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(); group.addChild(new ColorCube(0.3)); // universe.getViewingPlatform().setNominalViewingTransform(); Transform3D trans = new Transform3D(); trans.setTranslation(new Vector3d(1.0, 0.7, 5.0)); TransformGroup transGroup = universe.getViewingPlatform().getViewPlatformTransform(); transGroup.setTransform(trans); universe.addBranchGraph(group); getJContentPane().add(canvas); } -------------------------------------------------------- (もちろん、赤いアンダーラインが付く部分に対しては、例によって コンテンツ・アシスト(Ctrl + スペース・キー)の機能を利用して、 import文を自動的に挿入するようにして下さい。) 要するに、 universe.getViewingPlatform().setNominalViewingTransform(); の代わりに Transform3D trans = new Transform3D(); trans.setTranslation(new Vector3d(1.0, 0.7, 5.0)); TransformGroup transGroup = universe.getViewingPlatform().getViewPlatformTransform(); transGroup.setTransform(trans); というコードを入れたわけです。 ここで、Transform3Dは3次元空間における(座標の)変換を表すクラスです。 また、Vector3dは3次元空間におけるベクトル(vector)を表すクラスでその コンストラクターの3つの引数x,y,z(ここでは、それぞれ1.0, 0.7, 5.0の値 を指定している)はdouble型です。このVector3dのdはdoubleの頭文字をとっ たものです。 また、TransformGroupは、前回お話したグループ(Group)の一種ですが、たん に図形のグループを構成するだけでなく、座標変換の情報も設定できるグループ です。 ┌補足─────────────────────────┐ ベクトル(vector)などの概念は、高校以上の数学で学ぶため、 中学生など、この種の数学を学んでいない人にとっては、何の 話かわからないかもしれません。 しかし、残念ながら、この講座で数学の講義までしていると時間 がかかり過ぎてしまうため、ここらへんの数学用語の解説は省略 させていただきます。 必要な人は市販の数学参考書などを使って独学してください。 └───────────────────────────┘ また、ViewingPlatformのgetViewPlatformTransform()というメソッドは ViewingPlatformが持っているTransformGroupオブジェクトを取り出すため のメソッドです。 (SimpleUniverseに用意されているViewingPlatformオブジェクト には、あらかじめTransformGroupオブジェクト(TransformGroupクラスの インスタンス)が設定されており、この中に視点が組み込まれています。 そして、このTransformGroupオブジェクトに座標変換を設定してやること によって、視点を移動させることができるのです。) また、Transform3DのsetTranslation()は、Transform3Dオブジェクトに 平行移動(translation)を設定するためのメソッドで、引数にVector3dオブ ジェクト(ベクトル)を指定すると、そのベクトル分だけ平行移動すること になり、ここでは、x軸の正の方向に1.0だけ、y軸の正の方向に0.7だけ、 さらにz軸の正の方向に5.0だけ平行移動することになります。 そして、TransformGroupのsetTransform()は、TransformGroupオブジェクト に変換を設定するメソッドで、ここでは先ほどの平行移動を表すTransform3D オブジェクトを設定しています。 つまり、ここでは視点がx軸の正の方向に1.0だけ、y軸の正の方向に0.7だけ、 さらにz軸の正の方向に5.0だけ平行移動することになります。 こうすると、立方体は視点(平たく言うと、これはあなたの目の位置を意味する) からz軸の負の方向に5.0だけ遠ざかり、y軸の負の方向(つまり、画面の下の方向) に0.7だけ移動し、x軸の負の方向(つまり、画面の左の方向)に1.0だけ移動し たように見えることになります。 では、ファイルを保管(Ctrl+S)した後、ColorCubeJFrameを実行してみてくだ さい。 立方体が以前より遠ざかって、画面の左下のほうに移動しているように見えま すね。 これは、プログラム上は立方体の位置はそのままで、視点のほうが移動して いるのですが、画面上は視点を中心としてものを見るようになっているので 立方体のほうが移動したかのように見えます。 この状態で立方体を見ると、斜めの方向に見ることになるので、正面だけで なく他の面も見えますね。今の状態では、立方体の上の面や右側の面も 見えているはずです。 これで、この図形が、立方体らしく見えましたね。 でも、通常は、このように視点の位置を変えるのではなく、図形あるいは物体 のほうを動かして見ます。 というわけで、次にこの立方体のほうを少し動かして見ましょう。 では今度は、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); } -------------------------------------------------------- 編集が終わったら、ファイルを保管(Ctrl+S)した後、ColorCubeJFrameを実行 してみてください。 では、今日はここまでにします。 何か、わからないところがありましたら、下記の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. 不許無断複製 |