光源は 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); // 球