我将如何在 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 未初始化。
- oldX 和 oldY 会得到一些值,但不是实际的鼠标位置。
newX 和 newY 得到的是屏幕坐标值,不是场景坐标。
计算deltaX和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);
}
});
希望对您有所帮助。
所以我一直在尝试使用偏航和俯仰的概念,并且尝试通过 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 未初始化。
- oldX 和 oldY 会得到一些值,但不是实际的鼠标位置。
newX 和 newY 得到的是屏幕坐标值,不是场景坐标。
计算deltaX和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);
}
});
希望对您有所帮助。