计算透视相机JavaFX的视口

时间:2017-12-18 21:37:11

标签: java javafx viewport bounds perspectivecamera

如何计算JavaFX中透视摄像机视口的x和y范围? “camera.getBoundsInParent”方法可用于确定摄像机的位置,但是,如何使用该位置计算摄像机视口的大小?

1 个答案:

答案 0 :(得分:0)

根据documentation for PerspectiveCamera

  

默认情况下,此摄像机位于场景的中心,沿正z轴看。本相机定义的坐标系统的原点位于面板的左上角,Y轴朝下,Z轴指向远离观察者(进入屏幕)。

fieldOfView property定义场景的可见部分对照相机所对应的角度,默认情况下此角度为measured vertically

最后,默认情况下,

  

在Z中调整眼睛位置的Z值,使得使用指定的fieldOfView生成的投影矩阵将产生Z = 0(投影平面)的单位,在与设备无关的像素中,与ParallelCamera

换句话说,场景的可见部分在Z = 0 固定为场景大小的像素坐标

因此,假设这些默认值,我们可以绘制下图:

enter image description here

此处,左侧的点表示默认的摄像机位置。矩形是z=0处屏幕的可见部分。 w是场景的宽度,h是场景的高度(因此某些(w/2, h/2, -z_c)的相机位于z_c > 0。)

相机在z = 0处与场景可见部分的顶部中心相交的线在图中扩展到场景可见部分顶部中心的某个点,处于任意z值。很容易看出顶部三角形是一个直角三角形,高度为-y,长度为z,类似于从摄像机到场景中心形成的直角三角形{{1 }}。由于相似的三角形,它具有角度z=0,其中f/2是视野的角度。因此,对于场景可见部分顶部的点f,我们必须

(w/2, y, z)

-y/z = tan(f/2)

您可以在图片底部构建另一个三角形,并推断出y = -z tan(f/2) 坐标满足

y

对于宽度,只需注意场景的可见部分的比例始终为y = h + z tan(f/2) 的比例,因此对于可见部分左边缘中心的点w:h现场,我们有

(x, h/2, z)

位于场景可见部分的右侧

x = -z (w/h) tan(f/2)

因此,总而言之,场景的边界从

延伸
x = w + z (w/h) tan(f/2)

在左上角,

(-z (w/h) tan(f/2), -z tan(f/2))

位于右下角,其中(w + z (w/h) tan(f/2), h + z tan(f/2)) z - 坐标,z是场景的宽度,w是场景的高度,{{1视场的(垂直)角度。

这是一个演示。这有四个球体位于场景可见部分的顶部中心,底部中心,左侧中心和右侧中心。所有四个球体的h - 坐标都是动画的(因此它们会在f方向远离观察者,看起来变得更小),以及它们的z - 或{{1 - 坐标被绑定,以便它们保持在场景可见部分的极端。 (例如,红色球体沿着上图中顶部的直角三角形的斜边动画,其他球体的动画类似。)

z

enter image description here

如果将相机添加到场景并移动(并可能旋转)它,那么几何图形会变得相当复杂,尽管基本图像仍然是相同的(只是不方便与轴对齐)。更一般情况的类似计算超出了论坛帖子的范围(并留给读者练习......)。