另一个透视相机问题

时间:2014-03-20 17:25:31

标签: c++ 3d camera glm-math

- 已解决 -

警告:我不是以英语为母语的人

您好,

我目前正在尝试制作3D相机,当然是因为我不会有一些错误或数学基础知识,无论如何,如果我不问,我肯定会变得疯狂为了某人的帮助。

好的,我们走了。

首先,我是一个自定义游戏引擎,只允许通过设置来处理相机:

  • 投影参数(根据正交或透视模式)
  • 视图:使用向量3作为位置,使用四元数作为方向 (不,我们现在不讨论这个设计)

现在我在我的游戏代码中编写了一个相机(使用了之前引擎的功能)

我的相机环境有以下规格:

  • up_vector =(0,1,0)
  • forward_vector =(0,0,1)
  • 角度以度为单位
  • glm as math lib

在我的相机代码中,我处理播放器输入,将它们转换为我发送到引擎的数据。 在引擎中我只做:

glm::mat4 projection_view = glm::perspective(...parameters...) * glm::inverse(view_matrix)

瞧我有渲染步骤的矩阵。

现在是一个简单几何的小场景。

在3D空间中,我们有7个圆圈,从z = -300到300。 z = -300处的圆为红色,300处的圆为蓝色, 有装饰形状(三角形/盒子),它们有助于识别向上和向右

当我运行场景时,我得到了以下迪斯科结果!我不想要的东西。

Perspective camera

正如你在我上面的彩色potatoid的例子中所看到的那样,蓝色圆圈更大但设置为z上的最重要。根据观点,它应该更小。发生了什么事?

另一方面,当我使用正交相机时,一切都运作良好。

Orthographic camera

有什么想法吗?


关于Perspective矩阵

我使用函数glm :: perspective()生成我的透视矩阵,经过快速检查后,我确认了我的参数'价值总是好的,所以我很容易想象我的问题不是来自那里。

关于视图矩阵

首先,我认为我的问题必须在这里,也许......所以,我有一个vector3用于摄像机的位置,3个浮点用于描述每个轴上的旋转。 这是实验部分,我不知道自己在做什么!

我将前三个浮点数复制到我用作Euleur角度的向量3中,并使用一个glm四元数构造函数,可以从Euler角度创建一个quat,如下所示:

glm::quat q(glm::radians(euler_angles));

最后我将这样的四元数发送到引擎中,而没有使用我的向上和向前矢量(无论如何我现在还没有看到如何使用它们)

我的工作时间太长了,我认为我的脑袋会爆炸,最可悲的是我觉得我真的很接近。


PS0:那些帮助我的人有我永恒的感激

PS1:请不要给我一些理论联系:我不再有任何神经元,已经阅读了两本有趣且无助的书籍。也许是因为我还没有理解一切。 (用于图形和游戏开发的3D数学入门/用于3D游戏编程和计算机图形的数学,第三版)


这是一个愚蠢的错误......在我的渲染管道的最后,我忘了对它们上的图形对象进行排序" z"根据相机方向。

2 个答案:

答案 0 :(得分:0)

你说:

  

在我的相机代码中,我处理播放器输入,将它们转换为数据   我发送到我的引擎。在引擎中我只做:

     

glm :: mat4 projection_view = glm :: perspective(... parameters ...)*   GLM ::逆(view_matrix)

     

瞧我有渲染步骤的矩阵。

渲染彩色圆圈时是否使用投影矩阵?

如果您使用身份矩阵绘制圆圈,那么会根据视图/透视矩阵查看模型吗?

三角形和正方形看起来正确 - 渲染圆圈时,你有不同的变换吗?

答案 1 :(得分:0)

TonyWilk,谢谢

  

渲染彩色圆圈时是否使用投影矩阵?

是的,我从glm :: perspective()函数生成投影矩阵,并在渲染后在我的顶点上使用我的projection_view矩阵,如第一个代码块所示。

  

如果您使用单位矩阵绘制圆圈,那么会根据视图/透视矩阵查看模型吗?

我不知道我是否正确理解了这个问题,但这是一个答案。 从理论上讲,我不直接将透视矩阵应用于顶点。我在伪代码中使用:

rendering_matrix = projection_matrix * inverse_camera_view_matrix
  

三角形和正方形看起来正确 - 渲染圆圈时,你有不同的变换吗?

最后,我总是使用相同的矩阵。如果三角形和正方形看起来很好,那只是由于“光学效应”。最大的盒子实际上与蓝色圆圈相关联,而较小的盒子与红色圆圈相关联