ライティング

ライティングにより,より表現力のある3DCGを描画します.

ambientLight

日本語では環境光と呼ばれます.図形の面の位置や向きに関係なく,等しく照らす光です.

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);
}
ambient.png

球はfill(255,0,0)で赤に設定されているので,環境光の色(127,127,127)と球の色が乗算され,結果的に暗めの赤となります.

directionalLight

光の色と,向きのみを持つ基本的なライトです.平行光源とも呼ばれます.
光の向きと,図形の面の垂直方向の向き(法線)の向きだけで計算されます.

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);
}
directional.png

上記の例では,原点から(-1,0,0)への向きで白色の光源を設定しています.ただし,球はfill(255,0,0)で赤に設定されているので,光源の色と球の色が乗算され,結果的に赤となります.

pointLight

点光源とも呼ばれます.色と位置を持ち,光源から離れると光が減衰します.豆電球を思い浮かべると良いでしょう.

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);
}
point.png

光の減衰率はlightFalloff関数により設定できます.

spotLight

名前の通り,現実のスポットライトと同等の機能を持つ光源です.色,位置,向き,スポットを当てる部分の広さ,スポットの中心からの光の減衰率を指定します.

光源の位置,向きの変換

光源の位置や向きも,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);
}
lightrot.png

上記の例では,(-1,0,0)の向きの光源をZ軸中心に45度回転し,斜め上から光が当たるようにしています.

課題の提出先・提出方法

招待されているBoxアップロードフォルダ「第04回」に自身の学籍番号のフォルダ(アルファベット大文字,例:20FI999)を自身で作成し,その中に各課題,指定された名前で完成させたスケッチフォルダごとアップロードしてください.

提出締め切り:12月15日(金) 23:59

BOXアップロードフォルダの招待メールが来ていない,また,WebClassで本講義が見えない方は森谷まで連絡ください.

課題1

以下のアニメーションを作成しなさい.見た目が同じであれば使用する光源の種類は問わない.

提出スケッチフォルダ名:BASIC4_1

ヒント: 光源による図形の色の計算は,図形の頂点ごとに行われるため,上記のアニメーションを作るためには,小さな三角,もしくは四角を敷き詰めた平面を用意する必要がある.

plane.png

任意課題

ダンスホール(っぽい)空間を作れ.

提出スケッチフォルダ名:ADVANCE4_1

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;

添付ファイル: fileexa.png 1431件 [詳細] fileexa.mp4 1957件 [詳細] filekadai.mp4 3741件 [詳細] filepoint.png 1115件 [詳細] filelightrot.png 1055件 [詳細] fileambient.png 961件 [詳細] fileplane.png 1386件 [詳細] filedirectional.png 1120件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2023-11-20 (月) 12:06:50