我将如何在 JavaFX 3D 中制作第一人称相机?

How would I make a first person camera in JavaFX 3D?

所以我一直在尝试使用偏航和俯仰的概念,并且尝试通过 x 和 y 的变化来调整角度。不幸的是,相机的角度有时会超出范围,我费心为角度测量添加控件。我做错了什么?

public class Main extends Application {

    private Group group;
    private Scene scene;

    private double oldX;
    private double oldY;

    private double newX;
    private double newY;

    private double dx;
    private double dy;

    private Rotate yaw;
    private Rotate pitch;
    private double xSen = 800;
    private double ySen = 600;

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        group = new Group();
        scene = new Scene(group, 800, 600);

        primaryStage.setScene(scene);
        primaryStage.show();

        yaw = new Rotate(0, Rotate.Y_AXIS);
        pitch = new Rotate(0, Rotate.X_AXIS);

        Box box = new Box(5, 5, 5);
        box.setMaterial(new PhongMaterial(Color.BLUE));
        box.setTranslateZ(40);

        group.getChildren().add(box);

        PerspectiveCamera camera = new PerspectiveCamera(true);
        camera.getTransforms().addAll(yaw, pitch);
        scene.setCamera(camera);

        xSen = 1;
        ySen = 1;
        scene.setOnKeyPressed(event -> {
            switch (event.getCode()) {
                case A:
                    xSen -= 1;
                    break;
                case D:
                    xSen += 1;
                    break;
                default:
                    break;
            }

            System.out.println(xSen + " " + ySen);
        });

        scene.setOnMouseMoved(event -> {
            oldX = newX;
            oldY = newY;
            newX = event.getX();
            newY = event.getY();
            dx = oldX - newX;
            dy = oldY - newY;

            ?
        });
    }
}

调用 "setOnMouseMoved" 时,您的 newX 和 newY 未初始化。

  1. oldX 和 oldY 会得到一些值,但不是实际的鼠标位置。
  2. newX 和 newY 得到的是屏幕坐标值,不是场景坐标。

  3. 计算deltaX和deltaY时切换新旧

  4. 将您的翻译值乘以步长。步长越小立方体移动越慢。

尝试这样的事情:

    boolean pressed = false;  

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

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

             camera.setTranslateX(camera.getTranslateX() - dx*0.1);
             camera.setTranslateY(camera.getTranslateY() - dy*0.1);      
        }           
    });

希望对您有所帮助。