- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2020-07-07T15:52:16+09:00","default:kyo-in","kyo-in")
#author("2024-04-18T12:28:12+09:00","default:kyo-in","kyo-in")
**ライティング [#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度回転し,斜め上から光が当たるようにしています.
**課題の提出先・提出方法 [#h475884f]
招待されているBoxアップロードフォルダ「メディア演習C(CG)前後期」へ,完成させた各課題のスケッチフォルダをまとめてZIP圧縮したファイルを以下の名前でアップロードしてください.
招待されているBoxアップロードフォルダ「第04回」に自身の学籍番号のフォルダ(アルファベット大文字,例:20FI999)を''自身で作成し'',その中に各課題,指定された名前で完成させたスケッチフォルダごとアップロードしてください.
ファイル名:XXFIXXX_''4th''.zip(例:19FI999_''4th''.zip)
''提出締め切り:5月14日(火) 23:59''
''提出締め切り:7月15日(水) 18:00''
BOXアップロードフォルダの招待メールが来ていない,また,WebClassで本講義が見えない方は森谷まで連絡ください.
**課題1 [#g01cc35a]
以下のアニメーションを作成しなさい.見た目が同じであれば使用する光源の種類は問わない.
提出ファイル名:BASIC4_1.pde
提出スケッチフォルダ名:BASIC4_1
#ref(./kadai.mp4);
ヒント:
光源による図形の色の計算は,図形の頂点ごとに行われるため,上記のアニメーションを作るためには,小さな三角,もしくは四角を敷き詰めた平面を用意する必要がある.
#ref(./plane.png,50%);
**任意課題[#uafb2ca8]
ダンスホール(っぽい)空間を作れ.
提出ファイル名:ADVANCE4_1.pde
提出スケッチフォルダ名:ADVANCE4_1
#ref(exa.mp4);
#ref(exa.png);
ヒント:上記のライトは全種類合わせて計8個まで作れる
ヒント:ランダムな向きのベクトルを生成するコード例を示す.正規化(ベクトルの長さを1にすること)していることに注意する.
float ldx = random(-1, 1);
float ldy = random(-1, 1);
float ldz = random(-1, 1);
float l = sqrt(ldx * ldx + ldy * ldy + ldz * ldz);
ldx /= l;
ldy /= l;
ldz /= l;