Проблема с точечными огнями, когда на мобильном телефоне - PullRequest
0 голосов
/ 03 мая 2018

мне кажется, что PointLight неправильно освещает сцену при запуске приложения на Android. Несмотря на то, что это было закодировано с помощью Gluon Mobile, мне кажется, что это проблема javafxport или JavaFX 3D.

Вот демонстрационный пример, демонстрирующий проблему:

import com.gluonhq.charm.glisten.application.MobileApplication;
import com.gluonhq.charm.glisten.control.AppBar;
import com.gluonhq.charm.glisten.mvc.View;
import com.gluonhq.charm.glisten.visual.MaterialDesignIcon;
import javafx.animation.Interpolator;
import javafx.animation.TranslateTransition;
import javafx.scene.PointLight;
import javafx.scene.SubScene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Sphere;
import javafx.util.Duration;


public final class LightView extends View {

    public LightView() {
        setOnShown(event -> build3DContent());
    }

    private void build3DContent() {
        Sphere sphere = new Sphere();
        sphere.setRadius(100);
        sphere.setTranslateX(getWidth() / 2d);
        sphere.setTranslateY(getHeight() / 2d);
        final PointLight light = new PointLight(Color.WHITE);
        light.getScope().add(sphere);
        light.setTranslateZ(-300);
        light.setTranslateY(getHeight() / 2d);
        final Pane root = new Pane();
        root.getChildren().addAll(sphere, light);
        SubScene subScene = new SubScene(root, getWidth(), getHeight());
        setCenter(subScene);
        final TranslateTransition animation = new TranslateTransition(Duration.seconds(2));
        animation.setNode(light);
        animation.setToX(getWidth());
        animation.setAutoReverse(true);
        animation.setCycleCount(TranslateTransition.INDEFINITE);
        animation.setInterpolator(Interpolator.EASE_BOTH);
        animation.playFromStart();
    }    

    @Override
    protected void updateAppBar(AppBar appBar) {
        appBar.getActionItems().add(MaterialDesignIcon.ARROW_BACK.button(event -> MobileApplication.getInstance().switchView(MobileApplication.HOME_VIEW)));
    }
}

При работе на рабочем столе в Windows, PointLight центрируется по оси Y, и анимация заставляет его двигаться влево и вправо от сферы. Сама сфера также центрирована по оси Y, поэтому свет проходит через ее экватор. Но при работе на Android сфера центрируется, а свет освещает только верхнюю часть сферы. Координаты PointLight отображаются правильно, хотя. Это не было проверено на ARM (Pi), симуляторе iOS или устройстве iOS или любой другой настольной ОС.

Настольная версия Версия Android

Вот еще один более сложный пример с планетой, освещенной 3 точечными огнями. Light1 расположен в центре слева и перед сферой, light2 расположен в центре справа и за сферой, а light 3 свободно расположен перед сферой, перемещая белую точку с помощью мыши или перемещением крана. Координаты всех точечных источников света отображаются правильно, но при работе на Android они определенно не правильные. Все отлично работает при работе на Windows.

Настольная версия Версия Android

Дополнительная информация:

Windows 10 Версия 10.0.16299.371

JDK 9.0.1

Исправление безопасности для Android Samsung Galaxy 8 Plus Android 8.0.0 Апрель 2018

Intellij IDEA 2018.1.1

Глюон (из build.graddle)

JavaFXPorts 2.0.19

совместимость с источниками 1,8

Целевая совместимость 1,8

Gluon Charm 5.0.0-jdk9

Gluon Charm Down config 3.8.0

Примечание: Мне предложили опубликовать эту проблему в StackOverflow после того, как я напрямую связался со службой поддержки Gluon.

РЕДАКТИРОВАТЬ - орфография

...