3D :保持 horizon 在屏幕上以相同的高度绘制,无论相机的变焦如何

3D : keep horizon drawn on screen at the same height regardless camera's zoom

我有这个奇怪的用例。

这些变量是已知的:

现在,我想要 horizon(horizon 位置 = (0,0,Infinite))在屏幕上以 特定 二维高度 "YY" 绘制。 Camera X-axis 旋转必须是多少才能在 "YY" 处绘制 horizon?

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

在 well-defined 对称视锥的情况下,可以用一些简单的几何图形找到解决方案:

我假设 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-axis 的平移和旋转,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 求解,您可以 re-calculate 您的 view-matrix.