//************************************************ // マウスクリックでチキンも動かす //************************************************ /*・・・・・・・・・・・・・・・・・・・・・・ プログラムに必要なパッケージを取り込む ・・・・・・・・・・・・・・・・・・・・*/ import java.applet.Applet; import java.awt.*; 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.picking.behaviors.*; import com.sun.j3d.utils.applet.MainFrame; /*・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ アップレットの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・*/ public class MyMouthOpen2 extends Applet{ // 「MyMouthOpen」クラスの定義 /*・・・・・・・・・・・・・・・・・・ MyMouseOpenクラス内で共通のインスタンスを生成 ・・・・・・・・・・・・・・・・・*/ Chicken chicken = new Chicken(); double posx = -0.5; Transform3D transform3D2 = new Transform3D( ); Vector3d vector3d = new Vector3d( posx, 0.2, 0.0 ); TransformGroup transformGroup2 = new TransformGroup( ); public MyMouthOpen2(){ /*・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ シーングラフの構築 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・*/ Canvas3D canvas3D = new Canvas3D(SimpleUniverse.getPreferredConfiguration()); // Canvas3Dクラスのインスタンスを生成 this.setLayout(new BorderLayout()); // レイアウトの設定 canvas3D.addMouseListener(new mouseAdapter()); // マウスリスナーの登録 this.add(canvas3D, BorderLayout.CENTER); // キャンバスの位置の設定 SimpleUniverse simpleUniverse = new SimpleUniverse(canvas3D); // SimpleUniverseクラスのインスタンスを生成 simpleUniverse.getViewingPlatform().setNominalViewingTransform(); // 視点の移動 BranchGroup objRoot = new BranchGroup(); // BranchGroupクラスのインスタンスを生成 /*・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 光源の定義 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・*/ DirectionalLight directionalLight = new DirectionalLight(); // DirectionalLightクラスのインスタンスを生成 /*・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 描画範囲の定義 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・*/ BoundingSphere boundingSphere = new BoundingSphere(new Point3d(),1000.0); // 「boundengSphere」クラスのインスタンスを生成 /*・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 描画範囲の設定 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・*/ directionalLight.setInfluencingBounds( boundingSphere ); // 「directionalLight」の描画範囲として「boundingSphere」を設定 /*・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ Capabilityの設定 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・*/ chicken.setCapability(Chicken.ALLOW_TRANSFORM_WRITE); // 実行中のChickenへの書き込みを許可 chicken.setCapability(Chicken.ALLOW_TRANSFORM_READ); // 実行中のChickenの読み込みを許可 chicken.setCapability(Chicken.ENABLE_PICK_REPORTING); // 実行中にマウスの選択が行われているかどうか報告することを許可 chicken.transformGroup4.setCapability( Chicken.ALLOW_TRANSFORM_WRITE ); // chickenの上くちばしの座標値への書き込みを許可 transformGroup2.setCapability( Chicken.ALLOW_TRANSFORM_WRITE ); // chickenの座標値への書き込みを許可 /*・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ ピッキングの定義 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・*/ PickMouseBehavior behavior1 = new PickRotateBehavior(objRoot, canvas3D, boundingSphere); // 回転させるピッキングの定義 PickMouseBehavior behavior2 = new PickTranslateBehavior(objRoot, canvas3D, boundingSphere); // 移動させるピッキングの定義 PickMouseBehavior behavior3 = new PickZoomBehavior(objRoot, canvas3D, boundingSphere); // ズームさせるピッキングの定義 /*・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ ローカル座標系の設定・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・*/ // TransformGroup transformGroup2 = new TransformGroup( ); // TransformGroupクラスのインスタンスを生成 //・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 座標変換の定義 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ // Transform3D transform3D2 = new Transform3D( ); // Transform3Dクラスのインスタンスを生成 // Vector3d vector3d = new Vector3d( 0.5, 0.5, 0.0 ); // Vector3dクラスのインスタンスを生成 transform3D2.setTranslation( vector3d ); // 「transform3D2」の座標情報として「vector3d」を設定 //・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・座標変換の設定・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ transformGroup2.setTransform( transform3D2 ); // 「transformGroup」の座標変換として「transform3D2」を設定 //・・・・・・・・・・・・・・・・・・・・・・・・・・・ 物体等をシーングラフに追加 ・・・・・・・・・・・・・・・・・・・・・・・・・・・ transformGroup2.addChild( chicken ); // 「colorCube」を「transformGroup」に追加 objRoot.addChild( transformGroup2 ); // 「transformGroup」を「objRoot」に追加 //・・・・・・・・・・・・・・・・・・・・・・・・・・ 物体などをシーングラフに追加 ・・・・・・・・・・・・・・・・・・・・・・・・・・ objRoot.addChild(behavior1); // 「behavior1」を「objRoot」に追加 objRoot.addChild(behavior2); // 「behavior2」を「objRoot」に追加 objRoot.addChild(behavior3); // 「behavior2」を「objRoot」に追加 // objRoot.addChild(chicken); // 「chicken」を「objRoot」に追加 objRoot.addChild(directionalLight); // 「derectionalLight」を「objRoot」に追加 /*・・・・・・・・・・・・・・・・・・・・・・・ 物体側のツリーをシーングラフに追加 ・・・・・・・・・・・・・・・・・・・・・・・*/ simpleUniverse.addBranchGraph(objRoot); } /*・・・・・・・・・・・・・・・・・・・・・・・・ 作成したクラスファイルを呼び出し ・・・・・・・・・・・・・・・・・・・・・・・・*/ public static void main(String[] argV){ MyMouthOpen2 mouseOpen2 = new MyMouthOpen2(); // MyMouthOpen2クラスのインスタンスを生成 MainFrame mainFrame = new MainFrame(mouseOpen2, 500, 500); // MainFrameクラスのインスタンスを生成 } /*・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ マウスアダプタの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・*/ public class mouseAdapter extends MouseAdapter{ // 「mouseAdapter」クラスの定義 /*・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 変数の宣言 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・*/ int i=0; // int型の変数「i」を宣言し,初期値0を代入 int flag=1; // 変数「flag」を宣言し,初期値1を代入 int level=0; // 変数「level」を宣言し,初期値0を代入 Transform3D transform3D= new Transform3D(); // TransformGroupクラスのインスタンス「transform3D」を生成 /*・・・・・・・・・・・・・・・・・・・・・・・・・・・ イベントに対する処理を定義 ・・・・・・・・・・・・・・・・・・・・・・・・・・・*/ public void mouseClicked(MouseEvent e){ // mouseClickedメソッドの定義 if(flag==1){ // flagの値が1である場合 i=-15; // 変数「i」に-15を代入 level=level+1; // マウスが押される度に,levelの値が1増加 if(level==3) flag=0; // levelの値が3になった場合,flagの値を0にオーバーライド } else{ // flagの値が0である場合 i=15; // 変数「i」の値に15を代入 level--; // flagが0の間は,マウスが押される度にlevelの値が1減少 if(level==0) flag=1; // levelの値が0になった場合,flagの値を1に } posx = posx + 0.01; /*・・・・・・・・・・・・・・・・・・ Chickenクラスに含まれるtg4に座標変換を定義 ・・・・・・・・・・・・・・・・・・・・*/ transform3D2.setTranslation( new Vector3d( posx, 0.2, 0.0 ) ); transformGroup2.setTransform( transform3D2 ); transform3D.rotX(Math.PI*i/360); // 「transform3D」の座標変換として回転を設定 chicken.transform3D4.mul(this.transform3D); // Chickenクラスに含まれる「transform3D4」の座標変換として // mouseAdapterクラスの「transform3D」を設定 chicken.transformGroup4.setTransform(chicken.transform3D4); // Chickenクラスの「tg4」にCharaクラスのtransform3D4を設定 }// end of public void mouseClicked } }