四元數學習之四元數和矩陣的轉換

2021-08-27 14:24:32 字數 1826 閱讀 6136

四元數是一種可以替代矩陣和尤拉角的數學工具。他最初是由william rowan hamilton發現的(參考維基百科),它的最大的特點是不滿足交換率。也談一下自己對這一點的體會。在離散數學中有講到半群、群、環和域的概念,其中環的定義是具有交換率和分配率(詳情參考環的數學定義),而域的概念則是在環的基礎上加上了交換率。所以說四元數無法滿足域的定義,它是除法環的一種。何為除法環?其實很簡單,被除數和除數都滿足結合律和分配律,但是如果要滿足交換律,即被除數和除數交換位置,那麼它的結果是不同的(準確地說,如果它們不為0的話,那麼結果呈倒數關係)。又由於要在四維解空間上解得i3=-1,所以只能在不滿足交換率的條件下得出i、j、k。

四元數在計算機圖形學的優勢在於運算量小和利於插值,且旋轉沒有缺陷。可是普通的乙個四元數定義又比較難懂,而且opengl的api中又沒有帶四元數的引數的函式,所以需要我們根據公式做一做小小的轉換。

原創文章,反對未宣告的引用。原部落格位址

:設四元數q(x, y, z, w)表示向量a(xa,ya, za)經過α角旋轉後的結果,則x、y、z和w分別為:

將這兩個公式結合起來。再結合高中所學的半形公式:

sinα = 2sin(α/2)·cos(α/2)

cosα = cos2(α/2) - sin2(α/2)

cos2(α/2) = (1 +cosα)/2

sin2(α/2) = (1 -cosα)/2

可以解出用四元數表示旋轉矩陣為:

該來驗證一下公式的正確性,同樣地,採用opengl託管的矩陣來測試,看看使用自帶的glrotatef()函式和我們寫的公式相比,究竟有沒有差距。

首先寫了乙個簡單的quaternion類,它的定義如下:

#ifndef quaternion_h

#define quaternion_h

#include #include class quaternion

void tomatrix( float matrix )

static quaternion fromrotation( float _x,

float _y,

float _z,

float angleindegree )

private:

float x, y, z, w;

};#endif // quaternion_h

下面展示了如何呼叫這個類。

#include #include #include "glwidget.h"

#include "quaternion.h"

void printmatrix( float matrix[16] )

glwidget::glwidget( qwidget* pparent ):

qglwidget( pparent )

void glwidget::initializegl( void )

void glwidget::paintgl( void )

以下是執行結果。

這說明上述運算是正確的。

四元數學習之用四元數旋轉向量

四元數學習之用四元數旋轉向量 最近對四元數的學習又深入了一些,既然可以用四元數來表示三維物體的旋轉,那麼如何由乙個向量和四元數作用得到乙個旋轉後的向量呢?上篇部落格講到了如何將四元數轉化為矩陣,這次其實是上一次的延伸,我們知道矩陣可以和向量進行相乘的,方法是將向量填充為四維齊次向量,然後4 4的矩陣...

四元數和旋轉矩陣

quaternion 四元數 quaternion 的定義 四元數一般定義如下 q w xi yj zk 其中 w,x,y,z是實數。同時,有 i i 1 j j 1 k k 1 四元數也可以表示為 q w,v 其中v x,y,z 是向量,w是標量,雖然v是向量,但不能簡單的理解為3d空間的向量,它...

四元數和尤拉角學習

在3d圖形學中,最常用的旋轉表示方法便是四元數和尤拉角,比起矩陣來具有節省儲存空間和方便插值的優點。本文主要歸納了兩種表達方式的轉換,計算公式採用3d笛卡爾座標系 圖1 3d cartesian coordinate system from wikipedia 定義圖2 tait bryan ang...