7

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

4

3 回答 3

14

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

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

透明度

一个带有漫反射颜色的圆柱体Color.web("#ffff0080"),被添加到一个盒子和两个球体的顶部

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

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

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

透明度

于 2015-05-13T11:45:29.850 回答
5

更新

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


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

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

于 2015-03-27T21:51:00.530 回答
2

这是部分解决方案。要将地球纹理图像映射到球体的透明度添加到球体,请同时设置diffuseMapdiffuseColor

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

于 2016-12-29T20:30:17.433 回答