论OGRE中关于物体的旋转与朝向.

有几个知识点这时先复习一下:
表示物体的旋转的方法有多种:
()一个旋转矩阵 (直接将点向量*该矩阵结果就是旋转后的效果)
()欧拉角,即 pithc(绕X轴),yaw(Y),roll(Z),实质上,这是把绕任意转的旋转分解为绕X,Y,Z三个轴旋转的合成.
  而恰恰,绕一个坐标轴转的计算比较简单.(很多书上都有讲,也易理解)
(3四元数
()轴角法.即通过所讲的:绕A轴转a度.

由于,一个物体在最终渲染前,可能要经过多次的旋转,我们不可能,每转一次,都把物体上每个点的新的世界坐标都求出来.通常是,把这次他的转的状态存下来,把以后的旋转效果累积起来,以便到渲染时只转一次.
那么,方便表示累加旋转效果的,只有 (1)(3)了.因为矩阵运算与四元数运算都很简单,而欧拉解与轴角法,却不好表示累加的效果.
另一方面.通过我们采用(4)让一个物体转时,这种转很容易转化为四元数的表示.
比如.绕A轴转a度.对应的四元数为Q:
Q.w = cos(a):
Q.V = sin(a)×A.// Q.V 与A是3维向量.
四元数的累加也很容易.比如原来的旋转状态为Q1,刚施加的旋转为Q2,那么累加的结果就是
Q1=Q2*Q1 // :3者都是四元数.
最后,
当在最后往屏幕上渲染时,
做个这样的运算,即可得到物体上各点的世界坐标:
q = Q1*q*Q1-1(Q1的逆) q是一个3维点.

朝向相当于相对原始朝向的一个旋转,也能用四元数表示.

//-----------------------------------------------------------------------
 // 给物体做一个旋转,相当于给其一个该转对应的四元数.
 // 所以,当你给物体一个旋转时,其实物体并没有真正的转,而是把你给我的那个四元数的值我保存了下来,
 // 你再让我转时,我把你新的旋转对应的四元数与老和乘起来,得到值就是累加的旋转效果.
 // :这样,当我往屏幕上开始渲染时,我才用我保存的四元数 ]mOrietation * (一个3维点向量) * mOritation-1]得到最终的效果

 //-----------------------------------------------------------------------
 // :轴角表示法,表示旋转.
 // :这里实质上把转为会四元数旋转
    void Camera::rotate(const Vector3& axis, const Radian& angle)
    {
        Quaternion q;
        q.FromAngleAxis(angle,axis);
        rotate(q);
    }

    void Camera::rotate(const Quaternion& q)
    {
        // Note the order of the mult, i.e. q comes after
        mOrientation = q * mOrientation;
        invalidateView();
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值