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

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

问题描述

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

 公共类主要扩展应用程序{

私人小组;
个私人场景;

私人double oldX;
私人双Y岁;

私人double newX;
私人double newY;

私人Double dx;
私人双倍染料;

私人旋转偏航;
私人旋转球场;
私人双倍xSen = 800;
私人双倍ySen = 600;

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

@Override
public void start(Stage primaryStage)引发异常{
group = new Group();
scene = new Scene(group,800,600);

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

偏航= 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相机=新的PerspectiveCamera(true);
camera.getTransforms()。addAll(偏航,俯仰);
scene.setCamera(camera);

xSen = 1;
ySen = 1;
scene.setOnKeyPressed(event-> {
switch(event.getCode()){
case A:
xSen-= 1;
break;
情况D:
xSen + = 1;
中断;
默认值:
中断;
}

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

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


});
}
}


解决方案

您的


  1. oldX和oldY会获得一些值,但不会获得实际的鼠标位置。

    li>
  2. newX和newY获取屏幕坐标的值,而不是场景的坐标。


  3. 切换新旧计算deltaX和deltaY


  4. 时,将转换值乘以逐步大小。步距越低,立方体移动得越慢。

尝试如下操作:

 布尔按下=假; 

scene.setOnMousePressed((MouseEvent event)-> {
press = 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);
}
});

希望这对您有所帮助。


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;

            ?
        });
    }
}

解决方案

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

  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.

  3. switch new and old when calculating deltaX and deltaY

  4. multiply your translate value with a stepsize. the lower the stepsize the slower the cube moves.

Try something like this:

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

Hope this helped You.

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

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