クリック座標で色を設定


クリックしたマウスの座標でモデルの色を設定します。

Java Applet の実行は、次のリンクをクリックして下さい。
クリック座標で色を変える

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

プログラムの作成

  1. メモ帳などでタイプして applet_click.java の名前で保存して下さい。
    //★ クリック座標で色を変える    前田 稔
    import java.applet.Applet;
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    import javax.media.j3d.*;
    import javax.vecmath.*;
    import com.sun.j3d.utils.universe.*;
    import com.sun.j3d.utils.geometry.*;
    import com.sun.j3d.utils.applet.MainFrame;
    
    public class applet_click extends Applet
    {   private SimpleUniverse universe = null;
        private Material material = new Material();
    
        // main Method
        public static void main(String[] args)
        {   new MainFrame(new applet_click(), 500, 500);  }
    
        // Constructor
        public applet_click() {  }
    
        // Applet 初期化
        public void init()
        {   setLayout(new BorderLayout());
    
            // Java3D 関係の設定
            GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
            Canvas3D canvas = new Canvas3D(config);
            add("Center", canvas);
    
            // マウスイベントが通知される
            canvas.addMouseListener(new MouseAdapter()
            {   public void mouseClicked( MouseEvent e )
                {   System.out.println("Mouse Click" + "  X=" + e.getX() + "  Y=" + e.getY());
                    material.setDiffuseColor(e.getX()/500.0f, e.getY()/500.0f, (e.getX()+e.getY())/1000.0f);
                }
            });
    
            // SimpleUniverseを生成
            universe = new SimpleUniverse(canvas);
            universe.getViewingPlatform().setNominalViewingTransform();
    
            // Scene を生成
            universe.addBranchGraph(createSceneGraph());
        }
    
        // Scene を生成
        public BranchGroup createSceneGraph()
        {   BranchGroup root = new BranchGroup();
            BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
    
            // 光源の設定
            DirectionalLight light = new DirectionalLight(new Color3f(1.0f, 1.0f, 1.0f),
                new Vector3f(0.0f, 0.0f, -1.0f));
            light.setInfluencingBounds(bounds);
            root.addChild(light);
    
            // Appearance(Material)生成
            material.setCapability(Material.ALLOW_COMPONENT_READ);
            material.setCapability(Material.ALLOW_COMPONENT_WRITE);
            material.setDiffuseColor( new Color3f(0.8f, 0.0f, 0.0f) );
            Appearance ap = new Appearance();
            ap.setMaterial(material);
    
            // モデルの生成
            Cone cone = new Cone( 0.4f, 0.8f, Primitive.GENERATE_NORMALS, ap);
    
            root.addChild(cone);
            return root;
        }
    
        // 終了処理
        public void destroy()
        {   universe.cleanup();  }
    }
    
  2. Java Applet を起動する HTMLファイルは、何時もと同じです。
    アプレットのサイズを 500*500 で設定して下さい。
    ソースプログラムをコンパイルして class オブジェクトを実行して下さい。
    Java Applet を使ったプログラムですが、コマンドラインから普通の Java と同様に実行することが出来ます。
    アプレットの実行は HTMLファイルをダブルクリックして起動して下さい。
    アプレットを実行しようとするとセキュリティの警告画面が表示されますが、解除して下さい。
    マウスでアプレットウインドウをクリックすると、座標によりモデルの色が変わります。

プログラムの説明

  1. 基本的な説明は ColorCube を自動的に回転する を参照して下さい。
    Material の設定を変えるので、SimpleUniverse に加えて Material も大域領域で宣言して下さい。
        public class applet_click extends Applet
        {   private SimpleUniverse universe = null;
            private Material material = new Material();
        
  2. canvas.addMouseListener() を定義して下さい。
    マウスがクリックされると mouseClicked() メソッドが呼ばれます。
    マウスの座標をコンソールに表示します。
    次にクリックされた座標を元に Material の DiffuseColor を修正します。
    500 はアプレットウインドウのサイズです。
            // マウスイベントが通知される
            canvas.addMouseListener(new MouseAdapter()
            {   public void mouseClicked( MouseEvent e )
                {   System.out.println("Mouse Click" + "  X=" + e.getX() + "  Y=" + e.getY());
                    material.setDiffuseColor(e.getX()/500.0f, e.getY()/500.0f, (e.getX()+e.getY())/1000.0f);
                }
            });
        
  3. createSceneGraph() メソッドです。
    Material の領域は大域領域で宣言されています。
    設定を変えるので ALLOW_COMPONENT_READ と ALLOW_COMPONENT_WRITE を許可して下さい。
    後は前回と同じ要領です。
        // Scene を生成
        public BranchGroup createSceneGraph()
        {   BranchGroup root = new BranchGroup();
            BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
    
            // 光源の設定
            DirectionalLight light = new DirectionalLight(new Color3f(1.0f, 1.0f, 1.0f),
                new Vector3f(0.0f, 0.0f, -1.0f));
            light.setInfluencingBounds(bounds);
            root.addChild(light);
    
            // Appearance(Material)生成
            material.setCapability(Material.ALLOW_COMPONENT_READ);
            material.setCapability(Material.ALLOW_COMPONENT_WRITE);
            material.setDiffuseColor( new Color3f(0.8f, 0.0f, 0.0f) );
            Appearance ap = new Appearance();
            ap.setMaterial(material);
    
            // モデルの生成
            Cone cone = new Cone( 0.4f, 0.8f, Primitive.GENERATE_NORMALS, ap);
    
            root.addChild(cone);
            return root;
        }
        

Java Game Program