JavaFx 3D 中 SubScene 的绝对缩放

Absolute scaling of SubScene in JavaFx 3D

我正在寻找以厘米为单位测量的实际距离模型。因此,以下包含一个简单矩形的 SubScene 的宽度和高度与我的模型距离(以厘米为单位)相关联。该代码针对某些矩形尺寸 (100 cm) 正确呈现,但对其他尺寸 (200 cm) 呈现错误。当我说它有效时,我看到红色矩形的大小是 window 窗格大小的 1/3...那是视野。当它不起作用时,窗格是空白的。奇怪的是,我安排了缩放比例,因此所有比率都通过从 size_cm 参数定位相机和 fieldOfView 角度来固定。所以我很困惑为什么改变这个绝对比例应该很重要。我在这里使用 Kotlin,但我希望直接使用 Kotlin Java。我很感激任何想法。

class Scale3D : View("My View") {
val size_cm = 100.0 //works,  200.0 //fails
val cameraFOV_pix = 600.0
val cameraFOV_cm = 3.0 * size_cm
val cameraZOffset_cm = 1.0 * size_cm

val testBox = Rectangle(size_cm, size_cm).apply{
    fill= Color.RED
    translateX = -size_cm / 2.0
    translateY = -size_cm / 2.0
}

val vCamera = PerspectiveCamera(true).apply{
    translateZ = -cameraZOffset_cm
    fieldOfView = 2.0*Math.toDegrees(Math.atan2(cameraFOV_cm/2.0, cameraZOffset_cm))
    println("angle=%.1f deg".format(fieldOfView))
}

override val root = anchorpane {
    val rootVx = Group(vCamera,testBox)
    val subScene = SubScene(rootVx, cameraFOV_pix, cameraFOV_pix,true, SceneAntialiasing.BALANCED).apply {
        fill = Color.ALICEBLUE
        camera = vCamera
    }
    children.addAll(subScene)
}

}

我想你必须考虑裁剪平面。有一个近裁剪平面和一个远裁剪平面。 near/far 裁剪平面定义了相对于将渲染对象的摄像机的 closest/furthest 点(例如 https://docs.oracle.com/javafx/8/3d_graphics/camera.htm). The default value for the near clip plane is 0.1 and for the far clip plane 100.0 (https://docs.oracle.com/javase/9/docs/api/javafx/scene/Camera.html#farClipProperty)。 在您的场景中,对象位于所有距离 cameraZOffset_cm > 100.0(= 远剪辑默认值)的远剪辑平面后面。因为 cameraZOffset_cm = 1.0 * size_cm 这对应于 size_cm > 100.0。因此,您的对象不会针对大于 100.0 的所有尺寸进行渲染。 您只需使用 camera.setFarClip(cameraZOffset_cm) 或相应的 Kotlin 命令将远剪辑增加到至少 cameraZOffset_cm。