Введение:
Прежде всего, я должен сказать, что я довольно новичок, когда дело доходит до 3D-графики в программировании в целом ... поэтому мне нужно больше пояснений о том, как все работает, если это возможно [...]
Проблема:
Моя проблема в том, что я не знаю, как можно использовать мышь вместе с клавиатурой для перемещения, потому что, когда я двигаюсь, как показано на изображении ниже, я всегда застреваю в центре
Цель:
Моя цель — сделать 3D-камеру от первого лица, способную перемещаться внутри 3D-пространства, заполненную такими компонентами, как кнопки, круги и т. д., например, я могу перемещаться с помощью мыши и клавиатуры по оси XYZ.
Прогресс:
Я нашел несколько похожих ссылок, которые мне помогли: >один! но все же я не могу понять, как я могу перемещать мышь и идти к определенной точке (не то, чтобы я не понимал, как работает 3D-проекция в 2Dimentions, а просто как использовать мышь вместе с клавиатурой для перемещения) . На данный момент я застрял, пробуя случайные вещи:
Застрял в центре
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..
if(e.isPrimaryButtonDown()){
вместоpressed = true; if(pressed){...} pressed = false;
меньше переменных для отслеживания - person Matt   schedule 24.07.2019