複数のモデルを描画する

ColorCube と Sphere と Box を並べて描画します。

前田稔の超初心者のプログラム入門

プログラムの作成

  1. ColorCube と Sphere が重ならないように座標を移動して描画します。
    メモ帳などでタイプして Model3.java の名前で保存して下さい。
    //★ 複数のモデルを描画する
    import java.awt.*;
    import javax.swing.*;
    import javax.media.j3d.*;
    import com.sun.j3d.utils.universe.*;
    import com.sun.j3d.utils.geometry.*;
    import com.sun.j3d.utils.geometry.ColorCube;
    import javax.vecmath.*;
    
    public class Model3 extends JFrame
    {
        // main Method
        public static void main(String[] args)
        {   new Model3();  }
    
        // Constructor
        public Model3()
        {   // JFrame の初期化
            super("複数のモデルを描画");
            setSize(250,250);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            // Java3D 関係の設定
            GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
            Canvas3D canvas = new Canvas3D(config);
            add(canvas);
    
            // SimpleUniverseを生成
            SimpleUniverse universe = new SimpleUniverse(canvas);
            universe.getViewingPlatform().setNominalViewingTransform();
    
            // Scene を生成
            universe.addBranchGraph(CreateScene());
            setVisible(true);
        }
    
        // ColorCube と Sphere を並べて描画
        private BranchGroup CreateScene()
        {   BranchGroup root = new BranchGroup();
    
            Transform3D transform1 = new Transform3D();
            Transform3D transform2 = new Transform3D();
    
            // モデルの座標を移動
            transform1.set(new Vector3d(1.0, 1.0, -1.0));
            transform2.set(new Vector3d(0, 0, -1.0));
    
            // 座標変換の設定
            TransformGroup transnode1 = new TransformGroup(transform1);
            TransformGroup transnode2 = new TransformGroup(transform2);
    
            // モデルの色を設定
            Appearance appearance = new Appearance();
            appearance.setColoringAttributes(
                new ColoringAttributes(1.0f, 1.0f, 1.0f, ColoringAttributes.FASTEST));
    
            // ColorCube, Sphere を生成
            transnode1.addChild(new ColorCube(0.4));
            transnode2.addChild(new Sphere(0.4f, appearance));
    
            root.addChild(transnode1);
            root.addChild(transnode2);
            root.compile();
            return root;
        }
    }
    
  2. ソースプログラムをコンパイルしてクラスオブジェクトを実行して下さい。
    画面中央に Sphere(球)が、画面右上に ColorCube(立方体)が描画されます。

テストプログラム

  1. 最初に ColorCube(カラーキューブ)と Sphere(スフィア 球)をそのまま描画して見ましょう。
    CreateScene() メソッドを次のように修正して試してみて下さい。
    ColorCube は色がついているのですが、Sphere はそのままでは描画されないので Appearance で色を設定します。
    二個のモデルが中央に重なって描画されます。
        // ColorCube と Sphere が重なって描画される
        private BranchGroup CreateScene()
        {   BranchGroup root = new BranchGroup();
    
            // モデルの色を設定
            Appearance appearance = new Appearance();
            appearance.setColoringAttributes(
                new ColoringAttributes(1.0f, 1.0f, 1.0f, ColoringAttributes.FASTEST));
    
            root.addChild(new ColorCube(0.4));
            root.addChild(new Sphere(0.5f, appearance));
            root.compile();
            return root;
        }
        

プログラムの説明

  1. このプログラムは CreateScene() メソッド以外は Point.java と同じ要領です。
    基本的な説明は Java 3D で点を描画 を参照して下さい。
  2. Sphere と ColorCube を生成する CreateScene() メソッドです。
    BranchGroup を生成して、ここに描画するシーンを設定します。
    テストプログラムで示したように、そのまま描画したのでは二個のモデルが中央に重なって描画されます。
    そこでモデル毎に座標変換をして描画します。
    transform1, transnode1 が ColorCube で transform2, transnode2 が Sphere の座標変換です。
    Transform3D を生成して set() で座標を移動して TransformGroup に登録します。
    座標変換を設定した TransformGroup にプリミティブをアッドして描画します。
        // Scene の生成
        private BranchGroup CreateScene()
        {   BranchGroup root = new BranchGroup();
    
            Transform3D transform1 = new Transform3D();
            Transform3D transform2 = new Transform3D();
    
            // モデルの座標を移動
            transform1.set(new Vector3d(1.0, 1.0, -1.0));
            transform2.set(new Vector3d(0, 0, -1.0));
    
            // 座標変換の設定
            TransformGroup transnode1 = new TransformGroup(transform1);
            TransformGroup transnode2 = new TransformGroup(transform2);
    
            // モデルの色を設定
            Appearance appearance = new Appearance();
            appearance.setColoringAttributes(
                new ColoringAttributes(1.0f, 1.0f, 1.0f, ColoringAttributes.FASTEST));
    
            transnode1.addChild(new ColorCube(0.4));
            transnode2.addChild(new Sphere(0.4f, appearance));
    
            root.addChild(transnode1);
            root.addChild(transnode2);
            root.compile();
            return root;
        }
        

3個のモデル

  1. モデルの数が増えても同じ要領です。
    今度は ColorCube と Sphere と Box を並べて描画します。
    transform1, transnode1 が ColorCube で transform2, transnode2 が Sphere で transform3, transnode3 が Box の座標変換です。
    Transform3D を生成して set() で座標を移動して TransformGroup に登録します。
    座標変換を設定した TransformGroup にプリミティブをアッドして描画します。
        // ColorCube と Sphere と Box を並べて描画
        private BranchGroup CreateScene()
        {   BranchGroup root = new BranchGroup();
    
            Transform3D transform1 = new Transform3D();
            Transform3D transform2 = new Transform3D();
            Transform3D transform3 = new Transform3D();
    
            // モデルの座標を移動
            transform1.set(new Vector3d(1.0, 1.0, -1.0));
            transform2.set(new Vector3d(0, 0, -1.0));
            transform3.set(new Vector3d(-1.0, -1.0, -1.0));
    
            // 座標変換の設定
            TransformGroup transnode1 = new TransformGroup(transform1);
            TransformGroup transnode2 = new TransformGroup(transform2);
            TransformGroup transnode3 = new TransformGroup(transform3);
    
            // モデルの色を設定
            Appearance appearance = new Appearance();
            appearance.setColoringAttributes(
                new ColoringAttributes(1.0f, 1.0f, 1.0f, ColoringAttributes.FASTEST));
    
            transnode1.addChild(new ColorCube(0.4));
            transnode2.addChild(new Sphere(0.4f, appearance));
            transnode3.addChild(new com.sun.j3d.utils.geometry.Box(0.4f, 0.4f, 0.4f, appearance));
    
            root.addChild(transnode1);
            root.addChild(transnode2);
            root.addChild(transnode3);
            root.compile();
            return root;
        }
        
  2. 今回のプログラムはなるべく解りやすくするために、光源やマテリアルの設定を省略しています。
    また座標の回転も省略しました。
    光源やマテリアルを設定して、回転操作を追加して下さい。

超初心者のプログラム入門(Java2)