四元数

来源:互联网 发布:网络共享用户账户限制 编辑:程序博客网 时间:2024/05/16 04:39

http://www.cnblogs.com/minggoddess/archive/2010/12/15/1907374.html

世界空间,朝世界原点的朝向移动d ,换到mPosition的所在父空间只需要旋转一定角度,

这个角度应该是世界原点方向和父节点的方向的夹角,正好是父节点世界绝对角度再取反.

(为什么要取反,2个四元数相乘是不能交换的,因为世界节点和父节点夹角 != 父节点和世界节点夹角,正好相反)

       mPosition += (mParent->_getDerivedOrientation().Inverse() * d)
                    / mParent->_getDerivedScale();


根据这段话 我想 由A 到B的用了 四元数 Orientation 由B到A的话就应该是 Orientation.Inverse()

我知道 quaternion*quaternion是不满足交换律的

vector3*quaternion我明白

我不知道。。。也许是      quaternion*vector3的意思是

A. Multiplying a quaternion by a vector gives us a vector describing the rotational offset from that vector (a rotated vector). For example when one loads the robot.mesh file, by default it points facing UNIT_X. When it has been rotated, we can get its orientation in quaternion form via mNode->getOrientation(). If we then multiply it by Vector3::UNIT_X, we will get a vector pointing in the direction the robot is currently facing.

 

在看这句话这句话意思很明显 Orientation 是一个旋转量 Orientation *v3得到的是 v3按Orientation 旋转后的向量

 

有一点 。。。这里讨论的四元数 是ogre的一个类 他有一个operator *参数是vector3表示的意义是 v3按此quaternion旋转后的结果 that's it

 

而 vector3*quaternion根本就没定义。。。差不多明白了

 Vector3 Quaternion::operator* (const Vector3& v) const

    {

// nVidia SDK implementation

Vector3 uv, uuv;

Vector3 qvec(x, y, z);

uv = qvec.crossProduct(v);

uuv = qvec.crossProduct(uv);

uv *= (2.0f * w);uuv *= 2.0f;
return v + uv + uuv;
    }

实在不想推到 不过只用到了 外积 和向量 应该还是可解的

没有任何矛盾的地方目前

quaternion *quaternion 表示将这些旋转叠加

vector3*quaternion 无定义

quaternion*vector3表示 vector按q旋转

 


原创粉丝点击