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

このライトは、全てのライトや設定値がセットになっているものです。
詳細は以下を参照してください。
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)となります。

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の使い方です。

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)が必要になります。

下のコードを見てください。
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(光沢度)を指定してあげればいいだけです。

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(); |
Sorry, comments are closed.