齊次座標 四元數

2021-08-05 19:50:01 字數 3998 閱讀 1722

(一)齊次座標:

「齊次座標表示是計算機圖形學的重要手段之一,它既能夠用來明確區分向量和點,同時也更易用於進行仿射(線性)幾何變換。」—— f.s. hill, jr。:

對於乙個向量

v以及基

oabc

,可以找到一組座標

(v1,v2,v3)

,使得v = v1 a + v2 b + v3c          (1

)對於乙個點

p,則可以找到一組座標(

p1,p2,p3

),使得p –

o = p1 a + p2 b + p3c             (2

)從上面對向量和點的表達,我們可以看出為了在座標系中表示乙個點(如

p),我們把點的位置看作是對這個基的原點

o所進行的乙個位移,即乙個向量——p–

> o

(有的書中把這樣的向量叫做位置向量——起始於座標原點的特殊向量),我們在表達這個向量的同時用等價的方式表達出了點p:

p = o + p1 a + p2 b +p3 c    (3)

(1)(3)

是座標系下表達乙個向量和點的不同表達方式。這裡可以看出,雖然都是用代數分量的形式表達向量和點,但表達乙個點比乙個向量需要額外的資訊。如果我寫出乙個代數分量表達

(1, 4, 7)

,誰知道它是個向量還是個點!

我們現在把(1)(

3)寫成矩陣的形式:

v = (v1 v2 v3 0) x (a bc o)

p = (p1 p2p3 1) x (a b c o),

這裡(a,b,c,o)

是座標基矩陣,右邊的列向量分別是向量v和點

p在基下的座標。這樣,向量和點在同乙個基下就有了不同的表達:

l  3d

向量的第

4個代數分量是

0l  3d

點的第4

個代數分量是1。

像這種這種用

4個代數分量表示

3d幾何概念的方式是一種齊次座標表示。

這樣,上面的

(1, 4, 7)

如果寫成(

1,4,7,0

),它就是個向量;如果是

(1,4,7,1)

,它就是個點。

下面是如何在普通座標

(ordinary coordinate)

和齊次座標

(homogeneouscoordinate)

之間進行轉換:

(1)從普通座標轉換成齊次座標時

如果(x,y,z)

是個點,則變為

(x,y,z,1);

如果(x,y,z)

是個向量,則變為

(x,y,z,0)

(2)從齊次座標轉換成普通座標時

如果是(x,y,z,1)

,則知道它是個點,變成

(x,y,z);

如果是(x,y,z,0)

,則知道它是個向量,仍然變成

(x,y,z)

以上是通過齊次座標來區分向量和點的方式。從中可以思考得知,對於平移

t、旋轉

r、縮放s這

3個最常見的仿射變換,平移變換只對於點才有意義,因為普通向量沒有位置概念,只有大小和方向

.;而旋轉和縮放對於向量和點都有意義,你可以用類似上面齊次表示來檢測。從中可以看出,齊次座標用於仿射變換非常方便。

此外,對於乙個普通座標的點

p=(px, py, pz)

,有對應的一族齊次座標

(wpx, wpy, wpz, w)

,其中w

不等於零。比如,

p(1, 4, 7)

的齊次座標有

(1, 4, 7, 1)

、(2, 8, 14, 2

)、(-0.1, -0.4, -0.7, -0.1

)等等。因此,如果把乙個點從普通座標變成齊次座標,給

x,y,z

乘上同乙個非零數

w,然後增加第

4個分量

w;如果把乙個齊次座標轉換成普通座標,把前三個座標同時除以第

4個座標,然後去掉第

4個分量。

由於齊次座標使用了

4個分量來表達

3d概念,使得平移變換可以使用矩陣進行,從而如

f.s. hill,jr

所說,仿射(線性)變換的進行更加方便。由於圖形硬體已經普遍地支援齊次座標與矩陣乘法,因此更加促進了齊次座標使用,使得它似乎成為圖形學中的乙個標準。

(二)四元數:

旋轉,是三種座標變換——縮放、旋轉和平移,中最複雜的一種了。

旋轉的表示方法——矩陣旋轉和尤拉旋轉

和四元數旋轉。

1、矩陣旋轉使用了乙個4*4大小的矩陣來表示繞任意軸旋轉的變換矩陣

