5. ライト(processing 3D入門)

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

10_6_15__1_32_AM

このライトは、全てのライトや設定値がセットになっているものです。
詳細は以下を参照してください。
lights()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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)となります。

10_6_15__1_33_AM

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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の使い方です。

10_6_15__1_31_AM

directionalLight(red, green, blue, nx, ny, nz)の、nx, ny, nzは、光源の位置を指定しています。
下図のサンプルの場合、nzが-1なので、z軸方向の奥に向かっている光という指定になります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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)が必要になります。

10_6_15__1_35_AM

下のコードを見てください。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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)の場合はハイライトが強くなります。

オブジェクトの色

10_6_15__1_53_AM

オブジェクトそのものの色はspecular()で設定します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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()で設定します。

10_6_15__1_54_AM

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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();
}