四元數壓縮

2021-10-08 07:22:54 字數 1571 閱讀 7516

乙個浮點數有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.胡爾韋茲定理 上篇四元數定義中,為了完整性,我提到了三元數或五元數理...