2、尤拉選擇則是按照一定的座標軸順序(例如先x、再y、最後z)、每個軸旋轉一定角度來變換座標或向量,它實際上是一系列座標軸旋轉的組合。

3、四元數

本質上是一種高階複數,是乙個四維空間,相對於複數的二維空間。

舉個栗子:我們高中的時候應該都學過複數,乙個複數由實部和虛部組成,即x = a+ bi,i是虛數單位,如果你還記得的話應該知道i^2 =-1。而四元數其實和我們學到的這種是類似的,不同的是,它的虛部包含了三個虛數單位,i、j、k,即乙個四元數可以表示為x = a+ bi + cj + dk。那麼,它和旋轉為什麼會有關係呢?

在unity裡,tranform元件有乙個變數名為rotation,它的型別就是四元數。很多初學者會直接取rotation的x、y、z,認為它們分別對應了transform面板裡r的各個分量。當然很快我們就會發現這是完全不對的。實際上,四元數的x、y、z和r的那三個值從直觀上來講沒什麼關係,當然會存在乙個表示式可以轉換。

乙個四元數可以表示為q = w + xi + yj + zk,現在就來回答這樣乙個簡單的式子是怎麼和三維旋轉結合在一起的。為了方便,我們下面使用

q = ((x, y, z),w)= (v, w),其中v是向量,w是實數,這樣的式子來表示乙個四元數。

我們可以使用乙個四元數q

=((x,y

,z)sin

θ2, cos

θ2) 來執行乙個旋轉。具體來說,如果我們想要把空間的乙個點p繞著單位向量軸u = (x, y, z)表示的旋轉軸旋轉θ角度,我們首先把點p擴充套件到四元數空間,即四元數p = (p, 0)。那麼,旋轉後新的點對應的四元數(當然這個計算而得的四元數的實部為0,虛部係數就是新的座標)為:p′

=qpq−1

其中,q

=(cos

θ2, (x,

y,z)sin

θ2) ,q−1=

q∗n(

q),由於u是單位向量,因此n(

q)=1,即q−1

=q∗。右邊表示式包含了四元數乘法。

我們舉個最簡單的例子:把點p(1, 0, 1)繞旋轉軸u = (0, 1, 0)旋轉90°,求旋轉後的頂點座標。首先將p擴充到四元數,即p = (p, 0)。而q = (u*sin45°, cos45°)。求p′=

qpq−1的值。建議大家一定要在紙上計算一邊,這樣才能加深印象,連筆都懶得動的人還是不要往下看了。最後的結果p` = ((1, 0, -1), 0),即旋轉後的頂點位置是(1, 0, -1)。

如果想要得到復合旋轉,只需類似復合矩陣那樣左乘新的四元數,再進行運算即可。

最後我們可以了解這三種旋轉方式的優缺點:

缺點:

尤拉旋轉

缺點:

四元數旋轉

缺點:

說下四元數旋轉的幾個需要注意的地方

下面是幾點建議:

齊次座標的理解

一直對齊次座標這個概念的理解不夠徹底,只見大部分的書中說道 齊次座標在仿射變換中非常的方便 然後就沒有了後文,今天在乙個叫做 三百年 重生 的部落格上看到一篇關於透視投影變換的 的文章,其中有對齊次座標有非常精闢的說明,特別是針對這樣一句話進行了有力的證明 齊次座標表示是計算機圖形學的重要手段之一,...

齊次座標的理解

一直對齊次座標這個概念的理解不夠徹底,只見大部分的書中說道 齊次座標在仿射變換中非常的方便 然後就沒有了後文,今天在乙個叫做 三百年 重生 的部落格上看到一篇關於透視投影變換的 的文章,其中有對齊次座標有非常精闢的說明,特別是針對這樣一句話進行了有力的證明 齊次座標表示是計算機圖形學的重要手段之一,...

齊次座標的理解

在乙個叫做 三百年 重生 的部落格上看到一篇關於透視投影變換的 的文章,其中有對齊次座標有非常精闢的說明,特別是針對這樣一句話進行了有力的證明 齊次座標表示是計算機圖形學的重要手段之一,它既能夠用來明確區分向量和點,同時也更易用於進行 仿射 線性 幾何變換。f.s.hill,jr。下面是作者對齊次座...