如何在opengl中绘制视锥体

deb*_*air 5 opengl 3d projection

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

der*_*ass 5

如果你想要平截头体角的世界空间坐标,你需要做的就是将 8 个角点从 NDC 空间(每个维度从 -1 到 1,因此角点很容易枚举)投影回世界空间。但不要忘记你必须除以w

c_world = inverse(projection * view) * vec4(c_ncd, 1);
c_world = c_world*1.0/c_world.w;
Run Code Online (Sandbox Code Playgroud)

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

  • @debonair:NDC空间中观看体积的角落(即“vec4(clip_space.xyz / Clip_space.w,1.0 / Clip_space.w)”)都是 **-1** 和 **1* 的某种组合*。对于 3 维,您需要使用 2^3 = 8 **-1** 和 **1** 的组合来查找 NDC 中的所有角点。一旦你有了它,将它乘以你的逆投影矩阵以到达剪辑空间,并乘以你的逆视图矩阵以到达世界空间(可以将其合并为一个步骤,如 derhass 所示)。顺便说一下,除以“w”就产生了截锥体形状——如果你把它排除在外,你就会得到一个立方体。 (4认同)