三次元の頂点座標を定義して立方体を描画します。
三角形ポリゴンを組み合わせた立方体の面に色を設定します。

Applet でプログラムを体験できます。
Applet のプログラム

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

プログラムの作成

  1. 三次元の頂点座標を定義して立方体を描画します。
    メモ帳などでタイプして BoxLine.java の名前で保存して下さい。
    //★ 頂点 index で立方体の線を描画    前田 稔
    import java.awt.*;
    import javax.swing.*;
    import javax.media.j3d.*;
    import javax.vecmath.*;
    import com.sun.j3d.utils.universe.*;
    
    public class BoxLine extends JFrame
    {
        // main Method
        public static void main(String[] args)
        {   new BoxLine();
        }
    
        // Constructor
        public BoxLine()
        {   // JFrame の初期化
            super("BoxLine");
            setSize(300,300);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            // Java3D関係の設定
            GraphicsConfiguration g_config = SimpleUniverse.getPreferredConfiguration();
            Canvas3D canvas = new Canvas3D(g_config);
            add(canvas);
    
            // SimpleUniverseを生成
            SimpleUniverse universe = new SimpleUniverse(canvas);
            universe.getViewingPlatform().setNominalViewingTransform();
    
            // 立方体の線を生成
            BranchGroup scene = CreateScene();
            universe.addBranchGraph(scene);
    
            // JFrame を表示
            setVisible(true);
        }
    
        // 立方体の線を生成
        private BranchGroup CreateScene()
        {   BranchGroup objRoot = new BranchGroup();
    
            // 立方体の頂点座標を定義
            Point3d[] vertices = new Point3d[8];
            vertices[0] = new Point3d(-0.5, 0.5, 0.5);  //左上前
            vertices[1] = new Point3d(-0.5, -0.5, 0.5); //左下前
            vertices[2] = new Point3d(0.5, -0.5, 0.5);  //右下前
            vertices[3] = new Point3d(0.5, 0.5, 0.5);   //右上前
            vertices[4] = new Point3d(-0.5, 0.5, -0.5); //左上奥
            vertices[5] = new Point3d(-0.5, -0.5, -0.5);//左下奥
            vertices[6] = new Point3d(0.5, -0.5, -0.5); //右下奥
            vertices[7] = new Point3d(0.5, 0.5, -0.5);  //右上奥
    
            // 立方体の線 Index を定義
            int[] indices = { 0, 1,  1, 2,  2, 3,  3, 0,
                              0, 4,  1, 5,  2, 6,  3, 7,
                              4, 5,  5, 6,  6, 7,  7, 4 };
    
            // 立方体を生成
            IndexedLineArray geometry =
            new IndexedLineArray(vertices.length, GeometryArray.COORDINATES, indices.length);
            geometry.setCoordinates(0, vertices);
            geometry.setCoordinateIndices(0, indices);
    
            // 回転を設定
            Shape3D shape = new Shape3D(geometry);
            Transform3D t3d = new Transform3D();
            t3d.setRotation(new AxisAngle4d(0.57, 0.57, -0.57, Math.PI / 4.0));
            TransformGroup trans = new TransformGroup(t3d);
    
            // BranchGroup に登録
            trans.addChild(shape);
            objRoot.addChild(trans);
    
            return objRoot;
        }
    }
    
  2. ソースプログラムをコンパイルして class オブジェクトを実行して下さい。
    立方体を構成する線が描画されたら完成です。

プログラムの説明

  1. このプログラムは CreateScene() メソッド以外は Point.java と同じ要領です。
    基本的な説明は Java 3D で点を描画 を参照して下さい。
  2. 12本の線で立方体を定義する CreateScene() メソッドです。
    BranchGroup を生成して、ここに描画するシーンを設定します。
    立方体の頂点座標は8個だけですが、立方体を線で定義するとなると頂点を結ぶ12本の線が必要です。
    線は2個の座標を持っているので「12本×2頂点=24」で24個の頂点座標を定義しなけれななりません。
    このようなときに威力を発揮するのが、頂点 Index です。
    具体的には、頂点座標の定義は8個だけで、12本の線の定義は頂点座標の番号(Index)を指定するのです。
    vertices[] で8個の頂点座標を定義します。
    立方体なので、Z座標が 0.5 と -0.5 に設定されていることに注目して下さい。
    indices[] で12本の線を Index で定義します。
    IndexedLineArray で立方体を構成する線を生成します。
    正面から描画すると矩形にしか見えないので少し座標を回転して描画しています。
    TransformGroup を BranchGroup に登録します。
        // 立方体の線を生成
        private BranchGroup CreateScene()
        {   BranchGroup objRoot = new BranchGroup();
    
            // 立方体の頂点座標を定義
            Point3d[] vertices = new Point3d[8];
            vertices[0] = new Point3d(-0.5, 0.5, 0.5);  //左上前
            vertices[1] = new Point3d(-0.5, -0.5, 0.5); //左下前
            vertices[2] = new Point3d(0.5, -0.5, 0.5);  //右下前
            vertices[3] = new Point3d(0.5, 0.5, 0.5);   //右上前
            vertices[4] = new Point3d(-0.5, 0.5, -0.5); //左上奥
            vertices[5] = new Point3d(-0.5, -0.5, -0.5);//左下奥
            vertices[6] = new Point3d(0.5, -0.5, -0.5); //右下奥
            vertices[7] = new Point3d(0.5, 0.5, -0.5);  //右上奥
    
            // 立方体の線 Index を定義
            int[] indices = { 0, 1,  1, 2,  2, 3,  3, 0,
                              0, 4,  1, 5,  2, 6,  3, 7,
                              4, 5,  5, 6,  6, 7,  7, 4 };
    
            // 立方体を生成
            IndexedLineArray geometry =
            new IndexedLineArray(vertices.length, GeometryArray.COORDINATES, indices.length);
            geometry.setCoordinates(0, vertices);
            geometry.setCoordinateIndices(0, indices);
    
            // 回転を設定
            Shape3D shape = new Shape3D(geometry);
            Transform3D t3d = new Transform3D();
            t3d.setRotation(new AxisAngle4d(0.57, 0.57, -0.57, Math.PI / 4.0));
            TransformGroup trans = new TransformGroup(t3d);
    
            // BranchGroup に登録
            trans.addChild(shape);
            objRoot.addChild(trans);
    
            return objRoot;
        }
        

