Абсолютное масштабирование SubScene в JavaFx 3D

Я смотрю, чтобы смоделировать реальные расстояния, скажем, измеренные в сантиметрах. Таким образом, следующая SubScene, содержащая простой прямоугольник, имеет ширину и высоту, связанные с расстоянием до моей модели в см. Код отображается правильно для определенного размера прямоугольника (100 см), но не для других (200 см). Когда я говорю, что это работает, я вижу красный прямоугольник с 1/3 размера окна... это поле зрения. Когда это не работает, панель пуста. Как ни странно, я организовал масштабирование так, чтобы все соотношения фиксировались путем позиционирования камеры и угла fieldOfView из параметра size_cm. Поэтому я запутался, почему изменение этого абсолютного масштабирования должно иметь значение. Я использую 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)
}

}

1 ответ

Решение

Я полагаю, вы должны рассмотреть плоскости отсечения. Существует ближняя плоскость обрезки и дальняя плоскость обрезки. Ближайшая / дальняя плоскость отсечения определяет ближайшую / самую дальнюю точку относительно камеры, на которой будут отображаться объекты (например, https://docs.oracle.com/javafx/8/3d_graphics/camera.htm). Значение по умолчанию для ближней плоскости отсечения составляет 0,1, а для дальней плоскости отсечения - 100,0 ( https://docs.oracle.com/javase/9/docs/api/javafx/scene/Camera.html). В вашем сценарии объект находится за плоскостью дальнего отсечения для всех расстояний cameraZOffset_cm > 100.0 (= значение по умолчанию для дальнего отсечения). Из-за cameraZOffset_cm = 1.0 * size_cm это соответствует size_cm > 100.0. Таким образом, ваш объект не отображается для всех размеров больше 100.0. Вы просто должны увеличить дальний клип до, по крайней мере, камеры ZOffset_cm с помощью camera.setFarClip(cameraZOffset_cm) или, скорее, соответствующей Kotlin-команды.

Другие вопросы по тегам