D3D程式設計必備的數學知識(5)

2021-09-05 18:39:07 字數 4118 閱讀 1827

平面

d3dx平面

在**中描述乙個平面:僅僅需要乙個法向量n和常數d就可以了。因此我們就使用乙個4d向量(我們記錄成(n, d))來實現它。d3dx庫中用如下的結構來定義乙個平面:

typedef struct d3dxplane

d3dxplane( const float* );

d3dxplane( const d3dxfloat16* );

d3dxplane( float a, float b, float c, float d );

// casting

operator float* ();

operator const float* () const;

// unary operators

d3dxplane operator + () const;

d3dxplane operator - () const;

// binary operators

bool operator == ( const d3dxplane& ) const;

bool operator != ( const d3dxplane& ) const;

#endif //__cplusplus

float a, b, c, d;

} d3dxplane, *lpd3dxplane;

對照等式(8)可知:這裡a, b和c是平面法向量n的成員,d就是那個常數。

點和平面的空間關係

我們判定點和平面的關係主要是利用等式(8)來實現。例如,假設平面(n, d),我們能判定點p和平面的關係

假如n·p+ d = 0,那麼點p與平面共面。

假如n·p+ d >0,那麼點p在平面的前面且在平面的正半空間裡。

假如n·p+ d

<0,那麼點p在平面的背面且在平面的負半空間裡。

下邊的d3dx函式就是利用n·p+ d 來判定點和平面的關係的函式:

float d3dxplanedotcoord(

const d3dxplane *pp, // 平面

const d3dxvector3 *pv // 點

// 測試點相對於平面的位置

d3dxplane p(0.0f, 1.0f, 0.0f, 0.0f);

d3dxvector3 v(3.0f, 5.0f, 2.0f);

float x = d3dxplanedotcoord( &p, &v );

if( x > 0 ) // v在正半空間

if( x < 0 ) // v在負半空間

建立平面

我們能通過兩種方法建立平面。

第一種方法,直接用指定法線和點建立平面。假設法線n和在平面上的已知點p0,我們就能求出d:

n·p0+ d = 0

n·p0 = -d

-n·p0 = d

d3dx庫提供如下函式來完成建立平面的任務:

d3dxplane *d3dxplanefrompointnormal(

d3dxplane* pout, // result.

const d3dxvector3* ppoint, // point on the plane.

const d3dxvector3* pnormal // the normal of the plane.

第二種方法,我們能通過在平面上的3個點創立乙個平面。

假如有點p0,p1,p2,那麼我們就能得到平面上的兩個向量:

u = p1 -p0

v = p2 -p0

因此我們能通過把平面上的兩個向量進行叉乘得到平面的法線。回憶左手座標系。

n = u × v

then, -(n·p0) = d.

d3dx庫提供如下函式來完成通過同一平面上的3個點確定乙個平面:

d3dxplane *d3dxplanefrompoints(

d3dxplane* pout, // result.

const d3dxvector3* pv1, // point 1 on the plane.

const d3dxvector3* pv2, // point 2 on the plane.

const d3dxvector3* pv3 // point 3 on the plane.

變換平面

我們能夠通過如下處理來變換乙個面(n, d),就象乙個4d向量通過乘以它所期望的變換矩陣的逆矩陣一樣來達到變換目的。注意平面的法向量必須首先被標準化。

我們能用下面的d3dx函式來完成操作:

d3dxplane *d3dxplanetransform(

d3dxplane *pout, // result

const d3dxplane *pp, // input plane.

const d3dxmatrix *pm // transformation matrix.

示例**:

d3dxmatrix t(...); // init. t to a desired transformation.

d3dxmatrix inverseoft;

d3dxmatrix inversetransposeoft;

d3dxmatrixinverse( &inverseoft, 0, &t );

d3dxmatrixtranspose( &inversetransposeoft, &inverseoft );

d3dxplane p(...); // init. plane.

d3dxplanenormalize( &p, &p ); // make sure normal is normalized.

d3dxplanetransform( &p, &p, &inversetransposeoft );

射線(可選的)

設想在遊戲中的乙個玩家,正用他的槍射擊敵人。我們怎麼判斷子彈是否從乙個位置擊中另乙個位置的目標?乙個方法是用一條射線模擬子彈,用乙個球體模型模擬敵人。(球體模型只是乙個球體,它緊緊的圍繞乙個物體,從而粗略地表示它的大小。球體模型將在第11章中做更詳細的介紹。)那麼通過計算我們就能夠判定是否射中球體。在這部分我們學習射線的數學模型。 射線

一條射線能用乙個起點和方向來描述。射線的引數方程是:

線/面相交

假設一條射線p(t) =p0 + tu和 乙個平面n·p+ d = 0,我們想知道射線是否與平面相交,以及相交的交點資訊(如果相交的話)。照這樣做,我們把射線代入平面方程並且求滿足平面方程的引數t,解答出來的引數就是相交的點。

把等式(9)代入平面方程:

D3D程式設計必備的數學知識(1)

三維空間中的向量 幾何學中,我們用有向線段表示向量,如圖1。向量的兩個屬性是他的長度和他的頂點所指的方向。因此,可以用向量來模擬既有大小又有方向的物理模型。例如,以後我們要實現的粒子系統。我們用向量來模擬粒子的速度和加速度。在3d計算機圖形學中我們用向量不僅僅模擬方向。例如我們常常想知道光線的照射方...

D3D數學基礎(初級篇)

direct3d遊戲開發學習筆記3 d3d數學基礎 初級篇 一 數學工具在虛擬3d世界中的作用 d3d與d3dx的關係 1 數學的作用 數學是搭建虛擬3d世界的基礎,角色控制 動畫 關照計算 陰影計算 特效顯示等等,數學在裡面都起著支柱作用 2 d3d與d3dx的關係 d3d是基本庫的函式,任何跟基...

D3D的動作融合

d3d的動作融合 當遊戲主角由走路變為跑步時,如果生硬的切換動作。會不真實。最常見的辦法是將走路與跑步的動作進行插值融合。今天做了一下這部分的工作。效果還不錯。原理就是 d3dxmatrix tlerpmatrix tlerpmatrix 1 vactionlerp tbonematrix vact...