3

我正在使用CML来管理我正在为工作而制作的基于 OpenGL 的界面项目中的 3D 数学。我需要知道距视点给定距离处的视锥体的宽度,该视锥体保留为代表相机的 4x4 矩阵的一部分。我的目标是沿着视口的明显边缘定位 gui 对象,但距离近剪裁平面有一定距离进入屏幕。

CML 具有提取截锥体平面的功能,将它们以 Ax + By + Cz + D = 0 形式返回。这个平截头体垂直于相机,它不一定与透视投影的 z 轴对齐。

我想提取 x 和 z 坐标,以便将图形元素固定在距相机不同距离的屏幕两侧。最好的方法是什么?

谢谢!

4

1 回答 1

2

如果您已经有一个已知宽度的横截面距顶点已知距离,这似乎是Find side length of a crosssection of a pyramid frustum/truncated pyramid的副本。如果您没有这些并且想自己得出答案,则可以按照以下步骤操作。

  1. 取两个相邻平面并找到它们的交线 L1。您可以使用此处的步骤。你真正需要的是线的方向向量。
  2. 再取两个平面,一个与上一步相同,找到它们的交线 L2。
  3. 请注意,所有形式为 Ax + By + Cz + D = 0 的平面都经过原点,因此您知道 L1 和 L2 相交。
  4. 给自己画一张 L1 和 L2 的方向向量图,尾部在原点。这些形成一个角度;称之为θ。使用两个向量之间的角度公式找到 theta,例如这里
  5. 画出该角的平分线。在距离原点的距离为 d 处绘制一条垂直于平分线(这将创建一个等腰三角形,平分为两个全等直角三角形)。垂线的长度是您想要的平截头体宽度 w。请注意,w 是直角三角形底边长度的两倍。
  6. 令 r 为直角三角形的斜边的长度。那么 r cos(theta/2)=d 和 r sin(theta/2)=w/2,所以 tan(theta/2)=(w/2)/d 这意味着 w=2d*tan(theta/2) . 既然你知道 d 和 theta,你就完成了。

请注意,我们已经找到了截头体横截面一侧的长度。这将适用于任何平截头体的任何垂直横截面。这可以扩展以使其适应非垂直横截面。

于 2010-04-10T04:05:15.720 回答