操作


ユーザーの操作に応じて物体などの状態を変える方法についてです。

マウス / Picking / 戻る / トップページ


マウス操作

マウスでの操作に応じて物体などの位置を変更するために com.sun.j3d.utils.behaviors.mouse.MouseBehavior クラスが用意されています。
 
MouseBehavior クラスのサブクラスのオブジェクトを生成し、 SceneGraph にぶら下げて使います。 どの MouseBehavior もコンストラクタまたはメソッド setTransformGroup(TransformGroup transformGroup) で TransformGroup オブジェクトを指定します。 マウスの操作に応じてこの TransformGroup が書きかえられます。
 
MouseRotate クラスは左ドラッグで回転を MouseTranslate クラスは右ドラッグで XY 方向の移動を MouseZoom クラスは中ドラッグで Z 方向の移動をします。
	TransformGroup transform=new TransformGroup();
	transform.addChild(new ColorCube());     // 色付き立方体
	root.addChild(transform);
	
	MouseBehavior behavior1=new MouseRotate();
	behavior1.setTransformGroup(transform);
	root.addChild(behavior1);
	MouseBehavior behavior2=new MouseTranslate();
	behavior2.setTransformGroup(transform);
	root.addChild(behavior2);
	MouseBehavior behavior3=new MouseZoom();
	behavior3.setTransformGroup(transform);
	root.addChild(behavior3);
MouseBehavior オブジェクトは SceneGraph のどこにぶら下げても同じようです。
 
また、MouseBehavior オブジェクトはその適用範囲を設定する必要があります。 範囲は Bounds オブジェクト (実際はサブクラスのオブジェクト) が表現しますので、 それを setSchedulingBounds(Bounds region) メソッドで設定します。 この範囲と視点 (ViewPlatform) が重なった時のみ操作が可能となります。
	BoundingSphere bounds=new BoundingSphere(
		new Point3d(0.0,0.0,0.0),100.0);	// 原点を中心とする半径 100.0 の範囲
	
	behavior1.setSchedulingBounds(bounds);
	behavior2.setSchedulingBounds(bounds);
	behavior3.setSchedulingBounds(bounds);
さらに TransformGroup オブジェクトには Capability bit として、 ALLOW_TRANSFORM_READ, ALLOW_TRANSFORM_WRITE を設定する必要があります。
	transform.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
	transform.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
これ以外の操作が欲しい場合は自分で MouseBehavior クラスを継承したクラスを作ります。 MouseBehavior クラスとそのサブクラスのソースファイルが Java3D に付属していますので (java3d-utils-src.jar の中にあります)、それを参考にするといいと思います。 こちら で解説も行っています。
 
また、この方法では画面のどこをドラッグしても物体が動きます。 物体をドラッグした時のみ物体が動くようにするには Picking を使います。

Picking

マウスでの操作に応じて物体などの位置を変更するために MouseBehavior クラスを使う方法 があります。
 
しかし、MouseBehavior を使った場合には 画面のどこをドラッグしても物体が動きます。 物体をドラッグした時のみ物体が動くようにするには Picking を使います。 Picking に関係するクラスは com.sun.j3d.utils.behaviors.picking パッケージにあります。
 
PickMouseBehavior クラスのサブクラスのオブジェクトを生成し、 SceneGraph にぶら下げて使います。 どの PickMouseBehavior もコンストラクタで BranchGroup オブジェクトを指定します。 マウスの操作に応じてこの BranchGroup より下にぶら下がっている TransformGroup オブジェクトが書きかえられるようになっています。
 
また、コンストラクタの引数にはマウスの位置を取得するために Canvas3D オブジェクトを、 適用範囲を設定するために Bounds オブジェクトを設定する必要があります。 この範囲と視点位置が重なった時のみマウス操作が可能となります。
 
PickRotateBehavior クラスは左ドラッグで回転を、 PickTranslateBehavior クラスは右ドラッグで XY 方向の移動を、 PickZoomBehavior クラスは中ドラッグで Z 方向の移動をします。
	TransformGroup transform=new TransformGroup();
	transform.addChild(new ColorCube());     // 色付き立方体
	root.addChild(transform);
	
	BoundingSphere bounds=new BoundingSphere(new Point3d(0.0,0.0,0.0),100.0);
	// 原点を中心とする半径 100.0 の範囲
	
	PickMouseBehavior behavior1=new PickRotateBehavior(root,canvas,bounds);
	root.addChild(behavior1);
	PickMouseBehavior behavior2=new PickTranslateBehavior(root,canvas,bounds);
	root.addChild(behavior2);
	PickMouseBehavior behavior3=new PickZoomBehavior(root,canvas,bounds);
	root.addChild(behavior3);
PickMouseBehavior オブジェクトは SceneGraph のどこにぶら下げても効果は同じです。
 
実際には Picking によって変更されてもかまわない TransformGroup オブジェクトには Capability bit として、 ALLOW_TRANSFORM_READ, ALLOW_TRANSFORM_WRITE, ENABLE_PICK_REPORTING の 3 つを設定する必要があります。
	transform.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
	transform.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
	transform.setCapability(TransformGroup.ENABLE_PICK_REPORTING);

戻る