このページでは、processing上でのライトの使用について説明します。
ライトと言っても、環境光、指向性ライト、鏡面反射光(ハイライト)など、様々な要素がありますが、まずは、一番基本的なライトです。

このライトは、全てのライトや設定値がセットになっているものです。
詳細は以下を参照してください。
lights()
float angle; //角度を設定するための変数
void setup(){
size(400, 400, P3D);
noStroke();
angle = 0; //60度を設定
}
void draw(){
background(0);
lights();
translate(width/2, height/2); //立体の中心を画面中央に移動
rotateX(radians(-30)); //Y軸に対してangleの数値分だけ回転
rotateY(radians(angle)); //Y軸に対してangleの数値分だけ回転
box(150, 150, 150); //150 x 150 x 150pxの立方体を描く
angle += 0.5; //角度を0.5ずつ足していく
if(angle > 360.0) angle = 0.0; //360度を超えたら0に戻す
}
これで、陰影が付いたことが確認できたと思います。
環境光
次に環境光(ambient light)を再現してみます。環境光は方向性を持たない光です。全体をまんべんなく照らしているので、オブジェクトに陰影は付きません。 ambientLight(red, green, blue)となります。

float angle; //角度を設定するための変数
void setup(){
size(400, 400, P3D);
noStroke();
angle = 0; //60度を設定
}
void draw(){
background(0);
ambientLight(127, 0, 0); //赤の環境光
translate(width/2, height/2); //立体の中心を画面中央に移動
rotateX(radians(-30)); //Y軸に対してangleの数値分だけ回転
rotateY(radians(angle)); //Y軸に対してangleの数値分だけ回転
box(150, 150, 150); //150 x 150 x 150pxの立方体を描く
angle += 0.5; //角度を0.5ずつ足していく
if(angle > 360.0) angle = 0.0; //360度を超えたら0に戻す
}
指向性ライト
次は、光の方向を指定することができるdirectional lightの使い方です。

directionalLight(red, green, blue, nx, ny, nz)の、nx, ny, nzは、光源の位置を指定しています。
下図のサンプルの場合、nzが-1なので、z軸方向の奥に向かっている光という指定になります。
float angle; //角度を設定するための変数
void setup(){
size(400, 400, P3D);
noStroke();
angle = 0; //60度を設定
}
void draw(){
background(0);
ambientLight(10, 10, 10); //赤の環境光
translate(width/2, height/2); //立体の中心を画面中央に移動
rotateX(radians(-30)); //Y軸に対してangleの数値分だけ回転
//directionalLight(r, g, b, nx, ny, nz);
//nx, ny, nzは光源の位置
//緑の光をz軸の手前方向から当てている
directionalLight(0, 255, 0, 0, 0.5, -1);
rotateY(radians(angle)); //Y軸に対してangleの数値分だけ回転
box(150, 150, 150); //150 x 150 x 150pxの立方体を描く
angle += 0.5; //角度を0.5ずつ足していく
if(angle > 360.0) angle = 0.0; //360度を超えたら0に戻す
}
ハイライト
次はハイライトです。
ここでは、光そのものの鏡面反射色を指定するlightSpecular(red, green, blue)と、 オブジェクトそのものの鏡面反射色を設定するspecular(red, green, blue)が必要になります。

下のコードを見てください。
float angle = 0.0;
void setup() {
size(400, 400, P3D);
background(0);
noStroke();
}
void draw() {
background(0);
ambientLight(10, 10, 10); //環境光を当てる
pushMatrix();
translate(width/2, height/2, 0);
lightSpecular(50, 0, 0); //低い光の鏡面反射色(ハイライト)を設定
//lightSpecular(255, 0, 0); //高い光の鏡面反射色(ハイライト)を設定
directionalLight(255, 255, 255, -1, 1, -1); //指向性ライトを設定
rotateX(radians(-30)); //Y軸に対してangleの数値分だけ回転
specular(255, 255, 255); //オブジェクトの色を設定
sphere(100);
popMatrix();
}
lightSpecular(50, 0, 0)の場合、ハイライトは緩やかになります。それに対してspecular(255, 0, 0)の場合はハイライトが強くなります。
オブジェクトの色

オブジェクトそのものの色はspecular()で設定します。
float angle = 0.0;
void setup() {
size(400, 400, P3D);
background(0);
noStroke();
}
void draw() {
background(0);
ambientLight(20, 20, 20); //環境光を当てる
lightSpecular(255, 255, 255); //光の鏡面反射色(ハイライト)を設定
directionalLight(100, 100, 100, 0, 1, -1); //指向性ライトを設定
//左の球
pushMatrix();
translate(100, height/2, 0);
specular(255, 0, 0); //おぶじぇくt
sphere(50);
popMatrix();
//右の球
pushMatrix();
translate(300, height/2, 0);
specular(0, 0, 255); //おぶじぇくt
sphere(50);
popMatrix();
}
光沢
光沢の場合はshininess()で設定します。

float angle = 0.0;
void setup() {
size(400, 400, P3D);
background(0);
noStroke();
}
void draw() {
background(0);
ambientLight(20, 20, 20); //環境光を当てる
lightSpecular(255, 255, 255); //光の鏡面反射色(ハイライト)を設定
directionalLight(100, 100, 100, 0, 1, -1); //指向性ライトを設定
//左の球
pushMatrix();
translate(100, height/2, 0);
specular(200, 200, 200); //オブジェクトの色を設定
shininess(5.0); //オブジェクトの光沢を設定
sphere(50);
popMatrix();
//右の球
pushMatrix();
translate(300, height/2, 0);
specular(200, 200, 200); //オブジェクトの色を設定
shininess(1.0); //オブジェクトの光沢を設定
sphere(50);
popMatrix();
}
