【发布时间】:2014-03-20 17:25:31
【问题描述】:
- 已解决-
警告:我的母语不是英语
嗨,
我目前正在尝试制作 3D 相机,肯定是因为一些我没有的错误或数学基础,反正我想如果我不请人帮助我肯定会发疯。
好吧,我们走吧。
首先,我有一个自定义游戏引擎,它只允许通过设置来处理相机:
- 投影参数(根据正交或透视模式)
- 视图:向量 3 表示位置,四元数表示方向 (不,我们现在不会讨论这个设计)
现在我正在我的游戏代码中编写一个相机(它使用之前引擎的功能)
我的相机环境具有以下规格:
- up_vector = (0, 1, 0)
- forward_vector = (0, 0, 1)
- 角度以度为单位
- glm 作为数学库
在我的相机代码中,我处理玩家输入,将它们转换为我发送到我的引擎的数据。 在引擎中我只做:
glm::mat4 projection_view = glm::perspective(...parameters...) * glm::inverse(view_matrix)
瞧,我有渲染步骤的矩阵。
现在是一个简单几何的小场景。
在 3D 空间中,我们有 7 个圆,从 z = -300 到 300 绘制。 z = -300 处的圆圈是红色的,300 处的圆圈是蓝色的, 有装饰形状(三角形/方框),方便上下左右识别
当我运行场景时,我得到了以下迪斯科结果!我不想要的东西。
正如您在上面的彩色土豆示例中看到的那样,蓝色圆圈较大,但设置为 z 上的最远。从角度看应该是小了点。发生了什么?
另一方面,当我使用正交相机时,一切正常。
有什么想法吗?
关于透视矩阵
我使用函数 glm::perspective() 生成我的透视矩阵,经过快速检查,我确认我的参数值总是好的,所以我可以很容易地想象我的问题不是来自那里。
关于视图矩阵
首先,我认为我的问题一定是在这里,也许......所以,我有一个用于相机位置的 vector3 和 3 个用于描述其在每个轴上的旋转的浮点数。 这里是实验部分,我不知道自己在做什么!
我将前三个浮点数复制到我用作欧拉角的向量 3 中,并使用可以从欧拉角创建四元组的 glm 四元数构造函数,如下所示:
glm::quat q(glm::radians(euler_angles));
最后我将这样的四元数发送到引擎中,而没有使用我的向上和向前向量(反正我现在不知道如何使用它们)
我工作太久了,我觉得我的头会爆炸,最可悲的是我觉得我真的很接近了。
PS0:那些帮助我的人,我永远感激不尽
PS1:请不要给我一些理论链接:我已经没有任何神经元了,已经看了两本有趣又无奈的书。也许是因为我还没有完全理解一切。 (用于图形和游戏开发的 3D 数学入门 / 用于 3D 游戏编程和计算机图形学的数学,第三版)
解决方案
这是一个愚蠢的错误......在我的渲染管道的最后,我忘记根据相机方向对它们“z”上的图形对象进行排序。
【问题讨论】: