三維空間中的向量
幾何學中,我們用有向線段表示向量,如圖1。向量的兩個屬性是他的長度和他的頂點所指的方向。因此,可以用向量來模擬既有大小又有方向的物理模型。例如,以後我們要實現的粒子系統。我們用向量來模擬粒子的速度和加速度。在3d計算機圖形學中我們用向量不僅僅模擬方向。例如我們常常想知道光線的照射方向,以及在3d世界中的攝象機。向量為在3維空間中表示方向的提供了方便。
向量與位置無關。有同樣長度和方向的兩個向量是相等的,即使他們在不同的位置。觀察彼此平行的兩個向量,例如在圖1中u和v是相等的。
我們繼續學習左手座標系。圖2顯示的是左手座標系和右手座標系。兩者不同的是z軸的方向。在左手座標系中z軸是向書的裡面去的,而右手座標系是向書的外邊去的。
因為向量的位置不能改變它的性質,我們可以把所有向量平移使他們的尾部和座標系的原點重合。因此,當乙個向量在標準位置我們能通過頭點來描述向量。圖3顯示的是圖1中的向量在標準位置的樣子。
我們通常用小寫字母表示乙個向量,但有時也用大寫字母。如2、3和4維向量分別是:
u= (ux, uy),
n= (nx, ny, nz),
c= (cx, cy, cz, cw)。
我們現在介紹4個特殊的3d向量,就象圖4顯示的。首先是都由含有0的零向量;它被表示成加粗的0= (0, 0, 0)。接下來3個特殊的向量標準基向量。它們被叫做i,j和k向量,分別沿著座標系的x軸,y軸和z軸,並且有1的單位長:i= (1, 0, 0),j= (0, 1, 0), andk= (0, 0, 1)。
注意:只有1個單位長度的向量叫做單位向量(模長為1的向量)。
在d3dx庫中,我們能用d3dxvector3類表示3維空間中的向量。它的定義是:
typedef struct d3dxvector3 : public d3dvector ;
d3dxvector3( const float * );
d3dxvector3( const d3dvector& );
d3dxvector3( float x, float y, float z );
// casting
operator float* ();
operator const float* () const;
// assignment operators
d3dxvector3& operator += ( const d3dxvector3& );
d3dxvector3& operator -= ( const d3dxvector3& );
d3dxvector3& operator *= ( float );
d3dxvector3& operator /= ( float );
// unary operators
d3dxvector3 operator + () const;
d3dxvector3 operator - () const;
// binary operators
d3dxvector3 operator + ( const d3dxvector3& ) const;
d3dxvector3 operator - ( const d3dxvector3& ) const;
d3dxvector3 operator * ( float ) const;
d3dxvector3 operator / ( float ) const;
friend d3dxvector3 operator * ( float,
const struct d3dxvector3& );
bool operator == ( const d3dxvector3& ) const;
bool operator != ( const d3dxvector3& ) const;
} d3dxvector3, *lpd3dxvector3;
note that d3dxvector3 inherits its component data from d3dvector, which is defined as:
typedef struct _d3dvector d3dvector;
向量有它們自己的演算法,就象你在d3dxvector3定義中看到的數**算。現在你不需要知道它們怎麼使用。以後介紹這些向量運算以及一些有用的函式和關於向量的,重要的詳細資料。
注意:在3d圖形程式中,雖然我們主要關心3d向量,但有時也會用到2d和4d向量。在d3dx庫中提供了d3dxvector2和d3dxvector4類來分別表現2d和4d向量。不同維數的向量有著和3d向量一樣的性質,也就是它們描述大小和方向,僅僅是在不同的維數中。所有這些向量的數**算對於不同維數向量都有效只是有乙個除外,就是向量積。這些運算我們可通過論述3d向量擴充套件到2d, 4d甚至n維向量。
向量相等
幾何學上,有同樣方向和長度的兩個向量相等。數學上,我們說有同樣維數和分量的向量相等。例如:如果ux = vx, uy = vy, 且 uz = vz.那麼(ux, uy, uz) = (vx, vy, vz)。在**中我們能夠用「==」判斷兩個向量相等。
d3dxvector u(1.0f, 0.0f, 1.0f);
d3dxvector v(0.0f, 1.0f, 0.0f);
if( u == v ) return true;
同樣的,我們也能用「!=」判斷兩個向量不相等。
if( u != v ) return true;
注意:當比較浮點數時,必須注意。因為浮點數不是精確的,我們認為相等的兩個浮點數是有細微差別的;因此,我們測試它們近似相等。我們定義乙個常數epsilon,把它當作非常小的「buffer」。假如兩個數和epsilon相差很小我們說它們近似相等。換句話說,epsilon讓浮點數有一定的精度。接下來的例項函式是怎樣用epsilon比較兩個浮點數相等。
bool equals(float lhs, float rhs)
// if lhs == rhs their difference should be zero
return fabs(lhs - rhs) < epsilon ? true : false;
當我們用d3dxvector3類時不必擔心,因為它已經幫我們處理了,但是在一般情況下適當注意比較兩個浮點數是很重要的。
D3D程式設計必備的數學知識(5)
平面 d3dx平面 在 中描述乙個平面 僅僅需要乙個法向量n和常數d就可以了。因此我們就使用乙個4d向量 我們記錄成 n,d 來實現它。d3dx庫中用如下的結構來定義乙個平面 typedef struct d3dxplane d3dxplane const float d3dxplane const...
D3D數學基礎(初級篇)
direct3d遊戲開發學習筆記3 d3d數學基礎 初級篇 一 數學工具在虛擬3d世界中的作用 d3d與d3dx的關係 1 數學的作用 數學是搭建虛擬3d世界的基礎,角色控制 動畫 關照計算 陰影計算 特效顯示等等,數學在裡面都起著支柱作用 2 d3d與d3dx的關係 d3d是基本庫的函式,任何跟基...
D3D的動作融合
d3d的動作融合 當遊戲主角由走路變為跑步時,如果生硬的切換動作。會不真實。最常見的辦法是將走路與跑步的動作進行插值融合。今天做了一下這部分的工作。效果還不錯。原理就是 d3dxmatrix tlerpmatrix tlerpmatrix 1 vactionlerp tbonematrix vact...