クリック座標で色を設定


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

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

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

プログラムの作成

  1. メモ帳などでタイプして Click.java の名前で保存して下さい。
    //★ Click Test マウスのクリックを検出    前田 稔
    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.behaviors.picking.*;
    import com.sun.j3d.utils.geometry.*;
    
    public class Click extends JFrame
    {
        // main Method
        public static void main(String[] args)
        {   new Click();  }
    
        // Constructor
        public Click()
        {   // JFrame の初期化
            super("Mouse Listener test");
            setSize(500,500);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            // Java3D 関係の設定
            GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
            Canvas3D canvas = new Canvas3D(config);
            add(canvas);
    
            // マウスイベントが通知される
            canvas.addMouseListener(new MouseAdapter()
            {   public void mouseClicked( MouseEvent e )
                {   System.out.println("Mouse Click" + "  X=" + e.getX() + "  Y=" + e.getY());
                }
            });
    
            // SimpleUniverseを生成
            SimpleUniverse universe = new SimpleUniverse(canvas);
            universe.getViewingPlatform().setNominalViewingTransform();
    
            // Scene を生成
            universe.addBranchGraph(CreateScene());
            setVisible(true);
        }
    
        // Scene を生成
        public BranchGroup CreateScene()
        {   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);
    
            // モデルの生成
            Cone cone = new Cone( 0.4f, 0.8f, Primitive.GENERATE_NORMALS, createApp(1.0f, 0.0f, 0.0f));
            cone.setUserData("This is cone.");
    
            root.addChild(cone);
            return root;
        }
    
        // Material の設定
        private Appearance createApp(float r, float g, float b)
        {   Material material = new Material();
            material.setDiffuseColor(new Color3f(r, g, b));
            Appearance appearance =  new Appearance();
            appearance.setMaterial(material);
            return appearance;
        }
    }
    
  2. ソースプログラムをコンパイルしてクラスオブジェクトを実行して下さい。
    マウスをクリックすると、クリックされた座標がコンソール画面に表示されます。

プログラムの説明

  1. 基本的な説明は Java 3D で点を描画 を参照して下さい。
    canvas.addMouseListener() を定義して下さい。
    マウスがクリックされると mouseClicked() メソッドが呼ばれます。
    メソッドでは、クリックされたマウスの座標をコンソール画面に表示します。
    その他の処理はいつもと同じです。
        // Constructor
        public Click()
        {   // JFrame の初期化
            super("Mouse Listener test");
            setSize(500,500);
                ・・・
            // マウスイベントが通知される
            canvas.addMouseListener(new MouseAdapter()
            {   public void mouseClicked( MouseEvent e )
                {   System.out.println("Mouse Click" + "  X=" + e.getX() + "  Y=" + e.getY());
                }
            });
                ・・・
            setVisible(true);
        }
        
  2. CreateScene() メソッドでは Cone に Material を設定して、光源で照らして描画します。
    Cone(プリミティブ)の描画は プリミティブを描画 を参照して下さい。

クリックで色を変える

  1. クリックしたマウスの座標でモデルの色を設定してみましょう。
    モデルの色を指定する Material を大域領域で宣言して下さい。
        public class Click extends JFrame
        {   private Material material = new Material();
        
  2. マウスがクリックされると 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. CreateScene() メソッドです。
    Material の領域は大域領域で宣言されています。
    設定を変えるので ALLOW_COMPONENT_READ と ALLOW_COMPONENT_WRITE を許可して下さい。
    後はいつもと同じ要領です。
        // Scene を生成
        public BranchGroup CreateScene()
        {   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);
            cone.setUserData("This is cone.");
    
            root.addChild(cone);
            return root;
        }
        

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