乙個浮點數有32位,乙個四元數就有 32x4位。在滿足1023分之一的球面精度上,可以將四元數壓縮32位。
而浮點數的記憶體結構中,也存在一定的精度浪費,具體可以詳查浮點數的存諸結構。
壓縮與解壓思路:
1)4選3
:歸一化後的四元數滿足 x*x + y*y + z*z + w*w = 1, 所以, 我們只需要壓縮其中三個,另外乙個可以能過 1 減去被壓縮的三個分量的平方的和而得到。
所以32bit的unsigned int的使用為:取四元數四個分量中,取絕對值較小的三個分量
,壓入
前面30個bit中, 每個佔10個bit,取絕對值最大的分量的所在位置
壓入最後兩個bit。
在解壓的時候,從unisgned int的前30個bit中取出絕對值較小的三個分量,假設為: x, y, z,
再經√1-(x*x + y*y + z*z)來求得絕對值最大的分量,
再從最後兩個bit中取出最大分量的所在位置
,塞回四元數中。
2)最大分量的符號:
由1)可知, 最大的分量可以能過:√1-(x*x + y*y + z*z)來求出,但這樣求出的最大分量永遠是正數,無法表示負數。
四元數的另一特性可以解決這個問題: q(x,y,z,w) = q(-x,-y,-z,-w)
所以,在4選3的時候,一旦發現最大的分量的值為負數,馬上將四元數四個分量都取反,再進行解壓。
在解壓的時候,最大分量永過按正數處理即可。
3)三個較小分量壓遂個至10個bit中:
歸一化後的四元數滿足 x*x + y*y + z*z + w*w = 1,所以,x, y, z, w這四個分量中,絕對值第二大的分量一定小於或等於:1/√2
,也就是較小的三個分量的絕對值一定小於或等於1/√2, 也就是較小的三個分量的取值範圍為:-
1/√2 ~ 1/√2
推導: 假設 x , y 都為0, 且z = w, 有 2*z*z = 1, 有 z=1/√2
而10個bit的取值範圍為:0~1023,絕對值較小的三個分量的有壓縮為:將這三個分量,遂個從:-
1/√2 ~ 1/√2 對映到 0~1023 中, 再分別填入unsigned int的前面30個bit中。
解壓的時候就是,前面30個bit每個10個bit取出來,再從0~1023 對映回-
1/√2 ~ 1/√2 中。
後記1)
如此四元數壓縮成的unsigned int, 為32bit。 2)
用10個bit來表現千分之一個圓周上的精度,基本上能滿足遊戲表現上的需求
3)若不能滿足,還可以在千分之一的精度上做插值。
四元數壓縮
public void write quaternion value if abs z largest value if abs w largest value nafio info 最終要將4個分量存到uint中,這裡應該決定了哪個分量存哪個位置 假設largest 3 a value 4 4 v...
四元數基礎
以下內容摘自 3d數學基礎 圖形與遊戲開發 清華大學出版社 四元數 繞軸n旋轉 角 n是乙個向量,根據左手或右手法則定義旋轉的正方向,角表示旋轉的量。那麼表示這個旋轉的四元數為 幾何上存在兩個單位四元數,它們代表沒有角位移 任意四元數乘以乙個幾何單位四元數得到的角位移相同 雖然乘以兩種形式得到q和 ...
四元數左乘右乘 四元數 旋轉
四元數系列 首先很感謝各位的支援,本來我也就是說寫個自己看的筆記啥的,沒想到那麼多人點贊。本篇主要介紹旋轉相關的知識,其中會盡量把我認為精彩的部分說細一點,更像教程的方式去敘述,但是基礎性的公式證明應該還是不會提,畢竟篇幅有限。0.胡爾韋茲定理 上篇四元數定義中,為了完整性,我提到了三元數或五元數理...