物体


物体の定義・表示方法についてです。

物体 / Primitive / 部品 / 戻る / トップページ


物体の生成

Shape3D オブジェクトを作るには 当然コンストラクタを使うわけですが、 その引数に Geometry オブジェクトを指定するか 引数なしで生成した後に setGeometry(Geometry geometry) メソッドで Geometry オブジェクトを指定する必要があります。 その指定する Geometry オブジェクトが物体の形状を表わすものです。
 
Geometry オブジェクトは Geometry クラスのサブクラスで実体化します。 3 角形の面で構成される多面体を作りたい時は TriangleArray クラスを、 4 角形の面で構成される多面体を作りたい時は QuadArray クラスを使います。
	float[] vertexs={
		 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,-2.0f, 0.0f,	// 面1
		 0.0f, 0.0f, 1.0f,-1.0f, 0.0f, 0.0f, 0.0f,-2.0f, 0.0f,	// 面2
		-1.0f, 0.0f, 0.0f, 0.0f, 0.0f,-1.0f, 0.0f,-2.0f, 0.0f,
		 0.0f, 0.0f,-1.0f, 1.0f, 0.0f, 0.0f, 0.0f,-2.0f, 0.0f,
		 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 2.0f, 0.0f,
		-1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 2.0f, 0.0f,
		 0.0f, 0.0f,-1.0f,-1.0f, 0.0f, 0.0f, 0.0f, 2.0f, 0.0f,
		 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,-1.0f, 0.0f, 2.0f, 0.0f};	// 面8
	float[] colors={
		0.5f,0.2f,1.0f,0.2f,0.5f,1.0f,0.2f,0.5f,1.0f,
		0.2f,0.5f,1.0f,0.5f,0.2f,1.0f,0.5f,0.2f,1.0f,
		0.5f,0.2f,1.0f,0.2f,0.5f,1.0f,0.2f,0.5f,1.0f,
		0.2f,0.5f,1.0f,0.5f,0.2f,1.0f,0.5f,0.2f,1.0f,
		0.2f,0.5f,1.0f,0.5f,0.2f,1.0f,0.5f,0.2f,1.0f,
		0.5f,0.2f,1.0f,0.2f,0.5f,1.0f,0.2f,0.5f,1.0f,
		0.2f,0.5f,1.0f,0.5f,0.2f,1.0f,0.5f,0.2f,1.0f,
		0.5f,0.2f,1.0f,0.2f,0.5f,1.0f,0.2f,0.5f,1.0f};
	
	TriangleArray geometry=new TriangleArray(
		24,TriangleArray.COORDINATES | TriangleArray.COLOR_3);
		// 3 (面を構成する頂点の数) ×8 (面の数)
	
	geometry.setCoordinates(0,vertexs);	// 頂点座標の設定
	geometry.setColors(0,colors);	// 頂点の色の設定
	
	Shape3D shape=new Shape3D(geometry);	// 水晶の形をした物体
Geometry オブジェクトの詳しい作り方は ここ をご覧下さい。

Primitive

Primitive とはユーティリティークラスの一つで 基本的な形状の物体を表現します (com.sun.j3d.utils.geometry.Primitive クラスのサブクラスです)。 Box (直方体)、Cone (円錐)、Cylinder (円柱)、Sphere (球) があります (いずれも com.sun.j3d.utils.geometry パッケージ)。 これらの形状を表示したい時には非常に便利なクラスです。
 
どのクラスもコンストラクタに int primflags という引数が用意されています。 ここに Primitive クラスの定数を OR でつなげる事で法線やテクスチャー座標も定義してくれます。 法線を定義して欲しい時は GENERATE_NORMALS、 テクスチャー座標を定義して欲しい時は GENERATE_TEXTURE_COORDS を指定します。 物体の内側方向に法線を設定して欲しい時は GENERATE_NORMALS | GENERATE_NORMALS_INWARD を指定します (GENERATE_NORMALS_INWARD だけではだめなようです)。 また、setPrimitiveFlags(int fl) メソッドでもこれらは設定可能です。
	Primitive primitive=new Sphere(1.0f,Sphere.GENERATE_NORMALS,appearance);	// 法線
普通、 Retained Mode で物体を表示するには Shape3D ノードを生成して SceneGraph にぶら下げますが、 Primitive は直接そのオブジェクトをSceneGraph にぶら下げます。
	BranchGroup root=new BranchGroup();
	Primitive primitive=new Sphere();	// 球
	
	root.addChild(primitive);
Immediate Mode の場合は Primitive ノードに対して getShape(int partid) メソッドを使って Shape オブジェクトを取得します。
	Primitive primitive=new Sphere();	// 球
	Shape3D shape=primitive.getShape(Sphere.BODY);

Primitive から部品を取り出す

Primitive は実際は Group で、 コンストラクタで部品 (Shape3D ノード) を作りその子に追加しています。
 
Primitive オブジェクトに対して getShape(int partid) メソッドを使えば、 その部品を取り出すことができます。 partid には各 Primitive クラスに定義されている定数を指定します。
	Primitive primitive=new Cylinder();	// 円柱
	Shape3D shape=primitive.getShape(Cylinder.BODY);	// 側面を取り出す
この取り出された部品ノードは Primitive ノードの下にすでにぶら下げられているので、 そのままでは SceneGraph に追加できません。 そこで、cloneNode(boolean forceDuplicate) メソッドで複製してから SceneGraph にぶら下げます。
	root.addChild(shape.cloneNode(true));

戻る