立方体を描画

  1. 3角形を組み合わせて、各面に色を設定した立方体を描画してみましょう。
    CreateScene() メソッドを次のように修正し下さい。
    立方体の頂点座標は8個だけですが、3角形ポリゴンを組み合わせるとなると「6面×2個」で12個のポリゴンが必要です。
    各ポリゴンは3個の座標を持っているので「12ポリゴン×3頂点=36」で36個の頂点座標を定義しなけれななりません。
    このようなときに威力を発揮するのが、頂点 Index です。
    具体的には、頂点座標の定義は8個だけで、12個のポリゴンの定義は頂点座標の番号(Index)を指定するのです。
    vertices[] で8個の頂点座標を定義します。
    indices[] で12個のポリゴンを Index で定義します。
    Color3f[] で色の構成を定義して、これを使って各面の色を定義します。
    new IndexedTriangleArray() で立方体を構成するポリゴンを生成します。
    頂点に色を設定するので、フラグに GeometryArray.COLOR_3 を追加して下さい。
    立方体を正面から描画すると、単なる矩形にしか見えないので少し傾けて描画しています。
        // 立方体を生成
        private BranchGroup CreateScene()
        {   BranchGroup objRoot = new BranchGroup();
    
            // 立方体の頂点座標を定義
            Point3d[] vertices =
            {  new Point3d(-0.5, 0.5, 0.5),  new Point3d(-0.5, -0.5, 0.5),  //左上前  左下前
               new Point3d(0.5, -0.5, 0.5),  new Point3d(0.5, 0.5, 0.5),    //右下前  右上前
               new Point3d(-0.5, 0.5, -0.5), new Point3d(-0.5, -0.5, -0.5), //左上奥  左下奥
               new Point3d(0.5, -0.5, -0.5), new Point3d(0.5, 0.5, -0.5)  };//右下奥  右上奥
    
            // 立方体を三角ポリゴンで定義
            int[] indices = { 0, 1, 2,  0, 2, 3,    4, 5, 1,  4, 1, 0,
                              4, 0, 3,  4, 3, 7,    3, 2, 6,  3, 6, 7,
                              7, 6, 5,  7, 5, 4,    1, 5, 6,  1, 6, 2 };
    
            // 色の定義
            Color3f[] colors = { new Color3f(1.0f, 0.0f, 0.0f),    // red
                                 new Color3f(0.0f, 1.0f, 0.0f),    // green
                                 new Color3f(0.0f, 0.0f, 1.0f),    // blue
                                 new Color3f(0.0f, 1.0f, 1.0f),    // cyan
                                 new Color3f(1.0f, 0.0f, 1.0f),    // magenta
                                 new Color3f(1.0f, 1.0f, 0.0f) };  // yellow
    
            // 色の定義を使って、立方体の面の色を定義
            int[] colorIndices = { 0, 0, 0,  0, 0, 0,    1, 1, 1,  1, 1, 1,
                                   2, 2, 2,  2, 2, 2,    3, 3, 3,  3, 3, 3,
                                   4, 4, 4,  4, 4, 4,    5, 5, 5,  5, 5, 5 };
    
            // 立方体を生成
            IndexedTriangleArray geometry = new IndexedTriangleArray(
                vertices.length, GeometryArray.COORDINATES | GeometryArray.COLOR_3, indices.length);
            geometry.setCoordinates(0, vertices);
            geometry.setCoordinateIndices(0, indices);
            geometry.setColors(0, colors);
            geometry.setColorIndices(0, colorIndices);
    
            // 回転を設定
            Shape3D shape = new Shape3D(geometry);
            Transform3D t3d = new Transform3D();
            t3d.setRotation( new AxisAngle4d(0.57, 0.57, -0.57, Math.PI / 4.0));
            TransformGroup trans = new TransformGroup(t3d);
    
            // BranchGroup に登録
            trans.addChild(shape);
            objRoot.addChild(trans);
    
            return objRoot;
        }
        

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