[概論] ベクトルの内積, 乗積, 単位化




ベクトルの内積

内積というのは英語でinner productと書きますが、dot product(ドット積)とも呼ばれます。3Dゲームの表現で多いのはdot productの方です。D3DXVec3Dot関数などを見たら「内積だな」と思って下さい。

さて、内積というのは次のような計算式で表される「定数」です:
Dot = v1v2 = x1*x2 + y1*y2 = |v1||v2|cos(θ)



上の式の「θ」は2つのベクトルが作る角度です。この式はぱっと見では不思議に思えます。各成分を掛けて足し合わせるという計算がなぜか右の「ベクトルの大きさ同士を掛け算して、cosθを掛けている!」というものとイコールになっています。なぜそうなるのか、数学的にはもちろん証明できます。でも、それは数学屋さんが好きなこと。ゲーム屋はこれを別の視点で見るんです。「成分同士掛けて足すというのが内積の計算方法。その意味は右辺だ」。つまり、右辺を捉えるのがゲーム屋として内積をつかむコツです。
Ex.) 衝突判定、内積計算(cosθ = 2つのベクトルが作る角度)

cosθ=0deg      ○(v1)→→○(v2) : dot (v1 v2) = 1

cosθ=90deg    ○(v1)→↑○(v2) : dot (v1 v2) = 0

cosθ=180deg ○(v1)→←○(v2) : dot (v1 v2) = -1


--------------------------------

--------------------------------

以下、max scripts.



■ベクトルの内積(max scripts)



dot <point3> <point3>

ベクトルの内積を返します。

内積のジオメトリックな補間は、2 番目のベクトルの単位ベクトルに対する最初のベクトルの投影の長さになります。つまり、2 つのベクトルが垂直である場合、内積は 0.0 になります。

内積が交換可能であることは、dot X Y == dot Y X と表されます。

内積が結合可能であることは、dot (r*X) Y == r*(dot X Y) と表されます。

内積が配布可能であることは dot X (Y+Z) == (dot X Y) + (dot X Z) と表されます。

2 つの法線ベクトルの内積はベクトル間の角のコサインであるため、内積は 2 つのベクトル間の角度の計算に使用できます。






fn GetVectorsAngle v1 v2 =

(

theAngle = acos(dot (normalize v1) (normalize v2))

)


GetVectorsAngle [10,0,0] [10,20,0]

63.435


ベクトルの乗積



cross <point3> <point3>

ベクトルの乗積を返します。

乗積は、2 つのベクトルで定義された平面に対して常に垂直な 3 番目のベクトルで、方向は右回りのルールによって定義されます。

乗積は、最初のベクトルの長さに 2 番目のベクトルの長さを乗算し、2 本のベクトル間の角度の正弦(sin)を乗算したものとして表されます。このため、平行なベクトルの乗積は 0.0 になります(sin 0.0 == 0.0 であるため)。

さらに乗積は、2 本のベクトルによって形成された平行四辺形の面積にも等しくなります。つまり、2 本のベクトルが面のエッジである場合、乗積はその面に対する法線ベクトル(面に垂直なベクトル)となり、面の面積に 2 を掛けた値と長さが等しくなります。

乗積が交換不能であることは、cross X Y == cross -Y X と表されます。

乗積が結合可能であることは、cross (r*X) Y == r*(cross X Y) と表されます。

乗積が配布可能であることは、cross X (Y+Z) == (cross X Y) + (cross X Z) と表されます。



ベクトルの単位化



normalize <point3>

ベクトルの長さが 1 に等しい、平均化された point3 値を返します。





b =[100,30.5,41.3]--take somePoint3 value

[100,30.5,41.3]

normalB1 =normalize b--getthe normalized vector

[0.889603,0.271329,0.367406]

length normalB1-- check the length, should be 1.0

1.0-- It is!

normalB2 =b / (length b)-- Do-It-Yourself Normalize...

[0.889603,0.271329,0.367406]-- same value

length normalB2-- of course, the length is also 1.0

1.0

0 コメント:

コメントを投稿