关于Vector3d真没什么好说的,总的说它既可以表示3D空间中的一个位置,也可以表示一个方向。
class Vector3d
{
public:
union {
float e[3];
struct {
float x;
float y;
float z;
};
};
};
表示位置的时候,x, y, z就表示空间中的任意一点。
表示方向的时候是指将物体绕y, x, z轴依次旋转所指向的方向。
其实表示方向时这三个轴有更专业的名称:yaw, roll, pitch。(我是这么记的:roll 等于翻滚,yaw 等于平转,pitch等于点头,呵呵)。
为什么是按y, x, z的顺序?这只是通常的习惯,实际上可以按任意轴顺序的。
这种方向表示法叫欧拉角。
理论上欧拉角可以使物体指向任何想要方向,但是如果在使用中不慎陷入万向锁(gimbal lock)问题的话(这算欧拉的Bug啦),就不能转到想要的方向了。优酷上有个视频很好的解释了什么是万向锁,以及为什么会产生,值得一看。
解决方法的办法之一就是使用四元数Quaternion来表示选择,它可以更好的表示空间方向。
Vector3d还有些其它的方法,比如重载operator;点乘;差乘;求长度;归一化
点乘:
float Vector3d::dot(const Vector3d& rhs) const
{
return x*rhs.x + y*rhs.y + z*rhs.z;
}
几何意义:a (点乘) b = |a||b|*cos<a,b>,其中<a,b>是向量a, b直接所夹的锐角。
差乘:
Vector3d Vector3d::cross(const Vector3d& rhs) const
{
Vector3d(y * rhs.z - z * rhs.y, z * rhs.x - x * rhs.z, x * rhs.y - y * rhs.x);
}
几何意义:向量的叉乘(如X叉乘Y)就是一个垂直于X和Y组成的平面的一个向量,向量方向是这样决定的:右手四指与X的方向相同,大拇指与四指垂直,然后四指按照这样的方向绕,从X开始,经过X与Y的夹角的方向环绕,拇指所指的方向就是X叉乘Y的方向
最后说明一下我一直用的坐标系是右手坐标系。