我正在寻找一种在 JavaFX 3D 中呈现透明对象的方法。到目前为止,什么都没有。我发现问题https://bugs.openjdk.java.net/browse/JDK-8090548。有解决方法还是这只是我不能使用的东西?如果我需要一个透明对象,我还需要 JavaFX(如 Java3D)以外的东西吗?
3 回答
由于 JDK8u60 b14在 3D 形状中启用了透明度。
这是用它完成的快速测试:
一个带有漫反射颜色的圆柱体Color.web("#ffff0080")
,被添加到一个盒子和两个球体的顶部。
group.getChildren().addAll(sphere1, sphere2, box, cylinder);
但是没有深度排序算法,这意味着将 3D 形状添加到场景中的顺序很重要。我们需要更改顺序以允许盒子透明:
group.getChildren().addAll(sphere1, sphere2, cylinder, box);
更新
从 Java 8u60b14 开始,该答案已过时,因为该版本中的 JavaFX 添加了透明度。
正如您在问题说明中链接的问题,JavaFX 3D for Java 8 不支持透明度。它可能在 Java 9 中实现。
用户在问题跟踪器的评论中提到了一种解决方法,其中涉及对 JavaFX OpenGL 管道的本机代码的破解。如果您迫切需要此功能,则可以尝试该 hack。如果这不适合您,那么您将需要选择不同的技术。
这是部分解决方案。要将地球纹理图像映射到球体的透明度添加到球体,请同时设置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);
)显示出来。它还不能让其他形状显示出来。
显然,这样做的原因是在计算像素颜色时,漫反射颜色乘以漫反射贴图颜色。请参阅https://docs.oracle.com/javase/8/javafx/api/javafx/scene/paint/PhongMaterial.html。