JavaFX 3D 透明度

JavaFX 3D Transparency

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

更新

自 Java 8u60b14 起,此答案已过时,因为透明度已添加到该版本中的 JavaFX。


作为您在问题注释中 link 的问题,JavaFX 3D 不支持 Java 8 的透明度。它可能会在 Java 9 中实现.

用户在问题跟踪器的评论中提到了一个解决方法,它涉及对 JavaFX OpenGL 管道的本机代码的破解。如果你迫切需要这个功能,你可以试试那个 hack。如果那不适合你,那么你需要选择不同的技术。

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

这是用它完成的快速测试:

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

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

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

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

这是部分解决方案。要向映射到地球纹理图像的球体添加透明度,请设置 both a diffuseMap and a 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); 设置)显示出来。还不能让其他形状显示出来。

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