我有这个奇怪的用例。
这些变量是已知的:
相机缩放(或fov)
Y轴和Z轴= 0
现在,我希望 特定在屏幕上绘制 视野 (地平线位置= (0,0,Infinite)
) 2D高度“YY”。必须是相机X轴旋转,以便在“YY”处绘制地平线?
你可能会问为什么我需要这个:好吧,当我改变相机变焦时,地平线会改变屏幕上的位置(在所有情况下除了X轴旋转= 0
)。我需要能够改变相机变焦并保持地平线不变(相对于其2D位置)。 AFAIK,这只能通过相应地改变X轴旋转来实现。
答案 0 :(得分:1)
对于明确定义的对称视锥体,可以使用一些简单的几何体找到解决方案:
我假设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
是P
行和i
列中j
的条目。
使用您最喜欢的符号解算器获取alpha
的解决方案,您可以重新计算视图矩阵。