У меня была эта проблема в течение длительного времени, и независимо от того, какие ответы я пытаюсь здесь найти, у меня все еще есть проблема.
Это мой предыдущий вопрос, который не имел решения 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);
}
}
Scene
, это ответ, который вы ищете: [JavaFX Перемещение 3D-объектов с помощью мыши на виртуальной плоскости] (stackoverflow.com/a/28746439/3956070). Однако это не работает дляSubScene
. Обратите внимание, что проблема далеко не в том, насколько проста эта задача. - person José Pereda   schedule 28.05.2019