在定义明确的对称视锥体的情况下,可以通过一些简单的几何图形找到解决方案:
我假设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
,您可以重新计算您的视图矩阵。