先來看下下面的總結表:
不同的方位表示方法適用於不同的情況,下面是一些選擇的建議:
//設矩陣儲存在下面這些變數中
float m11, m12, m13;
float m21, m22, m23;
float m31, m32, m33;
//以弧度形式計算尤拉角並儲存在以下變數中(360° == 2π弧度)
float h, p, b;
//從m23計算pitch
float sp = -m23;
if(sp <= -1.0f)
else
if(sp >= 1.0f)
else
//檢查萬向鎖情況並計算heading,bank
if(sp > 0.9999f)
else
//輸入矩陣
float m11, m12, m13;
float m21, m22, m23;
float m31, m32, m33;
//輸入四元數
float w, x, y, z;
//檢測w, x, y, z中的最大絕對值
float fourwsquaredminus1 = m11 + m22 + m33;
float fourxsquaredminus1 = m11 - m22 - m33;
float fourysquaredminus1 = m22 - m11 - m33;
float fourzsquaredminus1 = m33 - m11 - m22;
int biggestindex = 0;
float fourbiggestsquaredminus1 = fourwsquaredminus1;
if(fourxsquaredminus1 > fourbiggestsquaredminus1)
if(fourysquaredminus1 > fourbiggestsquaredminus1)
if(fourzsquaredminus1 > fourbiggestsquaredminus1)
//計算平方根和除數
float biggestval = sqrt(fourbiggestsquaredminus1 + 1.0f) * 0.5f;
float mult = 0.25f / biggestval;
//計算四元數的四個分量
switch (biggestindex)
//用全域性變數儲存輸入輸出
float w, x, y, z;
float h, p, b;
//計算sin(pitch)
float sp = -2.0f * (y * z + w * x);
//檢查萬向鎖並計算出尤拉角
if(fabs(sp) > 0.9999f)
else
從物體–慣性四元數轉換到尤拉角**例項(只是將x,y,z值變負,因為共軛):
//用全域性變數儲存輸入輸出
float w, x, y, z;
float h, p, b;
//計算sin(pitch)
float sp = -2.0f * (y * z - w * x);
//檢查萬向鎖並計算出尤拉角
if(fabs(sp) > 0.9999f)
else
3D數學基礎
vector是向量,向量的意思,向量既有大小,又有方向,verctor3 就是三維向量,乙個三維向量會有三個分量,分別是 x,y,z,在 unity 中每乙個遊戲物件都至少會有乙個元件叫 transform,transform 主要用來控制遊戲物件的位置,旋轉和縮放。vector3.distance...
3D數學讀書筆記 3D中的方位與角位移
方位和角位移的基本概念 什麼是方位 角位移?直觀的說,我們知道,物體的 方位 主要描述物體的朝向,然而,方向 和 方位 並不完全一樣。向量有 方向 但沒有 方位 區別在於,當乙個向量指向特定方向時,可以讓向量自轉,但向量卻不會發生任何變化,因為向量的屬性只有大小,而沒有厚度和寬度。然而,當乙個物體朝...
3D數學基礎 向量
vector3.h hello 注釋 是否需要const修飾就是分析其資料是否需要修改,不需要修改就加const,安全性 一般有兩個地方需要考慮是否加const 1,成員函式引數處 2,成員函式本身,即類本身資料不允許修改 修飾的是this ifndef hello vector3 h define...