四面体の面に色を設定する

四面体の各面に色を設定して描画します。

Java Applet の実行は、次のリンクをクリックして下さい。
四面体の面に色を設定する

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

プログラムの作成

  1. メモ帳などでタイプして applet_men4.java の名前で保存して下さい。
    //★ 四面体の面に色を設定する    前田 稔
    import java.applet.Applet;
    import java.awt.*;
    import javax.swing.*;
    import javax.media.j3d.*;
    import javax.vecmath.*;
    import com.sun.j3d.utils.universe.*;
    import com.sun.j3d.utils.applet.MainFrame;
    import com.sun.j3d.utils.behaviors.mouse.*;
    
    public class applet_men4 extends Applet
    {
        // main Method
        public static void main(String[] args)
        {   new MainFrame(new applet_men4(), 300, 300);  }
    
        // Constructor
        public applet_men4() {  }
    
        // Applet 初期化
        public void init()
        {   setLayout(new BorderLayout());
    
            // Java3D関係の設定
            GraphicsConfiguration g_config = SimpleUniverse.getPreferredConfiguration();
            Canvas3D canvas = new Canvas3D(g_config);
            add(canvas);
    
            // SimpleUniverseを生成
            SimpleUniverse universe = new SimpleUniverse(canvas);
            universe.getViewingPlatform().setNominalViewingTransform();
    
            // シーンの生成
            universe.addBranchGraph(createSceneGraph());
            setVisible(true);
        }
    
        //  三角ポリゴンで四面体を生成
        private BranchGroup createSceneGraph()
        {   BranchGroup objRoot = new BranchGroup();
    
            // 四面体を構成するポリゴンの座標を定義
            Point3d[] vertices =
            {  new Point3d(0.0, 0.0, -0.4), new Point3d(0.0, 0.8, 0.2),  new Point3d(0.5, 0.0, 0.5),
               new Point3d(0.0, 0.0, -0.4), new Point3d(-0.5, 0.0, 0.5), new Point3d(0.0, 0.8, 0.2),
               new Point3d(0.0, 0.0, -0.4), new Point3d(0.5, 0.0, 0.5),  new Point3d(-0.5, 0.0, 0.5),
               new Point3d(0.5, 0.0,  0.5), new Point3d(0.0, 0.8, 0.2),  new Point3d(-0.5, 0.0, 0.5)
            };
    
            // ポリゴンの頂点座標の色を定義
            Color3f[] colors = { new Color3f(1.0f, 0.0f, 0.0f), new Color3f(1.0f, 0.0f, 0.0f), new Color3f(1.0f, 0.0f, 0.0f),   // red
                                 new Color3f(0.0f, 1.0f, 0.0f), new Color3f(0.0f, 1.0f, 0.0f), new Color3f(0.0f, 1.0f, 0.0f),   // green
                                 new Color3f(0.0f, 0.0f, 1.0f), new Color3f(0.0f, 0.0f, 1.0f), new Color3f(0.0f, 0.0f, 1.0f),   // blue
                                 new Color3f(1.0f, 1.0f, 0.0f), new Color3f(1.0f, 1.0f, 0.0f), new Color3f(1.0f, 1.0f, 0.0f) }; // yellow
    
            // Model の修正を許可
            TransformGroup trans = new TransformGroup();
            trans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
            trans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
    
            // 回転を設定
            BoundingSphere bounds = new BoundingSphere(new Point3d(), 100.0);
            MouseRotate rotator = new MouseRotate(trans);
            rotator.setSchedulingBounds(bounds);
            objRoot.addChild(rotator);
    
            // 移動を設定
            MouseTranslate translator = new MouseTranslate(trans);
            translator.setSchedulingBounds(bounds);
            objRoot.addChild(translator);
    
            // ズームを設定
            MouseZoom zoomer = new MouseZoom(trans);
            zoomer.setSchedulingBounds(bounds);
            objRoot.addChild(zoomer);
    
            // 四面体を生成
            TriangleArray geometry = new TriangleArray(vertices.length, GeometryArray.COORDINATES | GeometryArray.COLOR_3);
            geometry.setCoordinates(0, vertices);
            geometry.setColors(0, colors);
    
            // BranchGroup に登録
            Shape3D shape = new Shape3D(geometry);
            trans.addChild(shape);
            objRoot.addChild(trans);
            return objRoot;
        }
    }
    
  2. Java Applet を起動する HTMLファイルは、何時もと同じです。
    ソースプログラムをコンパイルして class オブジェクトを実行して下さい。
    Java Applet を使ったプログラムですが、コマンドラインから普通の Java と同様に実行することが出来ます。
    アプレットの実行は HTMLファイルをダブルクリックして起動して下さい。
    アプレットを実行しようとするとセキュリティの警告画面が表示されますが、解除して下さい。
     ・マウスの左ボタンを押しながらドラッグするとモデルが回転します。
     ・マウスの右ボタンを押しながらドラッグするとモデルが移動します。
     ・マウスの中央ボタンを押しながらドラッグするとモデルがズームイン・ズームアウトします。

