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