在距离近平面给定距离处的平截头体的宽度

时间:2010-04-10 03:16:13

标签: math 3d frustum

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

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

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

谢谢!

1 个答案:

答案 0 :(得分:2)

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

  1. 带两个相邻的飞机找到 他们的交叉线L1。您 可以使用步骤here。真 你需要的是方向 矢量线。
  2. 再拿两架飞机,一架相同 如上一步,并找到 他们的交叉线L2。
  3. 请注意,Ax + By + Cz + D = 0形式的所有平面都通过原点,因此您知道L1和L2 相交。
  4. 给自己画一张照片 L1和L2的方向向量, 原点上的尾巴。这些形成了 角度;称之为theta。找到theta 使用角度公式 在两个向量之间,例如here
  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,你已经完成了。
  7. 请注意,我们已经找到了截头体横截面一侧的长度。这适用于任何平截头体的任何垂直横截面。这可以扩展到使其适应非垂直横截面。