Java FX 3D: объекты, не относящиеся к своей координате Z - PullRequest
1 голос
/ 01 октября 2019

Я пытаюсь анимировать сферу, вращающуюся вокруг другой сферы, однако сфера впереди не перемещается за секунду, когда ее координата Z становится меньше.

например (0,0,1) и (0,0, -1) оба появляются перед (0,0,0) Просто их размеры различаются в зависимости от перспективы. Не уверен, как это исправить или что я делаю неправильно, новичок в Java FX!

public class Main extends Application {

    private static final int WIDTH = 1280;
    private static final int HEIGHT = 720;

    Planet earth = new Planet("Earth",50,0,0,0);
    Planet earth2 = new Planet("Earth 2",50,25,0,50);

    public void start(Stage primaryStage) throws Exception {
        Group group = new Group();
        group.getChildren().addAll(earth,earth2);
        PerspectiveCamera camera = new PerspectiveCamera();

        Scene scene = new Scene(group, WIDTH, HEIGHT);
        scene.setFill(Color.BLACK);
        scene.setCamera(camera);

        camera.setNearClip(0);
        camera.setFarClip(1000);
        camera.setTranslateX(-WIDTH/2);
        camera.setTranslateY(-HEIGHT/2);
        camera.setTranslateZ(-1000);

        primaryStage.setTitle("3D Scene");
        primaryStage.setScene(scene);
        primaryStage.show();
        timeline();
    }

    public static void main(String[] args) {
        launch(args);
    }

    private void timeline(){
        final long start = System.nanoTime();
        double FACTOR = 1;
        new AnimationTimer(){
            @Override
            public void handle(long now) {
                double t = (now-start)/1000000000.0;
                //System.out.println(t);
                //earth2.setTranslateX(150*Math.cos(t));
                earth2.setTranslateZ(150+500*Math.sin(t));
                earth.setPosition(0,0,0);
                System.out.println(earth2+" | "+earth);
            }
        }.start();
    }
}
public class Planet extends Sphere {

    private String name;

    public Planet(String name, double radius, double x, double y, double z){
        super(radius);
        setPosition(x,y,z);
        this.name = name;
    }

    public void setPosition(double x, double y, double z){
        setTranslateX(x);
        setTranslateY(y);
        setTranslateZ(z);
    }

    public void move(double x, double y, double z){
        translateXProperty().add(x);
        translateYProperty().add(y);
        translateZProperty().add(z);
    }

    @Override
    public String toString() {
        return "["+name+"] - ("+getTranslateX()+","+getTranslateY()+","+getTranslateZ()+")";
    }
}

Результат:

1 Ответ

1 голос
/ 02 октября 2019

Вам необходимо включить буферизацию глубины на Scene, содержащем трехмерные объекты и / или преобразования. Вот документация :

Приложение может запросить поддержку буфера глубины или поддержку сглаживания сцены при создании Scene. Сцена с только 2D-формами и без 3D-преобразований не требует буфера глубины или поддержки сглаживания сцены. Сцена, содержащая трехмерные фигуры или двумерные фигуры с трехмерными преобразованиями, может использовать поддержку буфера глубины для надлежащей сортировки по глубине;чтобы избежать глубинного боя (также известного как Z-бой), отключите проверку глубины на 2D-фигурах, которые не имеют 3D-преобразований. См. depthTest для получения дополнительной информации. Сцена с трехмерными фигурами может позволить сглаживанию сцены улучшить качество рендеринга.

Флажки deepBuffer и antiAliasing являются условными функциями. С соответствующими значениями по умолчанию: false и SceneAntialiasing.DISABLED. См. ConditionalFeature.SCENE3D для получения дополнительной информации.

Буферизация глубины не может быть включена после создания экземпляра Scene, вы должны использовать один из следующих конструкторов:

Аргумент boolean является флагом буферизации глубины.

Примечание: Это также относится к SubScene.


Вы также упоминали, что должны были установить Camera#nearClip*От 1046 * до 0.01 вместо 0. Для удобства вот документация этого свойства:

Определяет расстояние от глаза ближайшей плоскости отсечения этого Camera в координатном пространстве глаза. Объекты ближе к глазу, чем nearClip, не рисуются. nearClip указано как значение больше нуля. Значение, меньшее или равное нулю, рассматривается как очень маленькое положительное число.

Значение по умолчанию:
0.1

Это говорит означение должно быть больше нуля. Конечно, он также говорит, что значение <= 0 будет рассматриваться как " очень маленькое положительное число ", что, как я понимаю, означает, что значение <= 0 будет интерпретироваться как число, произвольно близкое к, , но все равно больше , ноль. Поэтому я не совсем уверен, почему установка значения 0 может вызвать проблемы.

...