/*・・・・・・・・・・・・・・・・・・・・・・ プログラムに必要なパッケージを取り込む ・・・・・・・・・・・・・・・・・・・・*/ 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 Snowman extends Applet{ // 「SnowMan」クラスの定義 /*・・・・・・・・・・・・・・・・・・ MyMouseOpenクラス内で共通のインスタンスを生成 ・・・・・・・・・・・・・・・・・*/ SnowmanClass smanClass = new SnowmanClass(); //SnowManクラスのインスタンスを生成 public Snowman(){ /*・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ シーングラフの構築 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・*/ 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の設定 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・*/ smanClass.setCapability(smanClass.ALLOW_TRANSFORM_WRITE); // 実行中のsnowmanへの書き込みを許可 smanClass.setCapability(smanClass.ALLOW_TRANSFORM_READ); // 実行中のsnowmanの読み込みを許可 smanClass.setCapability(smanClass.ENABLE_PICK_REPORTING); // 実行中にマウスの選択が行われているかどうか報告することを許可 smanClass.transformGroup4.setCapability(smanClass.ALLOW_TRANSFORM_WRITE ); // snowmanの右眉座標値への書き込みを許可 smanClass.transformGroup5.setCapability( smanClass.ALLOW_TRANSFORM_WRITE ); // snowmanの右眉座標値への書き込みを許可 /*・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ ピッキングの定義 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・*/ PickMouseBehavior behavior1 = new PickRotateBehavior(objRoot, canvas3D, boundingSphere); // 回転させるピッキングの定義 PickMouseBehavior behavior2 = new PickTranslateBehavior(objRoot, canvas3D, boundingSphere); // 移動させるピッキングの定義 PickMouseBehavior behavior3 = new PickZoomBehavior(objRoot, canvas3D, boundingSphere); // ズームさせるピッキングの定義 /*・・・・・・・・・・・・・・・・・・・・・・・・・・ 物体などをシーングラフに追加 ・・・・・・・・・・・・・・・・・・・・・・・・・・*/ objRoot.addChild(behavior1); // 「behavior1」を「objRoot」に追加 objRoot.addChild(behavior2); // 「behavior2」を「objRoot」に追加 objRoot.addChild(behavior3); // 「behavior2」を「objRoot」に追加 objRoot.addChild(smanClass); // 「snowman」を「objRoot」に追加 objRoot.addChild(directionalLight); // 「derectionalLight」を「objRoot」に追加 /*・・・・・・・・・・・・・・・・・・・・・・・ 物体側のツリーをシーングラフに追加 ・・・・・・・・・・・・・・・・・・・・・・・*/ simpleUniverse.addBranchGraph(objRoot); } /*・・・・・・・・・・・・・・・・・・・・・・・・ 作成したクラスファイルを呼び出し ・・・・・・・・・・・・・・・・・・・・・・・・*/ public static void main(String[] argV){ Snowman snowman = new Snowman(); // SnowManクラスのインスタンスを生成 MainFrame mainFrame = new MainFrame(snowman, 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 transform3D1 = new Transform3D(); // 右眉用TransformGroupクラスのインスタンス「transform3D」を生成 Transform3D transform3D2 = 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に } /*・・・・・・・・・・・・・・・・・・ snowmanクラスに含まれるtg4に座標変換を定義 ・・・・・・・・・・・・・・・・・・・・*/ //右眉の設定 transform3D1.rotZ(Math.PI*i/360); smanClass.transform3D4.mul(this.transform3D1); smanClass.transformGroup4.setTransform(smanClass.transform3D4); //左眉の設定 transform3D2.rotZ(-Math.PI*i/360); smanClass.transform3D5.mul(this.transform3D2); smanClass.transformGroup5.setTransform(smanClass.transform3D5); } } }