在游戏开发中,向量一般用来模拟既有大小又有方向的物理模型。
1、向量的表示(以3D空间中的向量为例):
将向量u平移至其起点与坐标系原点重合(前提是平移后向量不变),则u = (ux, uy, uz)
简单的程序表示
class Vector3D
{
public:
float x, y, z;
};
2、4个特殊向量
(1)零向量0 = (0, 0, 0):各个分量都为0
(2)标准向量i = (1, 0, 0), j = (0, 1, 0), k = (0, 0, 1)
3、向量的相等:几何上,长度和方向都相等;数学上,维数和各个分量都相等;
bool Vector3D::operator == (const Vector3D& v)
{
return this->x = v.x && this->y = v.y && this->z = v.z;
}
4、向量的长度:|u| = sqrt(ux2 +
uy2 + uz2)
float Vector3D::length()
{
return sqrt(ux * ux + uy
* uy + uz * uz);
}
5、向量的规范化(normalize):使向量的长度变成1:u(nor) = (u x/length(u), u y/length(u), uz/length(u))
Vector3D Vector3D::normalize()
{
return Vector3D(this->x / this->length(), this->y / this->length(), this->z
/ this->length());
}
6、向量的相加(减):u + v = (ux + vx, uy + vy, uz + vz)
Vector3D Vector3D::operator +
(const Vector3D& v)
{
return Vector3D(this->x + v.x, this->y + v.y, this->z + v.z);
}
7、向量的数乘:ku = (kux, kuy, kuz)
Vector3D Vector3D::operator * (float k)
{
return Vector3D(k * this->x, k * this->y, k * this->z);
}
8、向量的点乘(数量积、内积):a·b=|a|·|b|·cos<a, b> or u·v = ux
* vx + uy * vy + uz
* vz
u·v的结果是一个标量,若结果大于0,则两者夹角小于90°;若为0,则两者垂直;弱小于0,则大于90°。
float Vector3DDot(const Vector3D* u, const Vector3D* v)
{
return u->x * v->x + u->y + v->y + u->z + v->z;
}
9、向量的叉乘(向量积、外积):|a×b|=|a|·|b|·sin<a, b> or u×v
= [(uy vz –
u zvy ),
(uzv x – uxv z),
(ux vy –
u yvx )]
u×v的结果是一个向量,此向量垂直于u且垂直于v
Vector3D Vector3DCross(const
Vector3D* u, const Vector3D* v)
{
.....................
}