為什麼directX裡表示三維座標要建乙個4 4的矩陣?

時間 2021-05-29 23:05:32

1樓:dbydd

這是齊次座標,最後一列表示平移量,最右下角哪個元素用於標記被變換的是乙個點還是向量。

最後乙個元素是1的向量是乙個點,最後乙個元素是0的向量是向量。

2樓:ijrys

你覺著加法就夠,是因為你只考慮了一次平移,在各種操作混起來的一組操作中,平移可能不止一次。

很多軟體都有個類似變形原點的東西,這個點定義了各種操作的源點。但是物體的變形原點基本都不在座標原點,在應用變換的時候,要先將這個點移動到座標源點,再變換,之後再移動回去。這樣每次變換就有兩次平移操作。

如果我先縮放,再旋轉,你會發現有平移、縮放、平移、平移、旋轉、平移這麼幾個步驟,如果縮放和旋轉的變形原點不是乙個點的話,中間的兩次平移是無法完全抵消的,至少會留下一次平移的操作需要。如果要把平移單獨提出來,那麼整個過程你要對每乙個操作單位都進行平移、縮放、平移、旋轉、平移,共三次平移和兩次矩陣變換,3 * 3+2 * 9 = 27次乘法 。如果我用4*4矩陣,我可以先計算出乙個最終的變換矩陣,對每個操作單位我只需要4 * 4 = 16次乘法,優勢已經出來了。

整個變換越多,差距就越大

3樓:張心欣

補充一點,也是我認為之前的回答都沒有提到的最重要的一點:

之所以要把本來可以計算量更小的座標變化演算法擴充套件到齊次座標變換而使用4x4矩陣乘法,

目的是為了使用乙個簡潔的,統一的運算操作來處理所有的變換。

目的是為了使用乙個簡潔的,統一的運算操作來處理所有的變換。

目的是為了使用乙個簡潔的,統一的運算操作來處理所有的變換。

這樣做有幾個好處:

1. 邏輯上所有的變換不必逐步處理了,可以合併為最終變換,於是乙個無論多歷程崎嶇的終變換,可以被很容易地拷貝到另乙個物體上(拷貝所有的變換過程vs拷貝乙個矩陣)。

2. 這個運算操作(矩陣乘法),可以被高度優化,甚至實現到電路板上,比軟體的實現快到那裡去。

4樓:張國楨

分子動力學程式用Quaternion 描述剛體轉動。據此猜測,題目裡提到的描述三維座標的4*4矩陣就是quaternion。

5樓:Dionysos lai

最近正在看《Real-Time Renderging》這本書,先回答其中乙個原因,其他留著看到在回答吧。

在三維座標軸中,在表示向量和點時,如果只是用三個元素表示,那麼表示形式都是乙個樣,這是十分含糊不清的。但是使用了4個元素,就可以避免這種情況了,例如第四個元素0代表當前是向量,1代表當前是點。同事,使用4*4矩陣形式,對於矩陣操作有極大的優勢(書上說在第4章和A.

4提到,目前還沒看到,就不講來)。

6樓:forcey

第四維是為了做除法。

