Проблемы с перетаскиванием 3D-узла JavaFX

У меня была эта проблема в течение длительного времени, и независимо от того, какие ответы я пытаюсь здесь найти, у меня все еще есть проблема.

Это мой предыдущий вопрос, который не имел решения JavaFX 3D PerspectiveCamera влияет на позицию перетаскивания узла

(как и ответы/ссылки, представленные в вопросе)

По сути, я пытаюсь перетащить узел, сохраняя положение мыши в позиции щелчка узла во время перетаскивания.

Первоначальная мысль заключалась в том, чтобы сделать event.getScreenX() или event.getSceneX(), чтобы получить начальную позицию на mouseClicked, а затем сравнить/обновить при перетаскивании мышью.

Проблема в том, что когда я увеличиваю и уменьшаю камеру (camera.setTranslateZ()), по какой-то причине значения будут увеличиваться/уменьшаться в зависимости от увеличения, т.е. узел перетаскивается медленнее/остается с мышью при увеличении камеры. из.

Что бы это ни стоило, я также масштабировал основной узел на 10, что, я думаю, может иметь какое-то отношение к этому, поскольку один из примеров, похоже, сломался при изменении масштаба и/или камеры; однако пример также не работает, без масштаба.

У кого-нибудь есть идеи? Крайне разочаровывает то, насколько проста эта задача, но на самом деле ее трудно выполнить. Я бы подумал, что, поскольку мышь будет перетаскивать, независимо от того, перетаскивает ли она 1 пиксель при увеличении мыши или 100 пикселей при уменьшении масштаба мыши, это не вызовет этой проблемы, поэтому мне интересно, есть ли какой-то ошибка с этим? Любые мысли приветствуются, спасибо.

public class Move extends Application {

double x0,xDiff;
double y0,yDiff;
@Override
public void start(Stage primaryStage) {

    Box b = new Box(100,100,1);
    b.setLayoutX(0);
    b.setLayoutY(0);
//    b.setTranslateZ(20000);

    Pane root = new Pane();
    root.getChildren().add(b);

    PhongMaterial p = new PhongMaterial();
    p.setDiffuseColor(Color.RED);
    b.setMaterial(p);

    Scene scene = new Scene(root, 2000, 1250,true);
    PerspectiveCamera camera = new PerspectiveCamera(true);
    camera.setTranslateZ(-1000);
    camera.setFarClip(2000);
    scene.setCamera(camera);
    primaryStage.setTitle("Hello World!");
    primaryStage.setScene(scene);
    primaryStage.show();

        b.setOnMousePressed(event
     ->{
            x0 = event.getSceneX();
            y0 = event.getSceneY();
            event.consume();
        });

        b.setOnMouseDragged(event
    ->{



        xDiff = event.getSceneX() - x0;
        yDiff = event.getSceneY() - y0;
        b.setLayoutX(b.getLayoutX() + xDiff);
        b.setLayoutY(b.getLayoutY() + yDiff);

        x0 = event.getSceneX();
        y0 = event.getSceneY();

});



primaryStage.setOnScroll(event
     ->{
  if (event.getDeltaY() > 0)
                 {
                    camera.setTranslateZ(camera.getTranslateZ() + 45);

                 }

                  else 
                 {

                    camera.setTranslateZ(camera.getTranslateZ() - 45);
                 }  
 });
}
    /**
     * @param args the command line arguments
     */
public static void main(String[] args) {
    launch(args);
}

}

person MXBuster    schedule 27.05.2019    source источник
comment
Если вы хотите перетащить 3D-узел в Scene, это ответ, который вы ищете: [JavaFX Перемещение 3D-объектов с помощью мыши на виртуальной плоскости] (stackoverflow.com/a/28746439/3956070). Однако это не работает для SubScene. Обратите внимание, что проблема далеко не в том, насколько проста эта задача.   -  person José Pereda    schedule 28.05.2019
comment
@JoséPeda, спасибо, вы, кажется, единственный человек, который помогает решить эту проблему. Я пробовал этот пример, и он, похоже, не работал для моих нужд. Я использую SubScene, почему это не работает так же, как сцена? Я думаю, что в 3D перетаскивание будет очень простым, но в чем проблема? Почему возникает проблема, когда я получаю расстояние, на которое мышь переместилась из одной точки в другую, а затем это не переводится в сцену? Я думаю, это было бы просто. Есть ли причина, по которой объект не перемещается с помощью мыши, получая расстояние перемещения?   -  person MXBuster    schedule 28.05.2019
comment
@JoséPeda Я понял, что эта проблема возникает из-за перспективной камеры, у вас есть идеи? Я также думал об использовании расстояния до камеры в формуле, чтобы решить проблему с движением камеры вперед и назад, но это кажется очень раздражающей проблемой, но это больше похоже на ошибку, чем на ошибку. По-прежнему непонятно, почему перетаскивание 3D-объекта на 2D-плоскости настолько сложнее, чем 2D на 2D-плоскости. Большое спасибо за уделенное время. Я посмотрю этот пост еще раз, чтобы увидеть, если я могу найти что-нибудь. Если бы не какие-либо другие мысли, которые вы могли бы иметь? Спасибо   -  person MXBuster    schedule 28.05.2019
comment
Сцена работает нормально и основана на математических вычислениях, включающих выбор лучей, камеру, расстояние до объекта и 2D-координаты мыши. Это далеко не тривиально, потому что вы хотите переместить 3D-объект в 3D-координатах, используя только ссылку 2D-мыши. В процессе происходит сложное 2D -> 3D отображение. С SubScene дела обстоят еще хуже, потому что вам нужно еще и трансформировать между scene -> subScene. Я действительно потратил довольно много времени, пытаясь найти решение для этого, но безрезультатно пока.   -  person José Pereda    schedule 28.05.2019
comment
@JoséPeda Я полагал, что за кулисами будут выполняться сложные вычисления, но я полагал, что для 3D-объектов будет встроено некоторое перемещение. Технически, если я просто сделаю Node.getX() + event.getX(), и он будет каждый раз удерживать мышь в центре. Первоначально моей мыслью было вычислить расстояние от центра до event.getX, но есть странное изменение (мышь находится в центре первого узла), что вызывает гораздо больше трудностей. Я очень ценю вашу доброту за потраченное время, пытаясь помочь мне. Перемещение камеры Z также является проблемой (если я не использую event.getX). Спасибо еще раз!   -  person MXBuster    schedule 28.05.2019
comment
@JoséPeda Я предполагаю, что ты ничего не смог с этим понять? Я ценю ваше время, потраченное на это, спасибо. Я нашел обходной путь, который соответствует моим потребностям, но было бы интересно узнать математику, стоящую за ним.   -  person MXBuster    schedule 12.06.2019
comment
Это давняя проблема: bugs.openjdk.java.net/browse/JDK-8091210.   -  person user1803551    schedule 25.04.2020