我已经很久没有遇到这个问题了,无论在这里有什么答案,我都一直试图解决这个问题。
这是我的上一个问题,没有解决的问题JavaFX 3D PerspectiveCamera affects drag position of a node
(问题中没有提供答案/链接)
基本上,我正在尝试拖动节点,同时将鼠标的位置保持在拖动时节点的单击位置。
最初的想法是执行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);
}
}