在游戏开发中,向量一般用来模拟既有大小又有方向的物理模型。
1、向量的表示(以3D空间中的向量为例):
将向量u平移至其起点与坐标系原点重合(前提是平移后向量不变),则u =
(u
x
,
u
y
,
u
z
)
简单的程序表示
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(
u
x
2
+ u
y
2
+ u
z
2
)
float
Vector3D::length()
{
return sqrt(
u
x *
u
x
+ u
y *
u
y
+ u
z *
u
z
);
}
5、向量的规范化(normalize):使向量的长度变成1:u(nor) =
(u
x
/length(u),
u
y
/length(u),
u
z
/length(u))
Vector3D Vector3D::normalize()
{
return Vector3D(this->x / this->length(),
this->y / this->length(),
this->z / this->length());
}
6、向量的相加(减):u + v = (
u
x
+
v
x
, u
y
+
v
y
, u
z
+
v
z
)
Vector3D Vector3D::
operator
+ (const Vector3D& v)
{
return Vector3D(this->x + v.x, this->y + v.y, this->z + v.z);
}
7、向量的数乘:ku =
(ku
x
,
ku
y
,
ku
z
)
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 =
u
x *
v
x
+ u
y *
v
y
+ u
z *
v
z
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 =
[(u
y
v
z
– u
z
v
y
), (u
z
v
x
– u
x
v
z
), (u
x
v
y
– u
y
v
x
)]
u
×
v的结果是一个向量,此向量垂直于u且垂直于v
Vector3D Vector3DCross
(const Vector3D* u, const Vector3D* v)
{
.....................
}