四元數壓縮

2022-06-18 09:15:09 字數 1696 閱讀 4030

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] = value[0] = x

//b = value[5%4] = value[1] = y

//c = value[6%4] = value[2] = z

//假設largest=2

//a = value[3%4] = value[3] = w

//b = value[4%4] = value[0] = x

//c = value[5%4] = value[1] = y

if (value[largest] >= 0f)

else

//nafio 這裡 1/根號2 有什麼玄機還不清楚

//這裡實際是個精度,但為什麼精度是這個需要考慮

// serialize

const float minimum = -1.0f / 1.414214f; // note: 1.0f / sqrt(2)

const float maximum = +1.0f / 1.414214f;

const float delta = maximum - minimum;

const uint maxintegervalue = (1 << 10) - 1; // 10 bits

const float maxintegervaluef = (float)maxintegervalue;

float normalizedvalue;

uint integervalue;

uint sentdata = ((uint)largest) << 30;

// a

normalizedvalue = mathf.clamp01((a - minimum) / delta);

integervalue = (uint)mathf.floor(normalizedvalue * maxintegervaluef + 0.5f);

sentdata = sentdata | ((integervalue & maxintegervalue) << 20);

// b

normalizedvalue = mathf.clamp01((b - minimum) / delta);

integervalue = (uint)mathf.floor(normalizedvalue * maxintegervaluef + 0.5f);

sentdata = sentdata | ((integervalue & maxintegervalue) << 10);

// c

normalizedvalue = mathf.clamp01((c - minimum) / delta);

integervalue = (uint)mathf.floor(normalizedvalue * maxintegervaluef + 0.5f);

sentdata = sentdata | (integervalue & maxintegervalue);

write(sentdata);

}

四元數壓縮

乙個浮點數有32位,乙個四元數就有 32x4位。在滿足1023分之一的球面精度上,可以將四元數壓縮32位。而浮點數的記憶體結構中,也存在一定的精度浪費,具體可以詳查浮點數的存諸結構。壓縮與解壓思路 1 4選3 歸一化後的四元數滿足 x x y y z z w w 1,所以,我們只需要壓縮其中三個,另...

四元數基礎

以下內容摘自 3d數學基礎 圖形與遊戲開發 清華大學出版社 四元數 繞軸n旋轉 角 n是乙個向量,根據左手或右手法則定義旋轉的正方向,角表示旋轉的量。那麼表示這個旋轉的四元數為 幾何上存在兩個單位四元數,它們代表沒有角位移 任意四元數乘以乙個幾何單位四元數得到的角位移相同 雖然乘以兩種形式得到q和 ...

四元數左乘右乘 四元數 旋轉

四元數系列 首先很感謝各位的支援,本來我也就是說寫個自己看的筆記啥的,沒想到那麼多人點贊。本篇主要介紹旋轉相關的知識,其中會盡量把我認為精彩的部分說細一點,更像教程的方式去敘述,但是基礎性的公式證明應該還是不會提,畢竟篇幅有限。0.胡爾韋茲定理 上篇四元數定義中,為了完整性,我提到了三元數或五元數理...