Sphere(球)で Material(マテリアル)の効果を確認します。
平行光源, 点光源, スポットライト, 環境光や半透明も説明します。

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

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

プログラムの作成

  1. Sphere(球)で Material(マテリアル)の効果を確認します。
    メモ帳などでタイプして View_Sphere.java の名前で保存して下さい。
    //★ Java3D で Sphere(球)を描画する
    import java.awt.*;
    import javax.swing.*;
    import javax.media.j3d.*;
    import com.sun.j3d.utils.universe.*;
    import com.sun.j3d.utils.geometry.*;
    import javax.vecmath.*;
    
    public class View_Sphere extends JFrame
    {
        // main Method
        public static void main(String[] args)
        {   new View_Sphere();  }
    
        // Constructor
        public View_Sphere()
        {   // JFrame の初期化
            super("View_Sphere test");
            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);
        }
    
        // Scene の生成
        public BranchGroup CreateScene()
        {   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);
    
            // 球を生成
            //objRoot.addChild(new Sphere(0.7f,createAppearance()));
            objRoot.addChild(new Sphere(0.7f,Sphere.GENERATE_NORMALS,50,createAppearance()));
            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;
        }
    }
    
  2. ソースプログラムをコンパイルして class オブジェクトを実行して下さい。
    Sphere(スフィア 球)が描画されたら完成です。

プログラムの説明

  1. このプログラムは CreateScene() と createAppearance() メソッド以外は View_Cylinder.java と同じ要領です。
    基本的な説明は 3Dモデルを描画 を参照して下さい。
  2. Sphere(スフィア 球)を生成する CreateScene() メソッドです。
    BranchGroup を生成して、ここに描画するシーンを設定します。
    DirectionalLight() で平行光源を設定します。
    new Sphere() で球を生成して BranchGroup に追加します。
    Sphere(0.7f,createAppearance() で生成するとポリゴンが荒く、ゴツゴツします。 (^_^;)
    そこで new Sphere(0.7f,Sphere.GENERATE_NORMALS,50,createAppearance() で生成しました。
    0.7 は球のサイズで 50 はポリゴンの数です。値が大きいほど滑らかになります。
    createAppearance() メソッドで、モデルに Material を設定します。
        // Scene の生成
        public BranchGroup CreateScene()
        {   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);
    
            // 球を生成
            //objRoot.addChild(new Sphere(0.7f,createAppearance()));
            objRoot.addChild(new Sphere(0.7f,Sphere.GENERATE_NORMALS,50,createAppearance()));
            return objRoot;
        }
        
  3. モデルに Material を設定する createAppearance() メソッドです。
    マテリアルはデフォルト(既定値)のままです。
        // 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;
        }
        
  4. DiffuseColor を次の値に設定して試してみて下さい。
    mat.setDiffuseColor(0.0f, 0.0f, 0.8f);
  5. DiffuseColor に加えて、AmbientColor を次の値に設定して下さい。
    mat.setAmbientColor(0.2f, 0.0f, 0.0f);
  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 やマテリアルの設定を色々変えて試してみて下さい。

