このページでは、processing上でのライトの使用について説明します。
ライトと言っても、環境光、指向性ライト、鏡面反射光(ハイライト)など、様々な要素がありますが、まずは、一番基本的なライトです。
このライトは、全てのライトや設定値がセットになっているものです。
詳細は以下を参照してください。
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)となります。
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の使い方です。
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)が必要になります。
下のコードを見てください。
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)の場合はハイライトが強くなります。
オブジェクトの色
オブジェクトそのものの色は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()で設定します。
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(); } |