旋转矩阵的问题

Issues with rotation matrix

我目前正在研究物理引擎和渲染引擎之间的中间体。我的物理引擎接收一系列力和位置以及 returns 一个四元数。

我目前正在使用我上一个问题的答案(工作正常)将该四元数转换为旋转矩阵。我的坐标系是 z - 进入屏幕,y - 向上,x - 向右。

现在,在所有的阐述之后,我一直在通过一次旋转一个轴来进行测试。我可以毫无问题地绕 y 轴和 z 轴旋转。但是,当我尝试绕 z 轴旋转时,系统会产生奇怪的结果。旋转很好,但是当它旋转时,对象在 "flipping" 之前在 z 方向变平(即:负缩放)并返回到全尺寸。它每 90 度执行一次,与基本方向偏移 45 度。

这是我将四元数转换为旋转矩阵的代码:

    Matrix4f output = new Matrix4f();
    output.setIdentity();

    if(input.length()!=0){
    input.normalise();
    }

    float xx = input.x * input.x;
    float xy = input.x * input.y;
    float xz = input.x * input.z;
    float xw = input.x * input.w;

    float yy = input.y * input.y ;
    float yz = input.y * input.z;
    float yw = input.y * input.w;

    float zz = input.z * input.z;
    float zw = input.z * input.w;


    output.m00 = 1 -2*((yy+zz));
    output.m01 = 2*(xy+zw);
    output.m02 = 2*(xz-yw);

    output.m10 = 2*(xy-zw);
    output.m11 = 1 - (2*(xx+zz));
    output.m12 = 2*(yz+xw);

    output.m20 = 2*(xz+yw);
    output.m21 = 2*(yz+xw);
    output.m22 = 1-(2*(xx+yy));

现在我在对象旋转时实时查看它,我没有看到任何不应该存在的东西。此外,这从这个等式直接传递到 opengl,所以我真的不明白为什么我会遇到这个问题。有什么想法吗?

output.m21 = 2*(yz+xw); 应该是 output.m21 = 2*(yz-xw);