2015年10月8日木曜日

ベクトル計算の基礎

ベクトルの計算が出来るようになると、CGのシェーダー、パーティクル制御、コンポジットの画像処理など、様々な分野での応用が期待出来る。しかし、ベクトルの計算はなんか難しい。そこで、次元を落として考えてみるのはどうだろうか?

一次元

一次元のものを「ベクトル」と言っていいのかどうか謎ですが・・・。(数学や物理の世界では1つの値を持つものは「スカラー」)と言われている。)

ある点、AとBがあったとする。Aは原点から3の距離であり、Bは5の距離である。

AからB、BからAなどのベクトルを得る場合は、ベクトルの引き算を行う。

B-A=AからBへのベクトル
5 - 3 = 2

2というベクトル(?)が得られた。Aから+2の所にBがあるという意味合いですかね。
実際にはベクトルは「向き」と「長さ」を持っているため、得られたベクトルは「プラス方向」に「長さ2」のベクトルとなるのだろうか。これから分かるように、ベクトルと言った場合、その値はAから見て・・・といったような「相対的なもの」である事に注意したい。

A - B  = BからAへのベクトル


3 - 5 = -2
「マイナス方向」に長さ「2」というベクトルが得られた。

一次元で考えるととても分かりやすいですね。

長さの計算
一次元だと値=長さなので、計算する意味まったくないけど、
2乗してから√するって覚えておく。

sqrt(x^2)
pow( x^2 , 0.5 ) 

意味ねー!!次元が増えると役立つ。

※ルートって1/2乗の計算と同じなんだ。つまり0.5乗でも結果同じ。詳しくは分からないが、プログラムの世界ではこちらの記述の方が計算速度が速いというような話を聞いたことがある。確かによく見かける気がするが。




単位ベクトルの取得(ノーマライズ)

これは、ベクトルの計算などをシンプルに行うため等に用いられるもので、ベクトルの長さを1にしたベクトルの事を指す。

自分の長さで割ってあげる



ベクトル / ベクトルの長さ

上の場合だと 2/2 = 1.0
下の例だと -2/2 = - 1.0 (分母が正の値ですが、「長さ」なので基本的に正の値になります!)

ベクトルの計算 足し算
この得られたベクトルを使ってAを動かす場合、
得られたベクトルをAに足してあげれば、AはBの位置に移動する。

A = A + V

動かす度合を変えたい時は、単位ベクトルが便利で
Bの方に1だけ動かすとか0.5だけ動かすとか

A = A + NV(長さ1のベクトル)
A = A + NV*0.5

二次元


二次元であっても同じである。

B - A = AからBへのベクトル

V(x , y) = B ( x, y) - A ( x , y) 
V(x , y) = B (4 , 1) - A(1 , 3) = V (3 , -2)

x、y それぞれで引き算行えばいいす。

そうすると、AからX +3 、Y -2の方向にBがいると言った意味のベクトルが得られる。が、次元が増えた事によりベクトルの長さがですね・・・・下の図注視するとなんか直角三角形が見えてこないですか?



そして、ベクトルの引き算をした際に、aとbの辺の長さが既に取得出来ていたりしませんか?


ピタゴラスの定理きた----!となる。

ということで V(length) = sqrt( 2^2 + 3^2) = 3.60555

もしくは pow ( (2^2+3^2) , 0.5) ・・・ (2^2+3^2)^0.5 という意味です。


出ました。ベクトルの長さ = 3.60555

今回の場合、ベクトルはV(3,-2)とYの値に負の値を持ってますが、計算式の性質上、累乗の計算があり、かならず求められる長さは正の値となるため、そのまま使って問題ないです。

Length = sqrt (3^2 + -2^2)
Length = sqrt (9 + 4)
Length = sqrt (13)
Length = 3.60555


で、単位ベクトル(長さ1のベクトル)はこの得られた長さを使って自分のx , yの値を割ってあげる事で求める事が出来る。


単位ベクトル NV = V (x / length , y / length)

NV = ( 3/3.60555 , -2/3.60555)
NV = ( 0.832051 , -0.5547)

出ました。単位ベクトル。

このように、次元が増えても、各次元で計算すればよい事が多く、2次元がクリアー出来れば、後は単純に次元が増えていくだけなので、3次元のベクトルの計算は基本的には2次元で使った式の次元を増やすだけとなる。

たとえばピタゴラスの定理もこうすればいいらしい。


ちなみに3dsMAXのTPのDistanceノードはこれらの計算を一発でやってくれる素晴らしい、「神、いわゆるゴッドなノード」だと、エフェクトスペシャリストの米岡さんに教えて頂いた。「Distance」という名前から「距離」をイメージしがちだが、本質的にはベクトルの長さと、単位ベクトルの取得になります。

また、代表的なベクトルの計算はMathノードで可能となっている。
計算式を一々打ち込んだり、ノード組まなくてもいいのでとてもありがたいですね。
神、いわばゴッド。

Maxscriptによるベクトルの操作はこちらを参照 Maxscript その9 「座標とベクトル point3値」


以前、「Nukeで3DCGのノーマルマップを使ったLambert Shaderの表現」の言ったような記事を書いたのですが、ノーマル(法線情報)も面の向きのベクトルなので、これも初歩的なベクトルの計算だけで出来る事になります。基本的なベクトルの計算を知るだけでも非常に沢山の表現が手に入るのではないかと思います。

距離を色に変えてみたりとか。

重力でものを落としたいとか
これも、ニュートンの法則が・・・とか考えずに、毎フレーム、自分のベクトルに重力のベクトルを足すだけでよいとか(重力による加速度といった考え)Maxだと一々スペースワープで重力を作る必要はないわけで・・・。

CGの「Velocity」などもベクトルである。「RealSmartが・・・」などの単語をよく耳にするが、その根本はベクトルであるため、この辺りを理解する事でVelocityチャンネルなどを適切に扱えるようになってくるのではないかと思う。

「ベクトルの内積 / Dot Product」、「ベクトルの外積 / Cross Product」 などが加わるとパーティクル制御などの幅がめちゃくちゃ広がると思います。

ベクトルの計算でよく分からなくなったらx軸だけとか1次元に落として考えてみる。

取り急ぎ失礼します。

0 件のコメント:

コメントを投稿