Ogre中的向量Vector3的成員方法

2021-06-16 03:58:08 字數 3995 閱讀 3788

表達三維向量v(

x,y,

z)的類,三維世界中的位置、方向和縮放因子都可以用

vector3

來表達,關鍵看你如何解釋與使用它。

為了提高效率,

vector3

類的成員函式大部分都實現為內聯函式。又為了將來操作方便,

vector3

類的資料成員都實現為

public

型別。static const vector3 zero;

static const vector3 unit_x;

static const vector3 unit_y;

static const vector3 unit_z;

static const vector3 unit_scale;

分別代表零向量、

x軸單位向量、

y軸單位向量、

z軸單位向量和單位縮放因子(其實是不縮放),這些向量使用頻繁,所以實現為常量。

過載[ ]

操作符,通過下標1,

2,3可以取x,

y,z分量。

inline real operator [ ] ( unsigned i ) const

過載[ ]

操作符,返回引用,可以做左值。

inline real& operator ( unsigned i )

過載賦值操作符,返回引用,結果可以做左值。

inline vector3& operator = ( const vector3& rkvector )

過載等號操作符,判斷兩個向量是否相等。

inline bool operator == ( const vector3& rkvector ) const

過載不等號操作符,判斷兩個向量是否不相等。

inline bool operator != ( const vector3& rkvector ) const

過載加號操作符,完成向量相加。

inline vector3 operator + ( const vector3& rkvector ) const

過載乘法操作符,完成向量與乙個數的乘法。

inline vector3 operator * ( real fscalar ) const

過載乘法操作符

,完成兩個向量的相乘。

inline vector3 operator * ( const vector3& rhs) const

過載除法操作符,完成向量除以乙個數的運算。

inline vector3 operator / ( real fscalar ) const

過載負號操作符,將原向量的每個分量取負。

inline vector3 operator - () const

過載乘法操作符,用友員函式的方式實現,實現乙個向量與乙個數相乘。

inline friend vector3 operator * ( real fscalar, const vector3& rkvector )

過載+=

運算子,

a+=b

。inline vector3& operator += ( const vector3& rkvector ) 過載

-=運算子,

a-=b

。inline vector3& operator -= ( const vector3& rkvector ) 過載

*=運算子,

a*=b

。inline vector3& operator *= ( real fscalar ) 過載

/=運算子,

a/=b

。inline vector3& operator /= ( real fscalar )

求向量長度

,因為求結果用到開方

,會消耗

cpu時間

,所以如果有可能就使用後面的求向量長度平方的函式。

inline real length () const

求向量長度的平方,很多時候用它可以代替求向量長度的函式,因為沒有開平方,所以可以提高效率。

inline real squaredlength () const

計算向量點積,向量點積有如下應用:

cos(theta) = dotproduct(v1,v2) / (length(v1) * length(v2))

所以,當知道兩個向量的點積和長度之後就可以獲得向量之間的夾角的余弦。如果兩個向量都是單位向量的化,則點積的結果就是夾角的余弦。

inline real dotproduct(const vector3& vec) const

向量歸一化,轉變為方向不變的單位向量。歸一化的方法是每個分量都除以向量的長度。

inline void normalise(void)

求向量叉積。

向量叉積的結果代表這兩個向量所在平面的法向量。

向量叉積遵循右手法則,從第一向量握向第二向量,大拇指指向的向量就是叉積結果。例如:螢幕左邊線為第一向量,螢幕下邊線為第二向量,那麼它們的叉積結果就指向螢幕裡面。向量的叉積計算可以用來判斷兩個向量的拓撲關係(左右之分)。

inline vector3 crossproduct( const vector3& rkvector ) const

向量可以表達點的座標,本函式的功能是計算兩個點之間的中點座標。

inline vector3 midpoint( const vector3& vec ) const

過載小於操作符,如果

a向量的各分量都小於b向量

,則a向量小於

b向量。

inline bool operator < ( const vector3& rhs ) const

過載大於操作符,如果

a向量的各分量都大於

b向量,則

a向量大於

b向量。

inline bool operator > ( const vector3& rhs ) const 將

a、b兩向量中的各分量的小值組合成新的向量。

inline void makefloor( const vector3& cmp ) 將

a、b兩向量中的各分量的大值組合成新的向量。

inline void makeceil( const vector3& cmp )

計算並返回乙個向量的垂直向量,乙個向量的垂直向量有無窮多個,這裡只返回乙個。用原向量與

x正軸向量做叉乘得到的結果向量是原向量與

x正軸向量構成的平面的法向量,肯定垂直於原向量,函式返回這個結果向量。如果發現得到的結果向量的長度為

0,又因為

length(vectorc) = length(vector1) * length(vector2) * sin(theta)

,證明原向量與

x正軸重合(

sin(theta)為0

),那麼就改為求原向量與

y正軸叉乘作為結果向量。

inline vector3 perpendicular(void)

得到偏離原向量一定角度的隨機向量。

本函式要求隨機數種子已設定好。當然

math

類的建構函式設定了隨機數種子。如果在呼叫本函式之前,初始化了

math

類,就可以正常使用本函式。

第乙個引數是允許偏移的最大角度。

第二個引數是向量,有預設值。要求是原向量的乙個垂直向量。

inline vector3 randomdeviant(

real angle,

const vector3& up = vector3::zero )

得到能將當前向量用最小路徑旋轉到目的向量的四元組。

quaternion getrotationto(const vector3& dest) const

過載輸出流操作符。

inline _ogreexport friend std::ostream& operator <<

( std::ostream& o, const vector3& v )

C 實現乙個Vector3空間向量類

vector2,3,4類在directx中都有現成的可以呼叫,不過要實現其中的功能其實也不難,也都是一些簡單的數學知識罷了。1 算術運算 2 向量的數量積,又叫 點乘 3 向量的向量積,又叫 叉乘 4 向量單位化 normalization pragma once extern const doub...

Vector3函式理解 計算兩向量之間的角度

1.已知兩個向量dira,dirb。vector3 dira new vector3 1,1,0 vector3 dirb new vector3 1,1,1 2.使向量處於同乙個平面,這裡平面為xz dira dira vector3.project dira,vecotr3.up dirb di...

u3d中的向量 vector3 vector2

vector3 x,y,z x代表左右,y代表上下,z代表前後 計算兩點之間的距離 如果只給了一點的話。算出的長度其實就是和vector3.zero點之間的長度 公式 a2 b2 c2 勾股定理 計算機實現 float distance2d point2d p1,point2d p2 float d...