スポットライト

  1. モデルの色を Light の光で設定してみましょう。
    また、平行光源(DirectionalLight)にプラスして、スポットライト(SpotLight)で照らします。
  2. CreateScene() と createAppearance() を次のように修正して下さい。
    平行光源の色を青(Color3f(0.0f,0.0f,1.0f)) に設定します。
    Material の DiffuseColor は省略したので、白(1.0f, 1.0f, 1.0f) になっています。
    Sphere(球)はライトの色が反映して青で描画されます。
        public BranchGroup CreateScene()
        {   BranchGroup objRoot = new BranchGroup();
    
            // Light の設定
            BoundingSphere bounds = new BoundingSphere(new Point3d(),100.0);
            DirectionalLight dlight =
              new DirectionalLight(true, new Color3f(0.0f,0.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);
    
            objRoot.addChild(new Sphere(0.7f,Sphere.GENERATE_NORMALS,50,createAppearance()));
            return objRoot;
        }
    
        // Material の設定
        public Appearance createAppearance()
        {   Appearance app = new Appearance();
            Material mat = new Material();
            mat.setAmbientColor(0.2f, 0.2f, 0.2f);
            mat.setShininess(100.0f);
            app.setMaterial(mat);
            return app;
        }
        
  3. スポットライトで照らしてみましょう。
    環境光の後に追加して下さい。
    光源の色は黄色(Color3f(1.0f, 1.0f, 0.0f)) に設定しています。
    パラメータを変えて試してみて下さい。
            // スポットライト
            SpotLight light = new SpotLight(
                new Color3f(1.0f, 1.0f, 0.0f),      // 光源の色
                new Point3f(0.5f, 0.0f, 0.8f),      // 光源の位置
                new Point3f(1.0f, 0.0f, 0.0f),      // 光の減衰係数
                new Vector3f(-0.5f, -0.5f, -0.7f),  // 光の方向ベクトル
                (float)(Math.PI / 2.0),             // スポットライトの角度
                0.0f );                             // スポットライトの収束度
            light.setInfluencingBounds(bounds);
            objRoot.addChild(light);
        

点光源

  1. 電球のような点光源(黄色)を設定します。
    CreateScene() 以外は前回と同じです。
    平行光源(青色)と、環境光は前回と同じです。
    PointLight で点光源を設定します。
    平行光源の反対側から黄色の点光源で照らしています。
        // Scene の生成
        public BranchGroup CreateScene()
        {   BranchGroup objRoot = new BranchGroup();
    
            // Light の設定
            BoundingSphere bounds = new BoundingSphere(new Point3d(),100.0);
            DirectionalLight dlight =
              new DirectionalLight(true, new Color3f(0.0f,0.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);
    
            // 点光源
            PointLight light = new PointLight(
                new Color3f(1.0f, 1.0f, 0.0f),      // 光源の色
                new Point3f(0.5f, 0.5f, 0.8f),      // 光源の位置
                new Point3f(0.7f, 0.0f, 0.0f) );    // 光の減衰定数、係数
            light.setInfluencingBounds(bounds);
            objRoot.addChild(light);
    
            objRoot.addChild(new Sphere(0.7f,Sphere.GENERATE_NORMALS,50,createAppearance()));
            return objRoot;
        }
        

半透明

  1. Sphere(球)に半透明の設定して描画します。
    CreateScene() では平行光源の色を白にして、背景を青色に設定しました。
    半透明が設定されているので、青色の背景に溶け込んで描画されます。
        // Scene の生成
        public BranchGroup CreateScene()
        {   BranchGroup objRoot = new BranchGroup();
    
            // Light の設定
            BoundingSphere bounds = new BoundingSphere(new Point3d(),100.0);
            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);
    
            // 背景色の設定
            Color3f bgColor = new Color3f(0.05f, 0.05f, 0.5f);
            Background bgNode = new Background(bgColor);
            bgNode.setApplicationBounds(bounds);
            objRoot.addChild(bgNode);
    
            objRoot.addChild(new Sphere(0.7f,Sphere.GENERATE_NORMALS,50,createAppearance()));
            return objRoot;
        }
        
  2. 半透明を設定する createAppearance() メソッドです。
    Material は既定値をそのまま使っています。
    光源の色も白色なので、本来なら Sphere(球)は白で描画されます。
    TransparencyAttributes で透明度を設定します。
    0.0f が透明度ゼロ(不透明)で、1.0f で見えなくなります。
        // Appearance の設定
        public Appearance createAppearance()
        {   Appearance app = new Appearance();
    
            // Material の設定
            Material mat = new Material();
            app.setMaterial(mat);
    
            // 透明度の設定
            TransparencyAttributes tattr =
                new TransparencyAttributes(TransparencyAttributes.BLENDED, 0.7f);
            app.setTransparencyAttributes(tattr);
            return app;
        }
        

マテリアル/光源

  1. マテリアルとは、ポリゴンの色を決める属性となるもので、反射特性、放射特性、反射係数、半透明特性などのことを言います。
  2. モデルを立体的に見せるには、物体にマテリアル(表面属性)を設定して光源で照らします。

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