Geometry


図形の形状を表わす Geometry についての詳しい解説です。

GeometryArray / IndexedGeometryArray / 戻る / トップページ


IndexedGeometryArray

GeometryArray クラスを使って多面体などを定義する場合に 同じ頂点が何度も出てくる点に違和感を感じると思います。
 
例えば、GeometryArray の解説 で使われている例の頂点座標が
	Point3d[] vertexs={
		p1,p3,p2,	// 面1
		p1,p2,p4,	// 面2
		p1,p4,p3,	// 面3
		p2,p3,p4};	// 面4
となっていますが、p1 が何度も出てきています。 同じ頂点が別々の面に属しているためにこのようになります。 本来同じ頂点を表現したいのに別々の頂点として定義する事は 効率の面からいってもあまり良い方法とは言えません。
 
そこで GeometryArray クラスのサブクラスの IndexedGeometryArray クラスを使います。 実際にはさらにサブクラスの IndexedTriangleArray クラスなどを使います。
 
TriangleArray クラスと IndexedTriangleArray クラスの違いを説明する事で IndexedGeometryArray クラスの使い方を説明します。
 
TriangleArray クラスの時は頂点を直接定義していましたが、 IndexedTriangleArray クラスでは座標を一度インデックスに対して指定し、 座標はそのインデックスで指定します。
 
コンストラクタにインデックスの数を指定する引数が加わります。 IndexedTriangleArray(int vertexCount, int vertexFormat, int indexCount) です。 indexCount にインデックスの数を指定します。
	TriangleArray geometry=new IndexedTriangleArray(
		4,IndexedTriangleArray.COORDINATES | IndexedTriangleArray.COLOR_3,12);
		// vertexCount = 4
		// vertexFormat = 座標、色
		// indexCount = 3 × 4
そして生成された IndexedTriangleArray オブジェクトに対して setCoordinateIndices メソッドや setColorIndices メソッドなどで 頂点とインデックスとの関係を定義することで Geometry オブジェクトの完成です。
	Point3d p0=new Point3d(           0.0 ,-2.0*Math.sqrt(2.0)*1.0/3.0, 2.0);
	Point3d p1=new Point3d( Math.sqrt(3.0),-2.0*Math.sqrt(2.0)*1.0/3.0,-1.0);
	Point3d p2=new Point3d(-Math.sqrt(3.0),-2.0*Math.sqrt(2.0)*1.0/3.0,-1.0);
	Point3d p3=new Point3d(           0.0 , 2.0*Math.sqrt(2.0)*2.0/3.0, 0.0);
	
	Color3f c0=new Color3f(0.1f,1.0f,0.3f);
	Color3f c1=new Color3f(0.1f,1.0f,0.3f);
	Color3f c2=new Color3f(0.1f,1.0f,0.3f);
	Color3f c3=new Color3f(0.1f,1.0f,0.3f);
	
	Point3d[] vertexs={p0,p1,p2,p3};
	Color3f[] colors={c0,c1,c2,c3};
	int[] indices={
		0,2,1,	// 面1
		0,1,3,	// 面2
		0,3,2,	// 面3
		1,2,3};	// 面4
	
	geometry.setCoordinates(0,vertexs);	// 頂点座標の設定
	geometry.setCoordinateIndices(0,indices);
	geometry.setColors(0,colors);	// 頂点の色の設定
	geometry.setColorIndices(0,indices);
この例は GeometryArray の解説 で使われている例とまったく同じ図形 (正四面体) を表わしていますので、 見比べてみてください。

戻る