光源


光を使った表現についてです。

光源 / 戻る / トップページ


光源の設定方法

光源は Light クラスのサブクラスによって表現されています。 Retained Mode ではそのオブジェクトを SceneGraph (BranchGroup オブジェクトまたは TransformGroup オブジェクトの下) にぶら下げます。 Immediate Mode では GraphicsContext3D オブジェクトに対して addLight(Light light) メソッドで Light オブジェクトを追加します。
	BranchGroup root=new BranchGroup();
	
	Light light=new PointLight(
		new Color3f(2.0f,0.0f,0.0f),
		new Point3f(2.0f,1.0f,1.0f),
		new Point3f(1.0f,0.0f,0.0f));	// 点光源
	root.addChild(light);
ただそれだけではだめなようで 光源の範囲を指定する事、 物体の表面に光源の影響が及ぶようにする事、 物体の法線ベクトルを正しく定義する事が必要です。
 
光源の範囲は Bounds オブジェクト (実際はサブクラスのオブジェクト) を作り、Light#setInfluencingBounds(Bounds region) で設定します。
	BoundingSphere bounds=new BoundingSphere(
		new Point3d(0.0,0.0,0.0),100.0);	// 原点を中心とする半径 100.0 の範囲
	
	light.setInfluencingBounds(bounds);
物体の表面に光源の影響が及ぶようにするには まず Material オブジェクトを作り、 setLightingEnable(boolean state) メソッドで光源の影響が及ぶようにし、 物体の Appearence オブジェクトにその Material オブジェクトを登録します。
	Material material=new Material();
	material.setLightingEnable(true);
	Appearance appearance=new Appearance();
	appearance.setMaterial(material);
	Primitive primitive=new Sphere(1.0f,appearance);	// 球
	root.addChild(primitive);
物体の法線ベクトルの設定で Primitive の場合は そのコンストラクタに primflags を指定するものがあります。 ここに定数 GENERATE_NORMALS を指定する事で 法線ベクトルは自動的に設定されます。
	Primitive primitive=new Sphere(1.0f,Sphere.GENERATE_NORMALS,appearance);	// 球

戻る