プログラムの説明

  1. マウスを使うのでマウス関係のインポートが増えていますが createSceneGraph() メソッド以外は 「ColorCube を自動的に回転する」と同じ要領です。
    基本的な説明は ColorCube を自動的に回転する を参照して下さい。
  2. 四個の三角ポリゴンで四面体を定義する createSceneGraph() メソッドです。
    BranchGroup を生成して、ここに描画するシーンを設定します。
    Point3d[] で四面体を構成する三角ポリゴンの頂点座標を定義します。
    Window の座標系と三次元座標系では、向きが異なります。
        //  三角ポリゴンで四面体を生成
        private BranchGroup createSceneGraph()
        {   BranchGroup objRoot = new BranchGroup();
    
            // 四面体を構成するポリゴンの座標を定義
            Point3d[] vertices =
            {  new Point3d(0.0, 0.0, -0.4), new Point3d(0.0, 0.8, 0.2),  new Point3d(0.5, 0.0, 0.5),
               new Point3d(0.0, 0.0, -0.4), new Point3d(-0.5, 0.0, 0.5), new Point3d(0.0, 0.8, 0.2),
               new Point3d(0.0, 0.0, -0.4), new Point3d(0.5, 0.0, 0.5),  new Point3d(-0.5, 0.0, 0.5),
               new Point3d(0.5, 0.0,  0.5), new Point3d(0.0, 0.8, 0.2),  new Point3d(-0.5, 0.0, 0.5)
            };
        
  3. Color3f[] でポリゴンの頂点座標の色を定義します。
    各面ごとに色を設定するので、三角形ポリゴンに合わせて3個ずつ対になっています。
        // ポリゴンの頂点座標の色を定義
        Color3f[] colors = { new Color3f(1.0f, 0.0f, 0.0f), new Color3f(1.0f, 0.0f, 0.0f), new Color3f(1.0f, 0.0f, 0.0f),   // red
                             new Color3f(0.0f, 1.0f, 0.0f), new Color3f(0.0f, 1.0f, 0.0f), new Color3f(0.0f, 1.0f, 0.0f),   // green
                             new Color3f(0.0f, 0.0f, 1.0f), new Color3f(0.0f, 0.0f, 1.0f), new Color3f(0.0f, 0.0f, 1.0f),   // blue
                             new Color3f(1.0f, 1.0f, 0.0f), new Color3f(1.0f, 1.0f, 0.0f), new Color3f(1.0f, 1.0f, 0.0f) }; // yellow
        
  4. マウスでモデルを操作する設定は前と同じです。
    四面体を構成する三角形ポリゴンを生成します。
    頂点に色を設定するので、フラグに GeometryArray.COLOR_3 を追加して下さい。
    geometry.setColors(0, colors); で頂点に色を設定します。
    new Shape3D(geometry); で TriangleArray を引数にして Shape3D を生成します。
    TransformGroup に Shape3D を追加します。
    BranchGroup に TransformGroup を追加します。
            // 四面体を生成
            TriangleArray geometry = new TriangleArray(vertices.length, GeometryArray.COORDINATES | GeometryArray.COLOR_3);
            geometry.setCoordinates(0, vertices);
            geometry.setColors(0, colors);
    
            // BranchGroup に登録
            Shape3D shape = new Shape3D(geometry);
            trans.addChild(shape);
            objRoot.addChild(trans);
            return objRoot;
        }
        

Java Game Program