CG数学 ベクトル2 内積


どうも篠島です。ベクトルの内積を学校で習ったときは意味不明でこれが一体何の役に立つのだと思いましたが、やはりCGで非常によく使われます。今回はベクトルの内積について説明します。

 

今回のサンプルファイルです。
vector2.zip

内積は英語で書くと Dot Product となります。なのでVEXコードやVOPノードは dot() や Dot Product VOP となります。

内積を説明する前にスカラーについて説明したいと思います。前回、ベクトルは方向と大きさを表したものであると説明しました。それに対し、スカラーは大きさだけを表したものです。Houdiniで例えると、Smokeの Density や Temperature などはスカラーの値です。

内積を計算する前に、それぞれのベクトルをノーマライズし、単位ベクトルにしておきましょう。単位ベクトルとは大きさが 1 のベクトルの事です。

内積がどの様に計算されるかというと、下のようにAとBベクトルが合ったとします。AベクトルをBベクトルに投影して得られたベクトルが赤いベクトルとします。この時、Bベクトルと赤いベクトルの方向は同じです。そしてこの2つのベクトルの大きさを掛け合わせたものが内積の結果となります。

1

Aベクトルの向きが垂直だと、投影されたベクトルの大きさが0になる為に内積の結果も 0 となる。AベクトルがBベクトルと逆を向いていると、内積の結果はマイナスとなる。

2

 

AとBベクトルの内積を a・b と表しますが、これを図にすると下のようになります。Aベクトルがどっちを向いているかにより、内積の結果がプラスか、0 か、マイナスになります。

3

 

さて、内積が一体CGで何に使われるかというと、ディフューズのシェーディングの計算に使われます。 下のGIFアニメーションはHoudiniでSOPだけで色の計算をしたものです。ライトやシェーダーは何も使っていません。

a

これはポイントの法線と、ライトまでのベクトルの内積を計算して、その結果を色として出力しているだけです。ポイントからライトまでのベクトルはノーマライズして単位ベクトルにするのを忘れずに。法線は特になにもしない限り単位ベクトルですが、念のためにノーマライズしても問題ありません。

4

 

Houdini の VEX で書くと下のようになります。サンプルファイルにはVOPネットワークも用意してあります。

5