0

我有这个奇怪的用例。

这些变量是已知的:

  • 相机变焦(或 fov)

  • 相机绕 Y 轴和 Z 轴旋转(方向)= 0

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

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

4

1 回答 1

2

在定义明确的对称视锥体的情况下,可以通过一些简单的几何图形找到解决方案:

问题可视化

我假设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)

其中是第 - 行和第 - 列中pij的条目。Pij

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

于 2015-01-30T12:39:47.997 回答