java - 通过矩阵转换和通过四元数+加法转换有什么区别?
问题描述
所以我一直在尝试在我的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);
结果是:
-16,5228042603 -10,3134384155 8,1627197266 1(TransView
)
-12,0040283203 5,5546798706 16,4635715485 1(TransViewQuat)
有人可以向我解释为什么 3 个输出是 3 个完全不同的结果以及为什么光的强度取决于相机的旋转吗?在我的游戏中,我使用第一种方法来创建我的 viewMatrix。
解决方案
推荐阅读
- python - 使用cmd在python中安装jsonlib时出错
- java - Elasticsearch GetResponse.getField 抛出 NullPointerException
- python - 在数据框中显示重复值 - >键错误
- mysql - 为什么这个 COUNT in HAVING 没有按预期工作?
- c - 打印字符串时的coredump
- python - 如何通过 python pyodbc 运行嵌套存储过程?
- ios - 如何删除tableView中的用户默认数据?
- javascript - JavaScript 中的 ArrowFunction 无法按预期工作,为什么?但正常功能工作正常
- python - 如何找到我在 Pycharm 变量资源管理器中创建的变量?
- c# - Dapper SimpleCRUD 强制转换:“无法将 'System.Guid' 类型的对象转换为 'System.IConvertible' 类型。”