遊戲程式設計系列(1) 3D向量類的實現

2021-04-15 08:16:59 字數 3329 閱讀 4409

3d向量有兩個重要特性:長度和方向。在遊戲中我們用向量來表示場景中的光照、加速度、速度、各種重要參考線等。作為完整的3d向量類需要有除了四則運算、比較、賦值之外的更多的向量操作,比如:歸一化、叉積、點積、插值、與各軸的傾角、旋轉等。

template< class t >

class vector3d

vector3d( t x, t y, t z )

: m_vx(x), m_vy(y), m_vz(z)

vector3d( const vector3d& that )

:  m_vx(that.m_vx), m_vy(that.m_vy), m_vz(that.m_vz)

public:

vector3doperator-() const

vector3d& operator=(const vector3d& that)

vector3doperator-(const vector3d& that) const

vector3d& operator-=(const vector3d& that)

vector3doperator+(const vector3d& that) const

vector3d& operator+=(const vector3d& that)

vector3doperator*(const vector3d& that) const

vector3doperator*(t v) const

vector3d& operator*=(const vector3d& that)

vector3d& operator*=( t v )

vector3doperator/(const vector3d& that) const

vector3doperator/(t v) const

vector3d& operator/=(const vector3d& that)

vector3d& operator/=( t v )

bool operator==(const vector3d& that) const

bool operator!=(const vector3d& that) const

bool operator>=(const vector3d& that) const

bool operator<=(const vector3d& that) const

bool equal(const vector3d& that) const

void set( t x, t y, t z)

void set( const vector3d& that )

f64 getlength() const

//獲取2次長度

t getlengthsquare() const

//獲取點積

t getdotproduct( const vector3d& that) const

//計算兩空間點距離

f64 getdistancefrom(const vector3d& that) const

//計算空間兩向量的距離2次

t getdistancesquarefrom(const vector3d& that) const

//計算兩向量的叉積    

vector3dgetcrossproduct(const vector3d& that) const

//判斷是否在引數兩點之間

bool isbetweenpoints(const vector3d& begin, const vector3d& end) const

//歸一化

vector3d& normalize(void)

//設定向量長度

void setlength(t newlen)

//反轉向量

void invert(void)

//以引數點為中心沿y軸旋轉引數角度

////y軸旋轉矩陣

//       |cos 0  -sin 0|

// m=  |0    1  0     0|

//       |sin  0   cos 0| 

//       |0     0   0    1|

////公式推導:

// |i, j, k, 1| |    i, j,     k, 1|

// |x, y, z, 1|*m =|(cos*x+sin*z), y, -sin*x+cos*z, 1|

//void rotatexzbyy(f64 deg, const vector3d& center)

//以引數點為中心沿x軸旋轉引數角度

////x軸旋轉矩陣

//       |1  0  0 0|

// m= |0   cos   sin 0|

//       |0  -sin   cos 0| 

//       |0  0  0 1|

////公式推導:

// |i, j, k, 1| |i,        j,     k, 1|

// |x, y, z, 1|*m =|x, (cos*y-sin*z)y, sin*y+cos*z, 1|

//void rotateyzbyx(f64 deg, const vector3d& center)

//以引數點為中心沿z軸旋轉引數角度

////z軸旋轉矩陣

// m= |cos  sin 0 0|

//       |-sin cos 0 0|

//       |0  0 1 0| 

//       |0  0 0 1|

////公式推導:

// |i, j, k, 1| |   i,       j,     k, 1|

// |x, y, z, 1|*m =|cos*x-sin*y, sin*x+cos*y, z, 1|

//void rotateyxbyz(f64 deg, const vector3d& center)

//計算插值

vector3dgetinterpolated(const vector3d& that, f32 d) const

//填充四元陣列

void getas4value(t* array) const

public:

t m_vx;

t m_vy;

t m_vz;

};typedef vector3dvector3dint;

typedef vector3dvector3dflt;

template

vector3doperator*(const s scalar, const vector3d& vector)

3D遊戲引擎數學基礎1 3D座標係

2 3d座標系 有了上面的基礎,過渡到3d座標系簡直是輕而易舉。3d的笛卡爾座標系只是多了乙個z軸,這三條軸相互垂直,共同構成了3d空間。這樣,要在3d空間中定義一點p,就需要3個座標 x y z。另外,這3條軸構成了3個平面 x y平面 x z平面和y z平面。如下圖所示。這3個平面很重要,其中每...

作業系統開發系列 13 d 多程序

程序此時不僅是在執行而已,它可以隨時被中斷,可以在中斷處理程式完成之後被恢復。程序此時已經有了兩種狀態 執行和睡眠。我們已經具備了處理多個程序的能力,只需要讓其中乙個程序處在執行態,其餘程序處在睡眠態就可以了。在main.c中程序a的 的下面新增程序b void testb 列印的字母換成了b,i的...

牛客小白月賽13 D題

位運算是乙個非常重要的東西。而小a最近在學習位運算,小a看到了一道很簡單的例題,是說從n個數裡面選出n 1個數要讓它們或起來的值最大,小a想知道這個答案是多少。你可以幫幫他嗎?思路 預處理了一下字首l陣列和字尾r陣列,然後列舉那個不選的數就可以了,每次更新ans max ans,l i 1 r i ...