首页 > 解决方案 > 拖动 JavaFX 3D 节点的问题

问题描述

我已经有这个问题很长时间了,无论这里有什么答案,我都会尝试一直遇到问题。

这是我以前的一个问题,没有解决它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);
}

}

标签: javajavafxmouseeventmousejavafx-3d

解决方案


推荐阅读