我正在使用 JavaFX 通过鼠标拖动来移动 3D 立方体。立方体应保持在 x 和 z 轴跨越的平面上。我的解决方案效果很好,但是如果我用鼠标移动立方体太快或遇到具有一定深度(y 轴)的对象时,假设鼠标在 y 轴和立方体上移动开始向前或向后跳跃。有没有办法将鼠标限制在 xz 平面上?一个更复杂的解决方案是将 y 长度投影回 xz 平面,但我不知道如何。我查看了JavaFX Moving 3D Objects,但无法适应我的情况。
到目前为止我的代码:
private volatile double relMousePosX;
private volatile double relMousePosZ;
public void enableDragMove(PaneBox paneBox) {
Group paneBoxGroup = paneBox.get();
paneBoxGroup.setOnMousePressed((MouseEvent me) -> {
if(isSelected(paneBox) && MouseButton.PRIMARY.equals(me.getButton())) {
relMousePosX = me.getX();
relMousePosZ = me.getZ();
}
});
paneBoxGroup.setOnMouseDragged((MouseEvent me) -> {
if(paneBoxGroup.focusedProperty().get() && MouseButton.PRIMARY.equals(me.getButton())) {
setDragInProgress(paneBox, true);
System.out.println(me.getY()); // should stay small value, but jumps to higher values at times, creating the problem.
paneBoxGroup.setCursor(Cursor.MOVE);
paneBox.setTranslateX(paneBox.getTranslateX() + (me.getX() - relMousePosX));
paneBox.setTranslateZ(paneBox.getTranslateZ() + (me.getZ() - relMousePosZ));
}
});
paneBoxGroup.setOnMouseReleased((MouseEvent me) -> {
if(paneBoxGroup.focusedProperty().get() && MouseButton.PRIMARY.equals(me.getButton())) {
setDragInProgress(paneBox, false);
paneBoxGroup.setCursor(Cursor.DEFAULT);
}
});
}