マテリアルの設定

Cone(コーン)にマテリアルを設定して回転しながら描画します。

Java Applet の実行は、次のリンクをクリックして下さい。
マテリアルの設定

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

プログラムの作成

  1. メモ帳などでタイプして applet_cone.java の名前で保存して下さい。
    //★ Cone(コーン)を回転しながら描画する    前田 稔
    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.geometry.*;
    
    public class applet_cone extends Applet
    {
        private SimpleUniverse universe = null;
    
        // main Method
        public static void main(String[] args)
        {   new MainFrame(new applet_cone(), 250, 250);  }
    
        // Constructor
        public applet_cone() {  }
    
        // Applet 初期化
        public void init()
        {   setLayout(new BorderLayout());
    
            // Java3D 関係の設定
            GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
            Canvas3D canvas = new Canvas3D(config);
            add("Center", canvas);
    
            // SimpleUniverseを生成
            universe = new SimpleUniverse(canvas);
            universe.getViewingPlatform().setNominalViewingTransform();
            // FPS の設定(200 ミリ秒)
            universe.getViewer().getView().setMinimumFrameCycleTime(5);
    
            // Scene を生成
            universe.addBranchGraph(createSceneGraph());
        }
    
        // Cone の生成
        public BranchGroup createSceneGraph()
        {   BranchGroup objRoot = new BranchGroup();
            BoundingSphere bounds = new BoundingSphere(new Point3d(),100.0);
    
            // Light の設定
            DirectionalLight dlight =
              new DirectionalLight(true, new Color3f(1.0f,1.0f,1.0f), new Vector3f(0.3f,-0.3f,-0.3f));
            dlight.setInfluencingBounds(bounds);
            objRoot.addChild(dlight);
            AmbientLight alight = new AmbientLight();
            alight.setInfluencingBounds(bounds);
            objRoot.addChild(alight);
            // 座標変換の設定
            TransformGroup objTrans = new TransformGroup();
            objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
            objRoot.addChild(objTrans);
    
            // Cone を生成
            objTrans.addChild(new Cone(0.5f, 0.9f, Cone.GENERATE_NORMALS, createAppearance()));
    
            // モデルの回転設定
            Transform3D yAxis = new Transform3D();
            yAxis.setRotation(new AxisAngle4d(1.0, 0.0, 1.0, Math.PI/3));  // 回転軸を変更
            Alpha rotationAlpha = new Alpha(-1, 4000);                     // 繰り返し回数:無限  変化時間:4秒
            RotationInterpolator rotator =
                new RotationInterpolator(rotationAlpha, objTrans, yAxis, 0.0f, (float)Math.PI*2.0f);
            rotator.setSchedulingBounds(bounds);
            objRoot.addChild(rotator);
    
            objRoot.compile();
            return objRoot;
        }
    
        // Material の設定
        public Appearance createAppearance()
        {   Appearance app = new Appearance();
            Material mat = new Material();
            // デフォルト値
            mat.setLightingEnable(true);            // 照明が有効
            mat.setAmbientColor(0.2f, 0.2f, 0.2f);  // 環境光による色は   濃いグレー (AmbientLight を設定する)
            mat.setEmissiveColor(0.0f, 0.0f, 0.0f); // 発光による色は     黒(発光しない)
            mat.setDiffuseColor(1.0f, 1.0f, 1.0f);  // 拡散反射による色は 白
            mat.setSpecularColor(1.0f, 1.0f, 1.0f); // 鏡面反射による色は 白
            mat.setShininess(64.0f);                // 輝度は             64(中間値)
    
            app.setMaterial(mat);
            return app;
        }
    
        // 終了処理
        public void destroy()
        {   universe.cleanup();  }
    }
    
  2. Java Applet を起動する HTMLファイルは今までと同じ要領です。
    ウインドウサイズは 300*300 ぐらいに設定して下さい。
    ソースプログラムをコンパイルして class オブジェクトを実行して下さい。
    Java Applet を使ったプログラムですが、コマンドラインから普通の Java と同様に実行することが出来ます。
    アプレットの実行は HTMLファイルをダブルクリックして起動して下さい。
    アプレットを実行しようとするとセキュリティの警告画面が表示されますが、解除して下さい。

