Java 通过矩阵变换和通过四元数变换有何不同+;附加

Java 通过矩阵变换和通过四元数变换有何不同+;附加,java,opengl,lwjgl,transformation,Java,Opengl,Lwjgl,Transformation,因此,我一直在尝试在openGL渲染器中实现延迟着色管道,但由于某些原因,点光源的强度取决于相机的旋转。如果我往北看,整个世界都是红色的。如果我朝南看(朝向点光源),只有光源位置周围的半径会发出红色光。在尝试各种各样的东西时,我注意到了一些奇怪的东西。要将灯光的位置转换为视图空间,我将其转换为4维向量,将其与摄影机viewMatrix相乘,然后切断w部分,如下面的教程所述,但由于这不起作用,我尝试了一些不同的方法,尽管它们应该是完全相同的转换,但它们都有不同的结果 在这里,我编写了一个单独的程序

因此,我一直在尝试在openGL渲染器中实现延迟着色管道,但由于某些原因,点光源的强度取决于相机的旋转。如果我往北看,整个世界都是红色的。如果我朝南看(朝向点光源),只有光源位置周围的半径会发出红色光。在尝试各种各样的东西时,我注意到了一些奇怪的东西。要将灯光的位置转换为视图空间,我将其转换为4维向量,将其与摄影机viewMatrix相乘,然后切断w部分,如下面的教程所述,但由于这不起作用,我尝试了一些不同的方法,尽管它们应该是完全相同的转换,但它们都有不同的结果

在这里,我编写了一个单独的程序来测试3种不同的方法:

    Vector4f transView = new Vector4f(POSITION);
    Matrix4f viewMatrix = new Matrix4f().identity()
            .rotationX((float) Math.toRadians(56))
            .rotateY((float) Math.toRadians(123))
            .rotateZ((float) Math.toRadians(0))
            .translate(-PLAYER_POS.x, -PLAYER_POS.y, -PLAYER_POS.z);

    transView.mul(viewMatrix);

    Quaternionf rotation = new Quaternionf().identity().rotation((float) Math.toRadians(56), (float) Math.toRadians(123), (float) Math.toRadians(0));
    Vector4f transViewQuat = new Vector4f(POSITION);

    viewMatrix = new Matrix4f().identity()
            .rotate(rotation)
            .translate(-PLAYER_POS.x, -PLAYER_POS.y, -PLAYER_POS.z);

    transViewQuat.mul(viewMatrix);

    Vector4f transQuat = new Vector4f(POSITION);

    transQuat.rotate(rotation).sub(PLAYER_POS.x, PLAYER_POS.y, PLAYER_POS.z, 0);
结果是:
-165228042603-103134384155 81627197266 1(transView)
-120040283203 55546798706 164635715485 1(transViewQuat)
1023978881836-465307388306 223403549194 1(transQuat)

有人能给我解释一下为什么3个输出是3个完全不同的结果,为什么光的强度取决于相机的旋转?
在我的游戏中,我使用第一种方法创建viewMatrix。

我真的看不出为什么
Quaternionf::rotate
应该按ZYX顺序应用旋转。当然,这些文档是无用的,但是在12种可能性中找到正确的一种的可能性已经足够低了。
transQuat
方法完全是反向的。若要对四元数F应用旋转,请使用四元数F.rotateXYZ(angleX、angleY、angleZ)。Quaternionf.rotate()方法仅适用于积分随时间变化的微小旋转变化,如:(查找Quaternionf.rotate)。那么您的前两个结果将是相同的。最后一个结果将与前两个不同,因为正如@derhass所指出的,您将“向后”应用翻译。