小技巧:
float pos[3] = {0.0, 0.0, 0.0};
Ogre::Vector3 position = Ogre::Vector3(pos[0]);
可以写成
float pos[3] = {0.0, 0.0, 0.0};
Ogre::Vector3 position(pos);
表达三维向量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 )