JavaFX в 3D и прозрачности

Я ищу способ визуализации прозрачного объекта в JavaFX 3D. Пока ничего. Я нашел проблему https://bugs.openjdk.java.net/browse/JDK-8090548. Есть ли обходной путь или это просто то, что я не могу использовать? Нужно ли мне что-то кроме JavaFX (например, Java3D), если мне нужен прозрачный объект?

3 ответов


С JDK8u60 b14 прозрачность включена в 3D-фигур.

это быстрый тест, сделанный с ним:

Transparency

цилиндр с диффузным цвет Color.web("#ffff0080") добавляется сверху коробки и двух сфер.

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

нет алгоритма сортировки глубины, хотя это означает, что порядок добавления 3D-фигур в сцену вопросы. Нам нужно изменить порядок, чтобы обеспечить прозрачность box:

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

Transparency


обновление

этот ответ устарел, начиная с Java 8u60b14, поскольку прозрачность была добавлена в JavaFX в этой сборке.


как проблема, которую вы связываете в своих заметках вопроса, прозрачность не поддерживается в JavaFX 3D для Java 8. Он может быть реализован для Java 9.

существует обходной путь, который пользователь упоминает в комментариях к трекеру проблем, который включает взлом собственного кода для конвейера JavaFX OpenGL. Если вы отчаянно нуждаетесь эта функциональность, вы можете попробовать этот хак. Если это не подходит для вас, то вам придется выбрать другую технологию.


вот частичное решение. Чтобы добавить прозрачность к сфере с изображением текстуры земли, сопоставленной с ней, установите и в diffuseMap и 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);), чтобы показать через. Это еще не работает для того, чтобы позволить другим формам проявляться.

видимо, причина этого заключается в том, что диффузный цвет умножается на цвет diffuseMap, когда вычисление цвета пикселей. См.https://docs.oracle.com/javase/8/javafx/api/javafx/scene/paint/PhongMaterial.html .