我在尝试在3D场景中移动JavaFX中的节点时遇到问题。问题是我希望鼠标停留在我单击的节点内的位置,即居中。使用PerspectiveCamera,它将改变位置。我尝试了几种不同的方法,但没有任何运气。 2D矩形和3D框(没有摄像头)可以完美地工作,但是一旦添加了PerspectiveCamera,无论参数是非,我都会遇到问题。
我想知道是否应该报告此错误,或者是否有某种方法可以从另一个角度影响节点的移动
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();
});
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
}
我正在使用Java 8更新91或181(netbeans似乎将默认值设置为91,但我也有181)
JavaFX Moving 3D objects with mouse on a virtual plane
我也找到了这篇文章,并尝试了答案,而且似乎也有一些问题,但似乎要好得多(除了很难用拖动时旋转节点的附加代码进行测试,所以如果拖出它旋转的球体。
非常感谢您
编辑:尝试返回到最初拖动的方式之后,我能够到达可以使鼠标光标停留在中间的位置,但是我试图弄清楚如何获得准确的位置
b.setLayoutX(b.getLayoutX() + (event.getX()));
b.setLayoutY(b.getLayoutY() + (event.getY()));
会给我节点的中心。
我最初在2D上使用与此类似的代码,但在3D上却遇到了问题,我认为这是由于左上角0,0与中心的0,0,0之差造成的。
2D的代码类似于
b.setLayoutX(b.getLayoutX() + (event.getX()-b.getMinX()));
b.setLayoutY(b.getLayoutY() + (event.getY()-b.getMinY()));
从本质上讲,从我看到的当我设置原始布局+事件位置时,它只是将中心/左上角移动到鼠标事件的坐标,所以我将尝试获取节点原点之间的差异和mouseEvent(这是event.getX()的作用),并尝试找出要移动的差异,这就是event.getSceneX() - x0
的作用。我尝试在没有Scene X / Y的情况下执行此操作,但是它似乎无法正常工作,但是我不确定是否应该使用SceneX / Y。