JavaFX 3D透明度

时间:2015-03-27 19:07:41

标签: 3d javafx transparency javafx-3d

我正在寻找一种在JavaFX 3D中渲染透明对象的方法。到目前为止,没有。我找到了问题https://bugs.openjdk.java.net/browse/JDK-8090548。是否有解决方法或这只是我无法使用的东西?如果我需要透明对象,我还需要JavaFX之外的东西(比如Java3D)吗?

3 个答案:

答案 0 :(得分:11)

由于在3D形状中启用了JDK8u60 b14透明度。

这是一个快速测试:

Transparency

在一个方框和两个球体的顶部上添加了一个带有漫反射颜色Color.web("#ffff0080")的圆柱体。

group.getChildren().addAll(sphere1, sphere2, box, cylinder);

但是没有深度排序算法,这意味着3D形状如何添加到场景中的顺序很重要。我们需要更改顺序以允许框中的透明度:

group.getChildren().addAll(sphere1, sphere2, cylinder, box);

Transparency

答案 1 :(得分:4)

更新

从Java 8u60b14开始,这个答案已经过时了,因为在该版本中,JavaFX中添加了透明度。


正如您在问题说明中链接的问题,JavaFX 3D for Java 8不支持透明度。它可以针对Java 9实现。

用户在问题跟踪器的评论中提到了一种解决方法,其中包含对JavaFX OpenGL管道的本机代码的破解。如果你渴望这个功能,你可以试试这个黑客。如果这不适合您,那么您需要选择其他技术。

答案 2 :(得分:2)

这是部分解决方案。要使用映射到它的地球纹理图像为球体添加透明度,请将两者设置为diffuseMap 一个diffuseColor:

private void makeEarth() {
         PhongMaterial earthMaterial = new PhongMaterial();
         Image earthImage = new Image("file:imgs/earth.jpg");
         earthMaterial.setDiffuseMap(earthImage);
         earthMaterial.setDiffuseColor(new Color(1,1,1,0.6));  // Note alpha of 0.6
         earthMaterial.diffuseMapProperty();
         earth=createSphere(0,0,0,300,earthMaterial);
         earthMaterial.setSpecularColor(Color.INDIANRED);         
         earth.setRotationAxis(Rotate.Y_AXIS);
         world.getChildren().add(earth);
    }

这仅适用于允许场景的背景图像(由scene.setFill(starFieldImagePattern);设置)显示。它还不能用于允许其他形状显示出来。

显然,这样做的原因是在计算像素的颜色时,漫反射颜色乘以diffuseMap颜色。请参阅https://docs.oracle.com/javase/8/javafx/api/javafx/scene/paint/PhongMaterial.html