Capability bit について


SceneGraph を動的に変えるための方法です。

Capability / 動的に / 戻る / トップページ


Capability bit について

SceneGraph にオブジェクトをぶら下げた後や Compiled-Retained Mode でコンパイルした後、 そのオブジェクトの属性を変更しようとすると CapabilityNotSetException が発生します。 これは Capability bit を設定していないために起こります。
 
Capability bit とは SceneGraph の Node の属性の変更を許可するためのフラグです。 通常どの属性の変更も許されていないので、 属性を変更したい時は Capability bit をセットする必要があります。
 
SceneGraph を構成するクラス (SceneGraphObject クラスのサブクラス) に Capability bit をセットするメソッド setCapability(int bit) があります。 この引数の bit には各クラスに用意されている ALLOW_ で始まる定数を必要な数だけ OR 演算して指定します。
	root.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND);	// オブジェクトの追加を許可
	
	Shape3D shape=new ColorCube();	// 色付き立方体
	shape.setCapability(Shape3D.ALLOW_APPEARANCE_WRITE | Shape3D.ALLOW_GEOMETRY_WRITE);
		// Appearance, Geometry 書き込みの許可

動的にぶら下げるには

Java3D では高速化などの効率を上げるための内部処理のために、 一度 SceneGraph にぶら下げられたノードや コンパイルされたノードに対して 別のノードをぶら下げたり取り除いたりできるのは BranchGroup ノードのみとしています。
 
動的に他のノードをぶら下げたい場合は BranchGroup ノードの下にそのノードをぶら下げた後に SceneGraph に BranchGroup ノードをぶら下げます。 親には Capability bit の ALLOW_CHILDREN_EXTEND をセットします。
	root.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND);	// 子ノードの追加を許可
	root.compile();
	
	BranchGroup newGroup=new BranchGroup();
	newGroup.addChild(new ColorCube());	// 色付き立方体
	root.addChild(newGroup);	// 追加できる
動的にノードを取り除くには前もってそのノードを Capability bit の ALLOW_DETACH をセットした BranchGroup ノードの下にぶら下げておいて、 BranchGroup ノードごと detach() メソッドで取り除きます。 Scenegraph から取り除いた後も BranchGroup ノードと その下のノードはつながったままであることに注意してください。

戻る