两个四元数,其角度分别是:PI*2-PI/20 和 PI/20,
其中心插值我希望得到角度为0的四元数,事实上得到却是PI。
郁闷呀,这是不是四元数本身设计的缺陷?//1 定义旋转轴,随便给个数
CArray4 axis;
axis.Set(1,1,1);
axis.Normalize();//2 准备两个四元数a和b
CQuaternion a,b,c;
a.FromAxisAndAngle(axis,PI*2-PI/20);
b.FromAxisAndAngle(axis,PI/20);//3 做插值
QuaternionSlerp(c,a,b,0.5);//4 查看结果
double angle;
c.ToAxisAndAngle(axis,angle);这里的angle=PI
另外,把
QuaternionSlerp(c,a,b,0.5);
改为
QuaternionSlerp(c,b,a,0.5);
结果不变!

解决方案 »

  1.   

    四元数是最基本的超复数,上百年了,你觉得代数学会使用有“缺陷”的超复数么?我宁可相信是库有问题也不会怀疑四元数的。
    你写的哪些函数我都没见过,我是使用D3DX库,四元数操作没有问题,所以只能猜测一下,四元数定义的旋转是以右手定则为正方向的,如果QuaternionSlerp是从小角度向大角度按正方向旋转插值,那结果没有问题。而且不管你的库函数是如何插值的,你完全可以通过调整旋转轴向量的方向自由控制旋转,例如把旋转轴反向。
      

  2.   

    那个库是我写的。但是坦白地说代码就是抄的OpenGL的。应该不会有问题。想来应该是用问题的比如两个角度分别是
    PI/2弧度 和 PI*3/2弧度
    然后插值,权值取0.5,他如果给接果的话只能给一个。但是他明显有两个选择:
    PI,0(或者PI*2和0算一个)
    你把这两个角度画出来,估计人脑也找不到角平分线。不要拿一百年吓唬我,我们都是理工科的,不是文科的。
    文科的答案本身就是含糊的,如果价格100年,那谁说了就算了。
    理工科的东西哪怕是1000年的东西,正确和错误也是泾渭分明的。
      

  3.   

    这个的的确确是四元数的缺陷,下面两个数
    PI/2+0.00001, PI*3/2-0.00001
    结果是PI
    而下面两个数
    PI/2-0.00001, PI*3/2+0.00001
    结果是0(或者PI*2)如果结果是中间结果的话,再去参加别的运算就乱了。如果考虑浮点数舍入误差的话。
    很倒霉的。
      

  4.   

    你怎么总是孤立的说四元数的角度而根本不提四元数的旋转轴向量?你也是学理科的,那不知道四元数根本就不是因为3d图形学产生的?3d绘图为了解决欧拉旋转的问题和便于进行仿射变换引入了四元数,但四元数远远早于3d图形学,所以不能拿来就用,要有条件限制,所以规定四元数的前三个分量是旋转轴向量,而第四个分量为标量表示角度,同时规定以右手定则为绕旋转轴向量旋转的正方向,这样的旋转只有一种情况,没有歧义。