3D :保持 horizon 在屏幕上以相同的高度绘制,无论相机的变焦如何
3D : keep horizon drawn on screen at the same height regardless camera's zoom
我有这个奇怪的用例。
这些变量是已知的:
相机变焦(或 fov)
相机绕 Y 轴和 Z 轴旋转(方向)= 0
现在,我想要 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)
其中 pij
是 P
在第 i
行第 j
列中的条目。
使用您最喜欢的符号求解器为 alpha
求解,您可以 re-calculate 您的 view-matrix.
我有这个奇怪的用例。
这些变量是已知的:
相机变焦(或 fov)
相机绕 Y 轴和 Z 轴旋转(方向)
= 0
现在,我想要 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)
其中 pij
是 P
在第 i
行第 j
列中的条目。
使用您最喜欢的符号求解器为 alpha
求解,您可以 re-calculate 您的 view-matrix.