比如你用三維矩陣的話, (x', y', z') = M * (x, y, z) 只能做乘法和加法

四維矩陣在齊次座標上可以做到:

(x', y', z', 1) = (x'h, y'h, z'h, h) = M * (x, y, z, 1)

這樣 x'h 是 (x, y, z, 1) 的線性組合,h 是 (x, y, z, 1) 的另乙個線性組合,

那麼 x' = f(x, y, z, 1) / g(x, y, z, 1) 比乘法和加法可以多做很多事情。

7樓:Milo Yip

的確,如果要表示仿射變換(affine transformation),是不需要用 4×4 矩陣的,只需要 3×3 矩陣再加上平移向量。

一些遊戲引擎會使用 4×3 或 3×4 矩陣去表示仿射變換。

但是,在使用到透示投影時,一般會使用到齊次座標(homogeneous coordinates),這時候就需要 4×4 矩陣。而在渲染過程,通常是把同一組變換施於多個點或向量,例如:

使用矩陣表示變換的好處之一,是矩陣乘法具結合性(associative):

這個代數性質令到我們可以先計算 ,然後施於大量點或向量

由於透示投影需要以 4×4 矩陣表示,所以一般把各種變換串接(復合)後,會形成乙個 4×4 矩陣。這樣做,無論需要做多少個變換,最後對每個點或向量而言也只需要做乙個矩陣對向量的乘法(就是4個點積)。在底層而言,這個運算也很適合使用 4-way SIMD 實現(4個乘法和3個加法運算)。

還有一點是,現在的主流硬體都提供可程式設計渲染管道,變換已經不是通過 API 處理,而是自行在著色器裡處理。一部分的變換可能會採用矩陣以外的形式,例如使用 dual quaternion 計算蒙皮。

因此,題目中「為什麼DirectX裡表示三維座標要建乙個4*4的矩陣」這個說法有兩個問題。第一,矩陣是用於表示變換而不是座標,第二,在 DirectX 9 及以後基本上都是用著色器做變換,所以和 DirectX 的關係不是很大。然而,DirectX 渲染管道的 raster stage 裡還是保留了固定的 perspective divide 單元,也就是說,著色器輸出的座標是以齊次座標表示。

《遊戲引擎架構》第4.3節矩陣、第10.1.4節虛擬攝像頭有相關的介紹。

----

更新:補充一下,仿射變換也是可以如矩陣變換般串接(復合)的。因為矩陣也具分配律,把兩個仿射變換施於乙個向量:

可見,串接後仍然是仿射變換的形式,換句話說這串接(復合)運算是閉合的。

8樓:

這樣的變換叫仿射變換 Affine transformation

這類變換的好處就是可以統一平移和旋轉操作, 簡化計算流程. 計算機最擅長做大量重複的事情, 不喜歡你打一槍換乙個靶子.

直觀上說, 就是把N維空間裡的物體拿到N+1維空間裡去, 並向著多出來的維度方向(隨便起個名字就叫W方向)做乙個1單位長度的"拖拽", 生成乙個N+1維的物體, 其W方向上的每乙個N維"截面"都是原N維物體的乙個複製. 所有的變換操作都是對著這個高一維的物體. 當我們做完變換要取得變換後的N維物體, 只要取W=1所代表的那個N維截面就行了.

這樣一來, N維的平移操作, 在N+1維空間就是對整個N+1維物體做垂直於W方向的切向拉伸. wiki鏈結裡的那個動畫很形象的說明了2維圖形平移的操作在3維空間是如何對應起來的.

9樓:戈君

第4維是為了平移。3維空間的變換實質都是在做形如ax + by + cz + d的點積,3維但有4個引數,缺了d的話所有的變換都在繞著原點轉。

10樓:

它們都沒說到點子上。首先api並不要求你所有運算都使用矩陣,只要求傳入時使用(其實非固定管線允許傳多個Vector4來靈活選擇4*3,4*4等)。程式設計在於效能,通用與相容性。

用你舉的例子來說,單一的平移運算加法確實是最快的方式,但是矩陣也提供了這樣的高效能可能性,即m41,m42,m43。

同時三維運算經常涉及交叉變換,平移與旋轉,先旋轉後平移還是先平移後旋轉的問題就有不同演算法,但用矩陣很容易解決,且通用。

最後一點,位移旋轉縮放側翻需要4*3矩陣,考慮到投影,api使用4*4矩陣保證了最大可能性。

因此4*4矩陣是最佳選擇。

11樓:New Cai

用4X4,把平移和線性變換統一起來。這樣給你乙個變換矩陣,要求它的逆變換(想要變換回去),是很簡單的事情。如果你要在矩陣操作中夾雜其他操作,那麼當你想做類似操作時就十分痛苦,你需要儲存乙個矩陣和平移的佇列,傻眼了不是?

w座標還可以用來作透視分離呢。

12樓:Carol的男盆友

其實最後一句才是重點 homogeneous coordinates可以表示某個方向無限遠的點。

上圖是2d 情況。

如果在3d情況下 (1,1,1,0)表示在(1 1 1)^T 方向的無限遠的點。

所以在 homogeneous coordinates下,我們可以使無限遠的點參加運算

比如說求水平線在視野裡的位置。

竟然沒人說到重點。。。。。

13樓:

反正也要投影,矩陣運算逃不掉的;然後四維矩陣把所有變換(平移、旋轉、縮放)放一塊了,硬體支援的四維矩陣運算比做完三維矩陣運算再做定位快

14樓:黃興

首先每個基本變換都可以表示為 P' = M1 * P + M2 的形式。

列向量 P P' 表示座標位置, M1是乙個包含乘法係數的 3 x 3 矩陣, M2是包含平移項的三元素列矩陣。對於平移,M1是單位矩陣,對於旋轉或縮放,M2包含與基準點或縮放固定點相關的平移項。

以上就是題主所說的平移操作加法就夠了。

當利用這個公式要進行單一的變化操作,似乎問題不大,但是如果要進行連續的變換就會很麻煩,比如先縮放再旋轉再平移。

更方便的方法是把M2消除掉,直接乙個矩陣就可表示任意變換操作。

需要把3 x 3的矩陣擴充套件為 4 x 4矩陣,就可以把任意的三維幾何變換的乘法和加法組合為單一矩陣表示。

三維的點怎麼表示為四元列向量呢,一般使用齊次座標(xh,yh,zh,h),最方便是設h=1,有(x,y,z,1)。同時(x,y,z,0)表示三維中的向量,被任意位移變換矩陣乘之後依然是(x,y,z,0)滿足向量特性。

所以還是4x4的矩陣好用。

見 《計算機圖形學》第三版第五章 Donald Hearn M.Pauline Baker

15樓:

你用 Homogeneous Coordinate 需要區分點和向量,三維矩陣你表示不了。

然後 3D Rotation 繞 xyz 三個軸轉,需要分開表示。

你要是把 Tralstation、Scale 和三個維度的 Rotation 擠到乙個三維矩陣裡……你就表示不了了。

16樓:Vinjn張靜

可以用乙個4X4 的矩陣整合平移矩陣和旋轉矩陣等,3X3 實現不了。

矩陣乘法在 GPU 很快。

可以用乙個矩陣代替 N 個矩陣,比如

WVP = World * View * Projection然後 World = Scale * Rotation * Translation

所以 WVP = Scale * Rotation * Translation * View * Projection,其中每乙個都是 4X4

為什麼空間是三維?

aqp 個人認為,三維空間的我們,是無法用三維空間的理論和認知認清其他維度的,我們無法感知高維度 三維的我們,限制了我們的存在和意識只能在三維 我感覺高維是存在的,但高維是怎麼觀察我們,高維是怎麼存在,我們三維生物不可能認知的 王平宇 這是個複雜的問題。一時半會也說不清楚。做簡單化地說明到容易 一,...

三維到底是哪三維,還有為什麼第四維是時間?

短歌行 三維是長寬高,四維是同時垂直這三維的,即時間。三維的長寬高都在時間這個進度條上變化。對於二維世界來說,他們的時間就是第三維,即平面在Z軸上變化。 六等星yoru 從空間的角度上說第四維應該不是時間,高度相對二維平面,第四維相對三維立體。四維物體可以概括成同乙個物體在三維中不同立體形態的集合,...

為什麼宇宙空間是三維的?

Starpxy 哈哈笑死我了,為什麼宇宙空間是三維的 的問題下面都是說 因為人能觀察到三維 但是下面的問題 為什麼人感知到的世界是三維的 中的回答又都是 因為宇宙是三維的 套娃回答嗎?為何我們能感知的世界是三維的? Frankie Ling 我們的宇宙很可能不是三維的,不能因為我們是只能感受三維空間...