2011年10月3日月曜日

ベクトルの正規化について

Zで行こう!さんのサイトでスクリプトを勉強してたら、ベクトルの正規化というものが出てきた。エフェクトアーティストたるものこれは見逃せないことだと思い色々と調べてみた。高校時代の数学ことなんて全く覚えてません。{%泣くwebry%}

まずベクトルの正規化を学ぶにあたって、以下のお題を進めながら学んでいこうと思う。


お題:3D空間に存在する球(sphB)を球(sphA)に接するように移動する

デカルト座標で示すとこんな感じ。分かりやすく2Dで考えていきます。

画像


この図から見るように、moveメソッドに引数として赤の矢印のベクトル値を渡してやれば、OKだ。


①赤いベクトルの大きさを求める。
大きさをsph_distanceとすると、
sph_distance = (distance sphA.pos sphB.pos)-(sphA.radius+sphB.radius)
となる。

②赤いベクトルの単位ベクトル(方向)を求める。
①の大きさのベクトルを求めるとなると、大きさ1となる単位ベクトルが必要になる。
なぜなら、ベクトルは大きさと単位ベクトルの積で表されるからである。

画像

こんな感じかな{%トホホwebry%}

単位ベクトルが必要ということで、それを出すにはnormalize を使う。赤いベクトルの単位ベクトルをsph_unit_vectorとすると、
sph_unit_vector=normalize (sphA.pos-sphB.pos)
となる。

③上記のように①*②で赤いベクトルの値が求められる。
赤いベクトルをsph_vectorとすると、
sph_vector = sph_distance*sph_unit_vector

④最後にmoveメソッドに③を渡してやればOKだ。
move $sphB sph_vector


以上、ベクトルを使った移動を見てきたが、ベクトルの正規化という言葉が出てきてない。
ベクトルの正規化というのは②で見られるようにベクトルを単位ベクトル化するということである。
メソッドで言うと、normalize  がそれにあたる。




0 件のコメント:

コメントを投稿