3D:无论相机的变焦如何,都要在相同高度的屏幕上绘制地平线

时间:2015-01-29 16:55:33

标签: math 3d camera projection-matrix

我有这个奇怪的用例。

这些变量是已知的:

  • 相机缩放(或fov)

  • Y轴和Z轴= 0

  • 周围的相机旋转(方向)

现在,我希望 特定在屏幕上绘制 视野 (地平线位置= (0,0,Infinite) 2D高度“YY”。必须是相机X轴旋转,以便在“YY”处绘制地平线?

你可能会问为什么我需要这个:好吧,当我改变相机变焦时,地平线会改变屏幕上的位置(在所有情况下除了X轴旋转= 0)。我需要能够改变相机变焦并保持地平线不变(相对于其2D位置)。 AFAIK,这只能通过相应地改变X轴旋转来实现。

1 个答案:

答案 0 :(得分:1)

对于明确定义的对称视锥体,可以使用一些简单的几何体找到解决方案:

Problem Visualization

我假设YY处于规范化设备坐标(范围从-1到1)。如果它们是像素坐标,则必须转换它们。

我选择投影平面距离相机1个单位。但任何其他距离都可以。然后,距离y'只是

y' = YY * H/2

H/2是半屏高度,可以使用以下公式计算:

H/2 = tan (fovy/2)

其中fovy是相机在垂直方向上的视野。

您希望为旋转找到角度alpha。这很简单:

tan alpha = y' / 1 = YY * tan(fovy / 2)
    alpha = atan(YY * tan(fovy / 2)

注意方向。正值指定向下旋转。


对于任意投影,这个问题可以通过分析解决:

假设我们有投影矩阵P和视图矩阵V,我们想解决:

w-clip(P * V * (0 0 1 0)^T) = (... YY ...)

由于您只想允许相机的x轴平移和旋转,V的格式为:

    / 1  0           0          tx \
V = | 0  cos alpha  -sin alpha  ty |
    | 0  sin alpha   cos alpha  tz |
    \ 0  0           0          1  /

这产生了等式:

YY = (p23 * cos alpha - p22 * sin alpha) / (p43 * cos alpha - p42 * sin alpha)

其中pijP行和i列中j的条目。

使用您最喜欢的符号解算器获取alpha的解决方案,您可以重新计算视图矩阵。