代码之家  ›  专栏  ›  技术社区  ›  CJDood

JavaFX 3D透明度

  •  8
  • CJDood  · 技术社区  · 10 年前

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

    3 回复  |  直到 9 年前
        1
  •  15
  •   José Pereda    9 年前

    自JDK8u60以来 b14 在3D形状中启用透明度。

    这是一个快速测试:

    Transparency

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

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

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

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

    Transparency

        2
  •  5
  •   jewelsea    8 年前

    使现代化

    这个答案已经过时了,因为Java8u60b14在该版本中为JavaFX添加了透明度。


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

    用户在对问题跟踪器的评论中提到了一个解决方法,其中涉及对JavaFX OpenGL管道的本地代码的黑客攻击。如果你非常渴望这个功能,你可以尝试一下。如果这不适合你,那么你需要选择不同的技术。

        3
  •  2
  •   Clashsoft    2 年前

    这是一个部分解决方案。若要为映射有地球纹理图像的球体添加透明度,请设置 二者都 漫反射贴图 漫反射颜色:

    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
    
             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 .