プログラムの説明

  1. createSceneGraph() メソッド以外は「ColorCube を自動的に回転する」と同じ要領です。
    基本的な説明は ColorCube を自動的に回転する を参照して下さい。
  2. Cone を生成する createSceneGraph() メソッドです。
    BranchGroup を生成して、ここに描画するシーンを設定します。
    new Transform3D() で回転軸を設定します。
    既定値ではY軸を中心に回転するのですが、コーンの全面が見えるように回転軸を少し傾けてみました。
        // Cone の生成
        public BranchGroup createSceneGraph()
        {   BranchGroup objRoot = new BranchGroup();
            BoundingSphere bounds = new BoundingSphere(new Point3d(),100.0);
    
            // Light の設定
            DirectionalLight dlight =
              new DirectionalLight(true, new Color3f(1.0f,1.0f,1.0f), new Vector3f(0.3f,-0.3f,-0.3f));
            dlight.setInfluencingBounds(bounds);
            objRoot.addChild(dlight);
            AmbientLight alight = new AmbientLight();
            alight.setInfluencingBounds(bounds);
            objRoot.addChild(alight);
            // 座標変換の設定
            TransformGroup objTrans = new TransformGroup();
            objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
            objRoot.addChild(objTrans);
    
            // Cone を生成
            objTrans.addChild(new Cone(0.5f, 0.9f, Cone.GENERATE_NORMALS, createAppearance()));
    
            // モデルの回転設定
            Transform3D yAxis = new Transform3D();
            yAxis.setRotation(new AxisAngle4d(1.0, 0.0, 1.0, Math.PI/3));  // 回転軸を変更
            Alpha rotationAlpha = new Alpha(-1, 4000);                     // 繰り返し回数:無限  変化時間:4秒
            RotationInterpolator rotator =
                new RotationInterpolator(rotationAlpha, objTrans, yAxis, 0.0f, (float)Math.PI*2.0f);
            rotator.setSchedulingBounds(bounds);
            objRoot.addChild(rotator);
    
            objRoot.compile();
            return objRoot;
        }
        
  3. モデルに Material を設定する createAppearance() メソッドです。
    モデルの色や光沢などを設定します。
    マテリアルの説明は 前田稔の超初心者のプログラム入門 から「DirectX9/球をライトで照らして View 座標を回転する」を参照して下さい。
        // Material の設定
        public Appearance createAppearance()
        {   Appearance app = new Appearance();
            Material mat = new Material();
            // デフォルト値
            mat.setLightingEnable(true);            // 照明が有効
            mat.setAmbientColor(0.2f, 0.2f, 0.2f);  // 環境光による色は   濃いグレー (AmbientLight を設定する)
            mat.setEmissiveColor(0.0f, 0.0f, 0.0f); // 発光による色は     黒(発光しない)
            mat.setDiffuseColor(1.0f, 1.0f, 1.0f);  // 拡散反射による色は 白
            mat.setSpecularColor(1.0f, 1.0f, 1.0f); // 鏡面反射による色は 白
            mat.setShininess(64.0f);                // 輝度は             64(中間値)
            // 既定値を変更
            mat.setDiffuseColor(0.7f, 0.7f, 0.0f);
    
            app.setMaterial(mat);
            return app;
        }
        
  4. DiffuseColor を次の値に設定して試してみて下さい。
    mat.setDiffuseColor(0.7f, 0.7f, 0.0f);
  5. DiffuseColor に加えて、AmbientColor を次の値に設定して下さい。
    mat.setAmbientColor(0.0f, 0.0f, 0.2f);
  6. 上記の変更に加えて、次の値を修正して下さい。
    mat.setSpecularColor(0.0f, 1.0f, 0.0f);
    mat.setShininess(12.0f);
  7. 現在 Light は白色に設定していますが、Light でモデルの色を設定することも出来ます。
    new DirectionalLight(true, new Color3f(1.0f,1.0f,1.0f), new Vector3f(0.3f,-0.3f,-0.3f));
    赤色の Light で正面から照らします。
    new DirectionalLight(true, new Color3f(1.0f,0.0f,0.0f), new Vector3f(0.0f, 0.0f, -1.0f));
    Light の座標や Light を複数個設定することで、モデルの様子が違って見えます。
    Light やマテリアルの設定を色々変えて試してみて下さい。

Java Game Program