使用鼠标和键盘 [JavaFX3D] 在 3D 中移动 Space

Moving in 3D Space using mouse along with keyboard [JavaFX3D]

简介:

首先,我应该说,在编程中涉及 3D 图形时,我是一个新手,一般来说..所以如果可能的话,我需要更多关于事情如何工作的解释 [...]

问题:

我的问题是,我不知道如何使用鼠标和键盘一起移动,因为当我如下图所示移动时,我总是 卡在中间

目标:

我的目标是制作一个 3D 第一人称相机,能够在 3D 中移动 space,充满按钮、圆圈等组件,例如我可以用鼠标导航和沿 XYZ 轴的键盘。

进度:

我找到了一些类似的链接,对我有帮助 !但我仍然无法理解如何移动我的鼠标并走到一个特定的点(不是我不知道 2Dimentions 中的 3D 投影是如何工作的,而是如何使用鼠标和键盘移动) .此刻,我一直在尝试随机的事情:

困在中心

Button NewButton1 = new Button();

NewButton1.setId("Button1");
NewButton1.setText("test");
NewButton1.setPrefWidth(150);
NewButton1.setPrefHeight(50);
NewButton1.setTranslateX(-140);
NewButton1.setTranslateY(0);
NewButton1.setTranslateZ(0);


PerspectiveCamera camera = new PerspectiveCamera(true);  

camera.setFarClip(9000);
camera.setTranslateX(0);  
camera.setTranslateY(0);  
camera.setTranslateZ(-10);  

//setting group and stage   
Group SubRootGroup = new Group();  
SubRootGroup.getChildren().addAll(NewButton1);  


SubScene1 = new SubScene(SubRootGroup, 0, 0, true, SceneAntialiasing.BALANCED);
SubScene1.setFill(Color.GRAY);
SubScene1.heightProperty().bind(TabPane1.heightProperty());
SubScene1.widthProperty().bind(TabPane1.widthProperty());
SubScene1.setCamera(camera); 


TabPane1.getTabs().get(0).setContent(SubScene1);

 TabPane1.setOnKeyPressed(e -> { switch (e.getCode()) { case W:
    SubRootGroup.setTranslateZ(SubRootGroup.getTranslateZ() + 10); break; case S:
    SubRootGroup.setTranslateZ(SubRootGroup.getTranslateZ() - 10); break; case A:
    SubRootGroup.setTranslateX(SubRootGroup.getTranslateX() - 10); break; case D:
    SubRootGroup.setTranslateX(SubRootGroup.getTranslateX() + 10); break; case Q:
    SubRootGroup.setTranslateY(SubRootGroup.getTranslateY() + 10); break; case E:
    SubRootGroup.setTranslateY(SubRootGroup.getTranslateY() - 10); break;
    }});

    SubScene1.setOnMousePressed((MouseEvent e) -> {
         pressed = true;
         newX = e.getSceneX();
         newY = e.getSceneY();
    });

    SubScene1.setOnMouseMoved((MouseEvent e) -> {
        if(pressed){
             oldX = newX;
             oldY = newY;
             newX = e.getSceneX();
             newY = e.getSceneY();
             dx = newX -oldX;
             dy = newY -oldY;

             //SubRootGroup.getRotate().add(new Rotate(45));
             SubRootGroup.setTranslateX(SubRootGroup.getTranslateX() + dx*2);// * sensitivity
             SubRootGroup.setTranslateY(SubRootGroup.getTranslateY() + dy*2);      
        }           
    });

提前感谢您的任何回复,我们将不胜感激,

乔治.

PS。我也是 javafx 新手..

Fxyz3D 有一个 SimpleFPSCamera class 听起来正是您入门所需要的。看一看。

简介:

首先,我要感谢大家帮助我,特别是@Birdasaur 让 SimpleFPSCamera 浮出水面 class [...]

解决我的问题的答案:

第 1 步:将这 2 个 class 添加到您的项目中:

(当然要改包名..)

第 2 步: 设置和编辑“SimpleFPSCamera.java”,如上图中红色和绿色所示:

第 3 步:完成!只是 运行 它:

再次感谢大家帮助我 (:

更新:

Answered - JavaFX: SubScene won't focus inside TabPane when clicked?