Vector3d

关于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的方向

 

最后说明一下我一直用的坐标系是右手坐标系。

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值