Проблемы при перетаскивании 3D-узла JavaFX - PullRequest
0 голосов
/ 27 мая 2019

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

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

}
...