我将如何在 JavaFX 3D 中制作第一人称相机? [英] How would I make a first person camera in JavaFX 3D?

查看:27
本文介绍了我将如何在 JavaFX 3D 中制作第一人称相机?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

So I've been trying to use the yaw and pitch concept, and I've tried adjusting the angle by the change in x and y. Unfortunately, the angle of the camera sometimes goes out of bounds, and I've bothered to add in controls for the angle measurements. What am I doing wrong?

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 没有被初始化.

your newX and newY is not initialized when "setOnMouseMoved" is called.

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

  1. oldX and oldY will get some value but not the actual mouseposition.
  2. newX and newY get the values of screen coordinates not the coordinates of the scene.

计算deltaX和deltaY时切换新旧

switch new and old when calculating deltaX and deltaY

试试这样的:

    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);      
        }           
    });

希望这对您有所帮助.

这篇关于我将如何在 JavaFX 3D 中制作第一人称相机?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