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