JavaFX 3D PerspectiveCamera影响节点的拖动位置

时间:2019-03-05 03:21:05

标签: javafx 3d javafx-8

我在尝试在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。

0 个答案:

没有答案