デジタル・デザイン・ラボラトリーな日々

アラフィフプログラマーが数学と物理を基礎からやり直す

3Dを基礎から勉強する 内積

ワイヤーフレームから脱出してそろそろ面に色を塗りたい、カメラ機能を付けて別の視点で見れるようにしたい。
そう思って調べていくと内積と外積というキーワードに必ずひっかかる。

そもそも内積とは何のことなのか、内積と外積との違いとは何なのかを掘り下げて行きたい。
最初は「内積」から開始します。
はてな記法では数式表現のmimetexが使えるので多様していきます。

内積とは何か
f:id:Yaju3D:20130526103204j:plain

内積は英語で"inner product"と書きますが、"dot product"(ドット積)とも呼ばれます。これは演算記号の「・」(ドット)に由来します。掛け合わせた数を意味する「積」は英語で"product"です。

内積というのは次のような計算式で表される「定数」です。
重要なのはcosθが求まるってことと、内積の結果は単一の値=スカラーになる点です。
\vec{a} \cdot \vec{b} = \mid \vec{a} \mid \mid \vec{b} \mid cos\theta

\vec{a}=(a_1,a_2) , \vec{b}=(b_1,b_2) とすると \vec{a} \cdot \vec{b} = a_1b_1 + a_2b_2 となる⇒導出

\vec{a} \cdot \vec{b}\vec{b} \cdot \vec{a} と入れ替えても結果は同じになります。

さて、この式ですが各成分(\vec{a}\vec{b})を掛けて足し合わせると「ベクトルの大きさ同士を掛け算してcos\thetaを掛けている」と同じ結果になっています。

では、内積から角度(cosθ)が求まる過程を見ていきます。
先に三平方の定理(ピタゴラスの定理)の直角三角形の式は有名なのでみなさん分かるでしょう。
c^2 = a^2 + b^2
3cm、4cm、5cmという辺の長さの三角形があった場合、三平方の定理が成り立つので直角三角形である。
5^2 = 3^2 + 4^2 = 25 + 9 + 16

当然ですが、直角(90度)以外の三角形の場合には誤差が発生します。その誤差は「-2ab cos\theta」になります。
この式を余弦定理と言います。参照:図形:余弦定理
c^2 = a^2 + b^2 -2ab cos\theta・・・①

下図のベクトルの\vec{a}\vec{b}から、\vec{c} = \vec{a}-\vec{b} の式が求まります。これはベクトルの引き算です。

f:id:Yaju3D:20130526102708j:plain

両辺に\vec{c}を掛けてみます。
\vec{c}\cdot\vec{c} = (\vec{a}-\vec{b})\cdot\vec{c}
{c}^2 = (\vec{a}-\vec{b})\cdot(\vec{a}-\vec{b}) ※\vec{c} = \vec{a}-\vec{b}から式変更
{c}^2 = {a}^2 + {b}^2 -2\vec{a}\vec{b}・・・②

余弦定理①と先程の式②からc^2が同じなので式を展開(※両辺が同じものは展開時に消していきます)
a^2 + b^2 -2ab cos\theta = {a}^2 + {b}^2 -2\vec{a}\vec{b}
-2ab cos\theta = -2\vec{a}\vec{b}
ab cos\theta = \vec{a}\vec{b}  ※式の左右変えると内積の式 \vec{a} \cdot \vec{b} = \mid \vec{a} \mid \mid \vec{b} \mid cos\theta となる
cos\theta = \frac{\vec{a}\vec{b}}{ab}

内積を使うとcosθが求まることが分かったけど、素直にcosθを使わないのは内積の方がシンプルな演算でCPU時間が短く済むからです。

先程は2次元についての内積を求めたわけですが、3次元でも同様な式となります。
\vec{a}=(a_1,a_2,a_3) , \vec{b}=(b_1,b_2,b_3)
\vec{a} \cdot \vec{b} = a_1b_1 + a_2b_2 + a_3b_3

//3次元の内積
dot(v:Point3D) {
  return this.x*v.x + this.y*v.y + this.z*v.z;
}

内積は2次元や3次元に限らず、何次元のベクトルについても計算することができます。現実世界では4次元や10次元ベクトルで表さるものは存在しないですが、数学上は計算できるところが数学のおもしろいところでもあります。

内積の使い道
内積の使い道は、このcosの性質を利用するものが多く、cosの使い道とも言えます。

f:id:Yaju3D:20130525230936j:plain

上図を見てもらうと分かりますが、cosは原点を中心とする山になっており、±90度以上でマイナスの値になります。ベクトルがなす角度が鈍角か鋭角かを符号だけで判定することで出来るのです。

相手が前にいるということは、自分の向いている方向から90度以内にいるということなので、符号を見れば前後関係が分かります。
また、符号だけでなく具体的なcosの値を比較すれば、前方45度の範囲というような判別も簡単にできます。