每次都要到快下班才會靈光一閃...
________________________________________
這禮拜應該會比較少編輯器的進度了
所以乾脆來做些心得紀錄和分享吧!
鑑於這個禮拜都在玩向量
我就來提供一些向量運算的基本公式和心得吧!
向量就是表示「一個方向」的「量值」
所以簡單的三個參數就包含了「方向」還有他的「量」,是一個很方便的參數
而向量運算可以做很多的事情
但是我們必須先了解一些工具
首先我們了解向量是一個像這樣的值
Vector ( x, y, z )
代表了這個向量在三個軸的不同量,所以常常可以用來表示往某個方向的位移量
不過通常都會把這個 向量 轉換成長度 1 的「單位向量」,我們才方便運算
那在 Unity 就可以用 Vector.normalized 來取得這個像向量的單位向量
而通常為了做一些 Smooth 的運算
我們會需要取得跟這個「向量垂直」的向量,也就是「法向量」
怎麼取呢?
以 3D 的狀況來說,只有平面才有法向量,因為 3D 狀態下一個向量的法向量是無限多的
所以我只探討 2D 的部分
假設向量 Vector ( x, y ) ,那他的法向量是什麼呢
答案是
Normal ( -y, x ) 或者 Normal ( y, -x )
我們一般會把 法向量 稱為 Normal
嗯,一定有人聽過 NormalMap,那個 Normal 就是這個 Normal,不過這邊不提,請去翻圖學!
那接著~嗯?為什麼有兩條呢?
因為向量是有方向性的,跟 Vector 向量垂直的向量,當然有分左右兩邊囉
這怎麼來的?
這邊就會引入另一個公式
Unity 中的 Vector3 有一個 function 叫 Vector3 . Dot ( 向量A , 向量B )
Dot 的算法是這樣的
向量 A 的 x * 向量 B 的 x + 向量 A 的 y * 向量 B 的 y
這是用來算什麼的呢?
這是用來算 A 向量「投影」到 B 向量 會產生多大的影子
如果 A 是 B 的法向量,那就是垂直,那投影上去根本就不會有影子
所以會得到 0
所以 Vector ( x, y ) 的法向量就很好取囉,把xy個顛倒過來,隨便選一個加上負號就行了!
好啦,我們有向量,有法向量,我們就可以用這兩個做很多很棒的運算囉
但是!
我們知道法向量有兩條
不過要怎麼知道我要的是哪一條呢?
Smooth 運算算錯方向可是會很糗的!
所以我們假設有一個 向量 Vector (x, y) 和向量上面的一個點 VectorPoint ( v1, v2 )
還有一個在這條向量旁邊的一個點 Point ( p1, p2 )
我們要怎麼知道哪條法向量會偏向 Point 這個點呢?
欸嘿~ 這邊就又要用到 Vector3.Dot 投影了!
當兩個向量是反方向的時候,因為根本就投影不到對方身上,所以就會投影出負值
所以要判定哪個法向量是我們想要的
很簡單!
先取出一條 向量連到 Point 的向量 .Point - VectorPoint
假設叫做 PointVector (不准笑我的命名!)
我們只要分別拿這個 PointVector 去 Dot 兩個法向量
看哪個法向量得出的結果是正的就行了
最後的最後
在 Unity 中我們要怎麼旋轉一個向量呢?
很簡單!
Quaternion.Eular ( x軸角度, y軸角度, z軸角度 ) * 想旋轉的向量 = 旋轉過的向量!
簡單吧!
但是注意,Quaternion 一定要在前面哦!
向量數學真的是個很美麗的東西
雖然我最近被他玩的有點腦弱...
以上!