今天不想跑,所以才去跑,這才是長距離跑者的思維方式
村上春樹
什麼是quaternion?
在3D程序中,通常用quaternion來計算3D物體的旋轉,可以把quaternion看做一個標量和一個3D向量的組合,在數學上,quaternion表示複數w+(xi+yj+zk),其中i,j,k都是虛數單位,實部w表示標量,虛部表示向量標記為V,或三個單獨的分量(x,y,z),所以quaternion可以記為[ w, V]或[ w,(x,y,x)]。對quaternion最大的誤解在於認為w表示旋轉角度,V表示旋轉軸。正確的理解應該是w與旋轉角度有關,v與旋轉軸有關。例如,要表示以向量N為軸,軸旋α度,相對的quaternion應該是:q =[ cos(α/ 2) , ( sina(α/ 2) Nx, sin(α/ 2)Ny, sin(α/ 2)Nz ) ]為了計算方便,一般要求N為單位矢量。對quaternion來說使用四個值就能記錄旋轉,而不是Matrix所需的十六個值。
quaternion和matrix有什麼不同?
與Matrix相比,quaternion更加高效,佔用的儲存空間更小,此外也更便於插值,quaternion是一個複數,複數乘法(叉乘)的幾何意義實際上就是對複數進行旋轉。對最簡單的複數p= x + yi來說,和另一個複數q = ( conα,sinα)相乘,則表示把p沿逆時針方向旋轉α:p』 = pq。當然,x+yi的形式只能表示2D變換,對3D變換來說就需要使用 quaternion了,而且計算也要複雜一點。為了對3D空間中的一個點p(x,y,z)進行旋轉,需要先把它轉換為quaternion形式p = [0, ( x, y, z)],接下來前面討論的內容,定義q = cos(α/ 2) , sin(α/ 2) N為旋轉quaternion,這裡N為單位矢量長度的旋轉軸,α為旋轉角度。那麼旋轉之後的點p』則為:p』 = qpq-1
什麼時候用quaternion,什麼時候用matrix?
如果能用quaternion就用quaternion,但是當不知道axis of rotation旋轉軸,不知道angle of rotation旋轉角度的時候,必須用matrix
quaternion的節點
euler_to_quaternion:使用給定的歐拉旋轉構建四元數
matx_to_quaternion:將矩陣轉換為四元數
quaternion:取一個角度和一個軸,並構造表示圍繞該軸的旋轉的四元數
quaternion_to_vec:輸出是四元數的組合角/軸,vec是圍繞旋轉的軸,長度是以弧度旋轉的量
quaternion_to_matx:將表示四元數的vector4轉換為表示相同旋轉的amatrix3值
rotate_by_quaternion:將提供的矢量根據四元數旋轉,由於輸入被視為向量,它是圍繞原點的旋轉
spherical_linear_interp:該運算符在兩個輸入的四元數之間計算球面線性插值,並輸出中間四元數,此插值將始終沿著最短的弧
vector_to_quaternion:輸入是角度/軸定義的旋轉,標準化版本形成圍繞旋轉的軸,長度是以弧度指定的旋轉的距離
quaternion和@orient屬性
輸出的四元數就是@orient屬性,如果點帶有這個@orient屬性,那麼copy的時候就會自動定向旋轉,一般輸出@orient的目的也就是為了copy的時候方便