math - 距近平面给定距离处的截锥体的宽度

标签 math 3d frustum

我正在使用 CML在我为工作所做的基于 OpenGL 的界面项目中管理 3D 数学。我需要知道视锥体在距视点给定距离处的宽度,它作为表示相机的 4x4 矩阵的一部分保存。我的目标是沿着视口(viewport)的明显边缘放置 gui 对象,但从近裁剪平面到屏幕一定距离。

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

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

谢谢!

最佳答案

这似乎是 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 的方向向量, 尾部在原点。这些形成了 角度;称之为西塔。求θ 使用角度公式 在两个向量之间,例如here .
  5. 画出那个角的平分线。画 垂直于平分线 你想要的距离d 原点(这创建了一个等腰 三角形,一分为二 全等直角三角形)。这 垂线的长度是你的 所需的截头体宽度 w。请注意 w 是 其中一个碱基长度的两倍 的直角三角形。
  6. 设 r 为 直角三角形的斜边。 然后 rcos(theta/2)=d 和 rsin(theta/2)=w/2, 所以 tan(theta/2)=(w/2)/d 这意味着 w=2d*tan(θ/2)。既然你知道 和 theta,你完成了。

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

关于math - 距近平面给定距离处的截锥体的宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2612101/

相关文章:

algorithm - 寻找平截头体的最小包围球

iphone - OpenGL-ES 改变视锥体的视角

math - 查找两个形状之间的仿射变换矩阵(SVG 路径)

math - 从矩形点查找方向

algorithm - 计算光子追踪中的像素值

algorithm - 计算 3D 缩减凸包

arrays - 随机数生成器过于频繁地重复某些数字

c - 作业——二维空间中3点的叉积

java - 计算 2D 和 3D 中 2 点之间的距离

3d - 计算 3D 空间中的视锥体