JavaFX 8 - 如何在平行相机上设置近裁剪面和远裁剪面?

5

我是一个团队的成员,正在开发一款使用JavaFX 8 3D操作可视化模型的应用程序。我们同时使用透视相机和平行相机。透视相机表现正常,目前使用isEyeAtCameraZero为false以最大程度兼容平行相机。

当调用camera.setNearClip()camera.setFarClip()时,透视相机表现正确。

平行相机似乎没有响应camera.setNearClip()camera.setFarClip()。平行相机确实执行近剪裁和远剪裁,但我无法更改平行相机的剪裁范围。

我使用基于JavaFX 8 Camera javadocs页面上的伪代码算法来计算传递给camera.setNearClip()camera.setFarClip()的值。这似乎对透视相机有效,但对平行相机无效。

有人能提供如何管理平行相机剪裁范围的建议吗?


1
我有点晚了!但是我想感谢InteractiveMesh。因此,我们通过将透视视场设置为非常小的角度并计算填充目标对象视图所需的相机到目标距离来模拟ParallelCamera。这有点笨拙,但最终用户很满意,它确实产生了一个可观的正交场景视图。 - Dennis Mackay-Fisher
你的答案应该是正确的,因为似乎可以模拟出ParallelCamera。我刚试过了 camera.setFieldOfView(1); camera.setTranslateZ(-26*cameraDistance); 的取值,其中cameraDistance是我用于 "normal" perspectiveCamera 的距离。它看起来相当不错,已经失去了其z深度。 - MitchBroadhead
2个回答

2

ParallelCamera在计算正交投影时似乎忽略了剪切距离。相反,Scene/SubScene的宽度或高度根据包私有方法确定远近剪切平面:

void computeProjectionTransform(GeneralTransform3D proj) {
    final double viewWidth = getViewWidth();
    final double viewHeight = getViewHeight();
    final double halfDepth = (viewWidth > viewHeight) ? viewWidth / 2.0 : viewHeight / 2.0;

    proj.ortho(0.0, viewWidth, viewHeight, 0.0, -halfDepth, halfDepth);
}

这使得ParallelCamera在JavaFX中进行3D渲染变得相当无用。

0

正如InnteractiveMesh所说,这不是开箱即用的,但可以通过覆盖来实现:

package javafx.scene

import com.sun.javafx.geom.transform.GeneralTransform3D

public class BetterOrthoCamera extends ParallelCamera
{
    public double orthoDepth = 1000.0;

    @Override
    void computeProjectionTransform(GeneralTransform3D var1) {
        double var2 = this.getViewWidth();
        double var4 = this.getViewHeight();
        double var6 = orthoDepth;
        var1.ortho(0.0, var2, var4, 0.0, -var6, var6);
    }

}

请注意,由于该方法是包私有的,因此您可能会遇到模块问题,因此我们必须在javafx.scene中定义子类,但在UNNAMED中运行似乎对我有效。
还可以将其调整为非对称的,只需更改-var6var6即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接