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