如何在OpenGL中绘制视锥体

5

我想使用GL_LINE_STRIP绘制一个棱台。这些棱台的顶点坐标是什么?我有模型视图和投影矩阵。是否可以在着色器本身使用这些矩阵来计算坐标?


你想在哪个空间中绘制你的视锥体?这是用于某种概览/雷达吗? - derhass
@derhass 世界空间。 - debonair
1个回答

5

如果你想要获取视锥体角落的世界空间坐标,你只需要将8个角点从NDC空间投影回世界空间即可(NDC空间中每个维度都从-1到1,因此角点很容易枚举)。但是不要忘记必须通过w进行除法:

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

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


1
请问您能否解释一下您的答案。 - debonair
4
你的观察体积在标准化设备坐标空间中的角落(即 vec4 (clip_space.xyz / clip_space.w, 1.0 / clip_space.w))都是由 -11 的某种组合构成的。对于三个维度,你需要使用 2^3 = 8 种由 -11 组成的组合来找到 NDC 中的所有角落。一旦找到这些角落,就将其乘以逆投影矩阵以转换到裁剪空间,再乘以逆视图矩阵以转换到世界空间(这可以合并为单个步骤,如 derhass 所演示的)。顺便说一下,通过 w 的除法产生了截锥体形状,如果不除以 w,则得到的是一个立方体。 - Andon M. Coleman
@debonair:我在那个评论中打错了一个字,但是想法是一样的...逆投影矩阵将带您进入视图空间(从剪辑空间)。实际上,您将跳过该坐标空间,因此并不重要,但我可能会更正一下 :P - Andon M. Coleman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接