【问题标题】:Another Perspective Camera issue另一个透视相机问题
【发布时间】: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”上的图形对象进行排序。

【问题讨论】:

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


    【解决方案1】:

    你说:

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

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

    瞧,我有渲染步骤的矩阵。

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

    您是否应该使用 identity 矩阵来绘制圆,然后根据视图/透视矩阵查看模型?

    三角形和正方形看起来正确 - 渲染圆形时是否有不同的变换效果?

    【讨论】:

      【解决方案2】:

      您好 TonyWilk,谢谢

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

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

      您是否应该使用单位矩阵来绘制圆,然后根据视图/透视矩阵查看模型?

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

      rendering_matrix = projection_matrix * inverse_camera_view_matrix
      

      三角形和正方形看起来正确 - 渲染圆形时是否有不同的变换效果?

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

      【讨论】:

      • 试试rendering_matrix = identity_matrix;
      猜你喜欢
      • 2011-02-20
      • 2014-04-01
      • 1970-01-01
      • 2021-03-07
      • 1970-01-01
      • 1970-01-01
      • 2014-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多