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

Filed in インタラクティブメディア演習III(3年ゼミ) 0 comments

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

sample5_1

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int angle;    //角度を設定するための変数
 
void setup(){
  size(400, 400, P3D);
  noStroke();
  angle = 0;    //60度を設定
}
 
void draw(){
  background(0);
  lights();
  angle += 1;    //角度を1ずつ足していく
  if(angle > 360) angle = 0;    //360度を超えたら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の立方体を描
}

これで、陰影が付いたことが確認できたと思います。

環境光

次に環境光(ambient light)を再現してみます。環境光は方向性を持たない光です。全体をまんべんなく照らしているので、オブジェクトに陰影は付きません。 ambientLight(red, green, blue)となります。

sample5_2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int angle;    //角度を設定するための変数
 
void setup(){
  size(400, 400, P3D);
  noStroke();
  angle = 0;    //60度を設定
}
 
void draw(){
  background(0);
  angle += 1;    //角度を1ずつ足していく
  if(angle > 360) angle = 0;    //360度を超えたら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の立方体を描
}

指向性ライト

次は、光の方向を指定することができるdirectional lightの使い方です。

sample5_3

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
int angle;    //角度を設定するための変数
 
void setup(){
  size(400, 400, P3D);
  noStroke();
  angle = 0;    //60度を設定
}
 
void draw(){
  background(0);
  //lights();
  angle += 1;    //角度を1ずつ足していく
  if(angle > 360) angle = 0;    //360度を超えたら0に戻す
 
  ambientLight(127, 0, 0);
  directionalLight(0, 0, 255, 0, 0, -1);
  translate(width/2, height/2);    //立体の中心を画面中央に移動 
  rotateX(radians(-30));    //Y軸に対してangleの数値分だけ回転
  rotateY(radians(angle));    //Y軸に対してangleの数値分だけ回転
  box(150, 150, 150);    //150 x 150 x 150pxの立方体を描
}

ハイライト

次はハイライトです。
ここでは、光そのものの鏡面反射色を指定するlightSpecular(red, green, blue)と、 オブジェクトそのものの鏡面反射色を設定するspecular(red, green, blue)が必要になります。

sample5_4

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
size(400, 400, P3D);
background(0);
noStroke();
 
ambientLight(20, 20, 20);    //環境光を当てる
 
//A
lightSpecular(255, 0, 0);    //光の鏡面反射色を設定
directionalLight(102, 102, 102, 0, 1, -1);    //指向性ライトを設定
pushMatrix();
translate(100, height/2, 0);
specular(255, 255, 255);    //オブジェクトの鏡面反射色を設定
sphere(50);
popMatrix();
 
//B
lightSpecular(255, 255, 255);    //光の鏡面反射色を設定
directionalLight(20, 20, 20, 0, 1, -1);
pushMatrix();
translate(300, height/2, 0);
specular(0, 0, 50);    //オブジェクトの鏡面反射色を設定
sphere(50);
popMatrix();

Aの場合は、lightSpecular(255, 0, 0)なので、光の反射色は赤になります。それに対してオブジェクトはspecular(255, 255, 255)で白なので、結果的に赤が反映されます。
Bの場合、この逆でlightSpecular(255, 255, 255)が白に対して、specular(0, 0, 50)は暗い青なので、結果的に青が反映されます。
このように、lightSpecularと、specularはお互いの相互関係によって、ハイライトの色が決定されるということになります。

光沢

光沢の場合は、反射率よりもかなり簡単でしょう。
それぞれのオブジェクトが描かれる前に、shininess(光沢度)を指定してあげればいいだけです。

sample5_5

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
size(400, 400, P3D);
background(0);
noStroke();
 
ambientLight(20, 20, 20);    //環境光を当てる
lightSpecular(255, 255, 255);    //光の鏡面反射色を設定
directionalLight(102, 102, 102, 0, 1, -1);    //指向性ライトを設定
specular(255, 255, 255); 
 
pushMatrix();
translate(100, height/2, 0);
shininess(5.0);    //オブジェクトの光沢を設定
sphere(50);
popMatrix();
 
pushMatrix();
translate(300, height/2, 0);
shininess(1.0);    //オブジェクトの光沢を設定
sphere(50);
popMatrix();
Posted by noguchi   @   8 6月 2009 0 comments

0 Comments

Sorry, comments are closed.

Previous Post
«
Next Post
»
Stroom designed by Credit Cards In conjunction with Web Hosting Reseller , Dream Interpretation Guide , Best Website Hosting.