3. 光源処理
平行光源
太陽光のようにある角度で照射する光があります。形状の面の向きと、光の向きの向かい合う量が大きいほど、面の明るさは強くなると考えられます。
向かい合いの量
向かい合う量は、前章で出てきた数学の内積を使います。注意したいのは、面の向きと光の向きのベクトルの長さを1にする必要があります。これを正規化と言います。こうすると、完全に向かい合っている場合は、内積が-1となります。さらに符号は反転しておきます。面の色は、色のRGB成分(赤、緑、青)のそれぞれに向かい合いの量を掛けます。向かい合いの量が0未満の場合は0にします。
前照灯
平行光源が1つだと、光の当たらない側に回り込むと、全てが黒になってしまいます。そこで、観測者から前に向かって、平行光源を追加します。形状の面と前照灯との向かい合いの量を太陽光のそれに加算します。この時、向かい合いの量の和が1を超えた場合は、1にします。
環境光
また、太陽光は地面や建物に反射し、空間に一定量の光が漂っていると考えられます。この量を向かい合いの量にさらに加算します。前照灯と同様に、1を超えた場合は、1にします。
ビューア2クラス
ビューアクラスから派生させて、ビューア2クラスを作成します。「パラメータ」メニューに「光源」を追加し、「光源ダイアログ」が表示されるようにします。「光源ダイアログ」も作成します。スライダで環境光、前照灯、太陽光の強さを設定できるようにします。また、太陽光の照射角も2つのスライダで動かせるようにします。「光源ダイアログ」の調整値は、ビューポートクラスの光源情報に送ります。ビューアクラスを派生させながら、メニューやダイアログを追加していきます。よって、この章のアプリケーションは、ビューア2クラスを親にして作成します。
ビューポートクラスに光源処理を追加
ビューポートに光源情報を追加し、面の描画(render_face)に光源を加味した色の計算処理を加えます。