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 ...