【问题标题】:How to draw frustum in opengl如何在opengl中绘制截锥体
【发布时间】:2014-06-06 15:14:16
【问题描述】:

我想使用GL_LINE_STRIP 绘制平截头体。这些平截头体顶点的坐标是什么?我有模型视图和投影矩阵。是否可以使用这些矩阵计算着色器本身的坐标?

【问题讨论】:

  • 你想在什么空间画你的平截头体?这是为了某种概述/雷达吗?
  • @derhas 世界空间。

标签: opengl 3d projection


【解决方案1】:

如果您想要截锥角的世界空间坐标,您需要做的就是从 NDC 空间投影 8 个角点(每个维度从 -1 到 1,因此角点很容易枚举) 回到世界空间。不过别忘了除以w

c_world = inverse(projection * view) * vec4(c_ncd, 1);
c_world = c_world*1.0/c_world.w;

虽然我是用 GLSL 语法编写的,但这只是伪代码。您可以在着色器中执行此操作,但这意味着必须多次计算(取决于您将其放入哪个着色器阶段)。至少在 CPU 上预先计算逆矩阵通常要快得多。

【讨论】:

  • 你能解释一下你的答案吗?
  • @debonair:您在 NDC 空间中的观看量的角落(即vec4 (clip_space.xyz / clip_space.w, 1.0 / clip_space.w))都是 -11 的某种组合.对于 3 个维度,您需要使用 2^3 = 8 个 -11 组合来查找 NDC 中的所有角。一旦你有了它,将它乘以你的逆投影矩阵以到达剪辑空间和你的逆视图矩阵以到达世界空间(可以将其组合成一个步骤,如 derhass 所示)。顺便说一句,除以w 是产生截锥体形状的原因 - 如果你把它排除在外,你就会得到一个立方体。
  • @debonair:我在那条评论中打错了字,但想法是一样的……逆投影矩阵将带您进入视图空间(来自剪辑空间)。你实际上要跳过那个坐标空间,所以这并不重要,但我不妨更正一下:P
猜你喜欢
  • 2014-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-10
  • 1970-01-01
  • 2014-09-26
  • 2016-04-09
  • 2012-11-23
相关资源
最近更新 更多