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