**ライティング [#ddfef71a] ライティングにより,より表現力のある3DCGを描画します. **ambientLight [#y7337fff] 日本語では環境光と呼ばれます.図形の面の位置や向きに関係なく,等しく照らす光です. void setup() { size(640, 480, P3D); } void draw() { background(127, 127, 127); camera(100, -100, 100, 0, 0, 0, 0, 1, 0); axis(100); fill(255, 0, 0); noStroke(); ambientLight(127, 127, 127); sphere(30); } void axis(float l) { stroke(255, 0, 0); line(0, 0, 0, l, 0, 0); stroke(0, 255, 0); line(0, 0, 0, 0, l, 0); stroke(0, 0, 255); line(0, 0, 0, 0, 0, l); } #ref(./ambient.png,50%); 球はfill(255,0,0)で赤に設定されているので,環境光の色(127,127,127)と球の色が乗算され,結果的に暗めの赤となります. **directionalLight [#fc3a3114] 光の色と,向きのみを持つ基本的なライトです.平行光源とも呼ばれます.~ 光の向きと,図形の面の垂直方向の向き(法線)の向きだけで計算されます. void setup() { size(640, 480, P3D); } void draw() { background(127, 127, 127); camera(100, -100, 100, 0, 0, 0, 0, 1, 0); axis(100); fill(255, 0, 0); noStroke(); directionalLight(255, 255, 255, -1, 0, 0); sphere(30); } void axis(float l) { stroke(255, 0, 0); line(0, 0, 0, l, 0, 0); stroke(0, 255, 0); line(0, 0, 0, 0, l, 0); stroke(0, 0, 255); line(0, 0, 0, 0, 0, l); } #ref(./directional.png,50%); 上記の例では,原点から(-1,0,0)への向きで白色の光源を設定しています.ただし,球はfill(255,0,0)で赤に設定されているので,光源の色と球の色が乗算され,結果的に赤となります. **pointLight [#d6a1d81f] 点光源とも呼ばれます.色と位置を持ち,光源から離れると光が減衰します.豆電球を思い浮かべると良いでしょう. void setup() { size(640, 480, P3D); } void draw() { background(127, 127, 127); camera(100, -100, 100, 0, 0, 0, 0, 1, 0); axis(100); fill(255, 0, 0); noStroke(); pointLight(255, 255, 255, 50, 0, 0); sphere(30); } void axis(float l) { stroke(255, 0, 0); line(0, 0, 0, l, 0, 0); stroke(0, 255, 0); line(0, 0, 0, 0, l, 0); stroke(0, 0, 255); line(0, 0, 0, 0, 0, l); } #ref(./point.png,50%); 光の減衰率はlightFalloff関数により設定できます. -http://www.processing.org/reference/lightFalloff_.html **spotLight [#i49c0daf] 名前の通り,現実のスポットライトと同等の機能を持つ光源です.色,位置,向き,スポットを当てる部分の広さ,スポットの中心からの光の減衰率を指定します. -http://www.processing.org/reference/spotLight_.html **光源の位置,向きの変換 [#f7971619] 光源の位置や向きも,translationやrotate関数により変換することができます. void setup() { size(640, 480, P3D); } void draw() { background(127, 127, 127); camera(100, -100, 100, 0, 0, 0, 0, 1, 0); axis(100); fill(255, 0, 0); noStroke(); pushMatrix(); rotateZ(-PI/4); directionalLight(255, 255, 255, -1, 0, 0); popMatrix(); sphere(30); } void axis(float l) { stroke(255, 0, 0); line(0, 0, 0, l, 0, 0); stroke(0, 255, 0); line(0, 0, 0, 0, l, 0); stroke(0, 0, 255); line(0, 0, 0, 0, 0, l); } #ref(./lightrot.png,50%); 上記の例では,(-1,0,0)の向きの光源をZ軸中心に45度回転し,斜め上から光が当たるようにしています. **課題 [#g01cc35a] 以下のアニメーションを作成しなさい.見た目が同じであれば使用する光源の種類は問わない. #ref(./kadai.wmv); ヒント: 光源の計算は,図形の頂点ごとに行われるため,上記のアニメーションを作るためには,小さな三角,もしくは四角を敷き詰めた平面を用意する必要がある. 光源による図形の色の計算は,図形の頂点ごとに行われるため,上記のアニメーションを作るためには,小さな三角,もしくは四角を敷き詰めた平面を用意する必要がある. #ref(./plane.png,50%);