■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
                      2008年10月26日

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

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


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


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


では、ソースコードを整理して、次のように書き換えましょう。
(今回は、ColorCubeJFrameクラスの全ソースコードを提示します。)

--------------------------------------------------------
package jp.co.flsi.lecture.java3d;

import javax.media.j3d.Alpha;
import javax.media.j3d.AmbientLight;
import javax.media.j3d.Appearance;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.DirectionalLight;
import javax.media.j3d.Material;
import javax.media.j3d.PhysicalBody;
import javax.media.j3d.RotationInterpolator;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.media.j3d.View;
import javax.swing.SwingUtilities;
import java.awt.BorderLayout;
import java.awt.GraphicsConfiguration;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.vecmath.AxisAngle4d;
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;
import javax.vecmath.Vector3d;
import javax.vecmath.Vector3f;

import com.sun.j3d.utils.behaviors.vp.OrbitBehavior;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.geometry.Sphere;
import com.sun.j3d.utils.universe.SimpleUniverse;

public class ColorCubeJFrame extends JFrame {

   private static final long serialVersionUID = 1L;

   private JPanel jContentPane = null;
   private Canvas3D leftEyeCanvas = null;
   private Canvas3D rightEyeCanvas = null;

   /**
    * @param args
    */
   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            ColorCubeJFrame thisClass = new ColorCubeJFrame();
            thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            thisClass.setVisible(true);
         }
      });
   }

   /**
    * This is the default constructor
    */
   public ColorCubeJFrame() {
      super();
      initialize();
   }

   /**
    * This method initializes this
    *
    * @return void
    */
   private void initialize() {
      this.setSize(380, 300);
      this.setContentPane(getJContentPane());
      this.setTitle("立方体と球体");
      GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
      leftEyeCanvas = new Canvas3D(config);
      rightEyeCanvas = new Canvas3D(config);
      leftEyeCanvas.setSize(180, 180);
      leftEyeCanvas.setMonoscopicViewPolicy(View.LEFT_EYE_VIEW);
      rightEyeCanvas.setSize(180, 180);
      rightEyeCanvas.setMonoscopicViewPolicy(View.RIGHT_EYE_VIEW);
      createScene();
      getJContentPane().add(leftEyeCanvas, BorderLayout.WEST);
      getJContentPane().add(rightEyeCanvas, BorderLayout.EAST);
   }

   /**
    * This method initializes jContentPane
    *
    * @return javax.swing.JPanel
    */
   private JPanel getJContentPane() {
      if (jContentPane == null) {
         jContentPane = new JPanel();
         jContentPane.setLayout(new BorderLayout());
      }
      return jContentPane;
   }
  
   /**
    * This method creates the scene
    *
    * @return void
    */
    private void createScene() {
       SimpleUniverse universe = new SimpleUniverse(leftEyeCanvas);
      BranchGroup group = new BranchGroup();
      group.addChild(createAndGetSatelliteGroup());
      group.addChild(createAndGetEarthGroup());
      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);
    }
   
   /**
    * This method creates the artificial satellite group
    *
    * @return javax.media.j3d.TransformGroup
    */
    private TransformGroup createAndGetSatelliteGroup() {
      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);
      return rotationTransGrp;
    }

   /**
    * This method creates the earth group
    *
    * @return javax.media.j3d.BranchGroup
    */
    private BranchGroup createAndGetEarthGroup() {
      BranchGroup group = 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);
      group.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);
      group.addChild(light);
      AmbientLight ambiLight = new AmbientLight(color);
      ambiLight.setInfluencingBounds(bounds);
      group.addChild(ambiLight);
      return group;
    }

}
--------------------------------------------------------


これで随分わかりやすくなったでしょう。Visual Editorもエラーを出さないですね。

以前のソースコードと照らし合わせて、何がどこに移動したか確認しておいて
ください。

メソッドのコメントはすべて簡単な英語にしているので、説明の必要はありませんね。
ところで、このコメントに

/**

というふうに*が2つ並んでいるところがありますが、これには特別な意味があり、
Javadocという機能でドキュメントの自動生成を行うために使います。これについては、
後ほど、リファレンス・マニュアルの自動生成という項目で詳しく説明する予定です。



さて、以上でJava 3Dの基本的な使い方はわかったと思いますので、ここでいったん
Java 3Dの説明を終わりにして、再度、ネットワーク系のプログラミングの話に
戻りたいと思います。



(次回に続く)


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

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