【发布时间】:2014-06-06 15:14:16
【问题描述】:
我想使用GL_LINE_STRIP 绘制平截头体。这些平截头体顶点的坐标是什么?我有模型视图和投影矩阵。是否可以使用这些矩阵计算着色器本身的坐标?
【问题讨论】:
-
你想在什么空间画你的平截头体?这是为了某种概述/雷达吗?
-
@derhas 世界空间。
标签: opengl 3d projection
我想使用GL_LINE_STRIP 绘制平截头体。这些平截头体顶点的坐标是什么?我有模型视图和投影矩阵。是否可以使用这些矩阵计算着色器本身的坐标?
【问题讨论】:
标签: opengl 3d projection
如果您想要截锥角的世界空间坐标,您需要做的就是从 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 上预先计算逆矩阵通常要快得多。
【讨论】:
vec4 (clip_space.xyz / clip_space.w, 1.0 / clip_space.w))都是 -1 和 1 的某种组合.对于 3 个维度,您需要使用 2^3 = 8 个 -1 和 1 组合来查找 NDC 中的所有角。一旦你有了它,将它乘以你的逆投影矩阵以到达剪辑空间和你的逆视图矩阵以到达世界空间(可以将其组合成一个步骤,如 derhass 所示)。顺便说一句,除以w 是产生截锥体形状的原因 - 如果你把它排除在外,你就会得到一个立方体。