陰線消去 + Lambert シェーディング

第3章 No.4 / 法線ベクトルから受光量を求める

ワイヤーフレームモデルでは、本来は影になり見えない線まで見えてしまっている。そこで、そのような線を消す処理が 陰線消去 である。これまでワイヤーフレームを線の集まりとしてきたが、面の集まりとする立体図形としよう。視点に対して奥の方にある面は、当然のことながら手前の方にある面に隠れてみることができない。どの面が見えて、どの面がみえないかを計算するのは困難であるため、簡単に 奥の面から順番に描く ことを考え、見える/見えないという計算を省略する。

さらに、見栄えをよくするために光と面の角度により面の色が変わるようにする。光線ベクトルと、面の法線ベクトルの角度により色を変えることを考える。法線ベクトルは ベクトルの外積 を利用する。

外積から法線ベクトル

外積の性質により、法線ベクトル C は、ベクトル A, B に直角で、右ねじの進む道の方向となる。ベクトル A, B の成分を

A = (ax, ay, az), B = (bx, by, bz)

とすると、法線ベクトル C は

C = ( aybz − azby,   azbx − axbz,   axby − aybx )

となる。光線ベクトル L の成分を (lx, ly, lz) とすると、2 つのベクトルの角度は

cos θ = (L · C) / (|L| · |C|)

により求めることができる。Lambert モデル (拡散反射) では、明るさは cos θ に比例する (cos θ < 0 のときは 0)。

実演 — 回転する四角形

3 次元で小さな四角形を回転させてみよう。視点を仮に (0, 0, -100) とする。

Sample 14 — Rotating Rectangle (Lambert shaded)JS

法線ベクトルを求めるためにはベクトル A と B の関係が面の上で決まっていなければならない。そこで、平面のデータを 必ず決まった順序で 入力することにする。これにより、面の表裏が逆になるようなことがなくデータの処理ができる。

ソースコード: samples.jsRRectangle セクション。