四元數是複數向三維的擴充擴充套件,使用複數乘法來實現旋轉。具體參考如下:
understanding quaternions
understanding quaternions 中文翻譯
其實就是將二維空間使用矩形大小來表示,每個結點分為0:leftup, 1:leftdown, 2:rightup, 3:rightdown,然後遞迴儲存資料,一般資料儲存在葉子節點,也可以進行改進,可參考如下:
#include using std::list;
#define tree_depth 3
#define min_node_size 0.1
#define safe_delete(p) do while (false)
templateclass quadnode
; //0:leftup, 1:leftdown, 2:rightup, 3:rightdown
public:
quadnode(float left, float right, float up, float down) :
m_left(left), m_right(right), m_up(up), m_down(down) {}
~quadnode()
void setdatalist(listdata)
//遞迴生成四叉樹節點
void generatenode()
; for (list::iterator iter = m_datalist.begin(); iter != m_datalist.end();)
else
iter++;
}if (child_list.empty())
else
}} }
float calclinefx(point p, vector d, point s)
//判斷射線與四叉樹節點本身包圍盒是否相交,用於剪枝
bool intersectbound(point p, vector d)
//剪枝2
if (calclinefx(p, d, )*calclinefx(p, d, ) < 0) return true;
if (calclinefx(p, d, )*calclinefx(p, d, ) < 0) return true;
return false;
} //返回該射線相交的最近entity和距離
bool intersect(point p, vector d, t* &ent_near, point& inter, float& dist)
}} for (int i = 0; i < 4; i++) //再遞迴比較子節點中的最近交點
}} if (ent_near) return true;
else return false;
}};templateclass quadtree
void intersect(point p, vector d, t* &ent, point &inter)
};
四元數的理解和應用
四元數是簡單的 超複數。複數是由 實數加上虛數單位 i 組成,其中i 2 1。相似地,四元數都是由實數加上三個虛數單位 i j k 組成,而且它們有如下的關係 i 2 j 2 k 2 1,i 0 j 0 k 0 1 每個四元數都是 1 i j 和 k 的線性組合,即是四元數一般可表示為a bk cj...
四元數和尤拉角的個人理解
歐垃角可以表示兩個座標之間的轉換,但是存在一些弊端,比如永珍鎖,四元數也可以表述 問題分析 比如,乙個座標系繞y軸旋轉pi 2,那麼我們就可以用尤拉角roll,pitch,yaw和四元數x,y,z,w進行表述,w cos theta 2 x ax sin theta 2 y ay sin theta...
四元數乘法 剛體旋轉中的四元數
四元數博大精深,用途之一圖形學中的三維旋轉。單純從應用角度考慮,四元數可以以如下方式應用於旋轉。旋轉示意圖 假定我們有乙個經過原點的旋轉軸 其中 則,3d旋轉可以通過四元數乘法來表示 1 其中,為單位四元數,等價於 和 分別為 的共軛和逆。對於單位四元數而言 根據式 1 結合四元數的乘法,可以完成一...