■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
                      2008年10月19日

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

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


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


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


では、これらを踏まえて、ColorCubeJFrameのinitialize()メソッドを
下記のように書き換えましょう。

--------------------------------------------------------
   private void initialize() {
      this.setSize(380, 300);
      this.setContentPane(getJContentPane());
      this.setTitle("立方体と球体");
      GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
      Canvas3D leftEyeCanvas = new Canvas3D(config);
      Canvas3D rightEyeCanvas = new Canvas3D(config);
      leftEyeCanvas.setSize(180, 180);
      leftEyeCanvas.setMonoscopicViewPolicy(View.LEFT_EYE_VIEW);
      rightEyeCanvas.setSize(180, 180);
      rightEyeCanvas.setMonoscopicViewPolicy(View.RIGHT_EYE_VIEW);
      SimpleUniverse universe = new SimpleUniverse(leftEyeCanvas);
      BranchGroup group = new BranchGroup();
      TransformGroup transGroup = new TransformGroup();
      transGroup.addChild(new ColorCube(0.02));
      Transform3D trans = new Transform3D();
      trans.setTranslation(new Vector3d(0.7, 0.0, 0.0));
      transGroup.setTransform(trans);
      TransformGroup rotationTransGrp = new TransformGroup();
      rotationTransGrp.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
      Alpha alpha = new Alpha(-1, 5000);
      Transform3D axisLean = new Transform3D();
      axisLean.setRotation(new AxisAngle4d(1.0, 0.0, 0.0, Math.PI / 3));
      rotationTransGrp.setTransform(axisLean);
      RotationInterpolator rotator = new RotationInterpolator(
                                                alpha,
                                                rotationTransGrp,
                                                axisLean,
                                                0.0f,
                                                (float) Math.PI * 2.0f);
      BoundingSphere rotationBounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 1.0);
      rotator.setSchedulingBounds(rotationBounds);
      rotationTransGrp.addChild(transGroup);
      rotationTransGrp.addChild(rotator);
      group.addChild(rotationTransGrp);

      BranchGroup group2 = new BranchGroup();
     
      Color3f darkColor = new Color3f(0.0f, 0.0f, 0.0f);
      Color3f ambiColor = new Color3f(0.0f, 0.1f, 0.0f);
      Color3f diffuColor = new Color3f(0.0f, 0.6f, 0.0f);
      Material mat = new Material(ambiColor, darkColor, diffuColor, darkColor, 0.0f);
      Appearance appear = new Appearance();
      appear.setMaterial(mat);
      Sphere sphere = new Sphere(0.5f, Sphere.GENERATE_NORMALS, 100, appear);
      group2.addChild(sphere);
      Color3f color = new Color3f(1.5f, 1.5f, 0.0f);
      BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 1.0);
      Vector3f lightDirection = new Vector3f(-1.0f, -1.0f, -1.0f);
      DirectionalLight light = new DirectionalLight(color, lightDirection);
      light.setInfluencingBounds(bounds);
      group2.addChild(light);
      AmbientLight ambiLight = new AmbientLight(color);
      ambiLight.setInfluencingBounds(bounds);
      group2.addChild(ambiLight);
      group.addChild(group2);
      universe.getViewingPlatform().setNominalViewingTransform();
      View view1 = universe.getViewer().getView();
      view1.setMinimumFrameCycleTime(5);
      PhysicalBody observBody = view1.getPhysicalBody();
      observBody.setLeftEyePosition(new Point3d(-0.006,0.0, 0.0));
      observBody.setRightEyePosition(new Point3d(+0.006,0.0, 0.0));
      View view2 = new View();
      view2.setPhysicalBody(observBody);
      view2.setPhysicalEnvironment(view1.getPhysicalEnvironment());
      view2.attachViewPlatform(universe.getViewingPlatform().getViewPlatform());
      view2.addCanvas3D(rightEyeCanvas);
      OrbitBehavior behavior = new OrbitBehavior(leftEyeCanvas, OrbitBehavior.REVERSE_ALL);
      BoundingSphere behavBounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 1.0);
      behavior.setSchedulingBounds(behavBounds);
      universe.getViewingPlatform().setViewPlatformBehavior(behavior);
      group.compile();
      universe.addBranchGraph(group);
      getJContentPane().add(leftEyeCanvas, BorderLayout.WEST);
      getJContentPane().add(rightEyeCanvas, BorderLayout.EAST);
   }
--------------------------------------------------------

なお、vol.122では背景画像の表示の仕方をお話しましたが、背景(Background)の
画像はJava 3Dによる立体画像作成機能の対象にはなっていないため、今回のソース
コードの中では削除しました。


ソースコードの編集が終わったら、保管して実行してみてください。

左目用の画像が左側に、右目用の画像が右側に表示されますね。

これを立体的に見られるようにするために、紙の筒を2つ用意しましょう。
紙の筒は、厚紙などで直径4cm程度の円形の穴を持つ高さ30cm程度の円筒2本を作ります。
(要するに、片方の画像だけを覗くことができる大きさの円筒を2本作ります。なお、
台所用ラップなどの芯になっている円筒を利用すれば円筒を作る手間も省けるでしょう。)

これら2本の円筒をそれぞれ左目用に1本、右目用に1本使って画像を覗き込み、左目には
左側の画像だけが、右目には右側の画像だけが見えるようにします。

そして、それぞれの画像を重ね合わせるように見れば、立体に見えてきます。


どうですか。立体的に画像が浮かび上がって見えるでしょう。



(次回に続く)



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

何か、わからないところがありましたら、下記の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. 不許無断複製