Перемещение в 3D-пространстве с помощью мыши и клавиатуры [JavaFX3D]

Введение:

Прежде всего, я должен сказать, что я довольно новичок, когда дело доходит до 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..


person Giorgos Xou    schedule 24.07.2019    source источник
comment
Джордж, ваш вопрос слишком широк, можете ли вы отредактировать вопрос, чтобы ограничить его конкретной проблемой с достаточной детализацией, чтобы определить адекватный ответ . Не задавайте сразу несколько разных вопросов. См. страницу "Как задать вопрос", чтобы уточнить этот вопрос. Есть ли конкретная ошибка, которую вы получаете? Несвязанные с соглашениями об именах в Java быстро гуглите, это помогает всем, когда мы все используем один и тот же стиль для именования переменных.   -  person Matt    schedule 24.07.2019
comment
Это как сделать 3D-камеру от первого лица, способную перемещаться внутри 3D-пространства, заполненную такими компонентами, как кнопки, круги и т. д., например, я могу перемещаться с помощью мыши и клавиатуры по оси XYZ. похоже, вам нужно найти учебник, а не то, что вы сталкиваетесь с конкретной проблемой   -  person Matt    schedule 24.07.2019
comment
Последнее, что я собираюсь сказать здесь, это то, что вместо того, чтобы устанавливать переменную при нажатии и сбрасывать при освобождении, вы можете проверить, нажата ли она из события, которое передается таким образом, if(e.isPrimaryButtonDown()){ вместо pressed = true; if(pressed){...} pressed = false; меньше переменных для отслеживания   -  person Matt    schedule 24.07.2019
comment
@Matt Спасибо, что указали, что это было широко, потому что до сих пор я бы ошибался, если бы никто не сказал мне об этом (: , (на данный момент я разделил предыдущую проблему на цель и проблему)   -  person Giorgos Xou    schedule 25.07.2019
comment
звучит так, будто вам нужно найти учебник, а не то, что вы сталкиваетесь с конкретной проблемой, вроде да: /, но я согласен с любой помощью: D   -  person Giorgos Xou    schedule 25.07.2019
comment
... меньше переменных для отслеживания ... Верно, спасибо :D!   -  person Giorgos Xou    schedule 25.07.2019


Ответы (2)


Fxyz3D имеет Класс SimpleFPSCamera, похоже, именно то, что вам нужно для начала работы. Посмотри.

person Birdasaur    schedule 25.07.2019
comment
спасибо за ответ (: ... я видел это раньше и пробовал (я просто забыл упомянуть об этом), было бы идеально, если бы я мог найти способ заставить его работать, потому что кажется, что это не так работа для меня, лол ... это может быть из-за моих плохих знаний в java, как правило, поскольку я новичок в этом языке, и я могу не знать, как правильно его использовать. - person Giorgos Xou; 25.07.2019
comment
добавление этого класса и его подклассов в мой проект, кажется, компилируется без каких-либо ошибок, но это не повлияет на движение или что-то еще, как будто он не работает - person Giorgos Xou; 25.07.2019
comment
Нашел в чем была проблема и теперь все работает!!! (я отмечу это как ответ и обновлю сообщение, так как люди знают, какие изменения нужно внести, чтобы они могли его использовать, спасибо за вашу помощь и за то, что вынесли на поверхность класс SimpleFPSCamera, потому что без вашей публикации я никогда бы не подумал о том, чтобы попытаться найти проблему и использовать ее снова после стольких часов попыток [...]) Спасибо (: ! - person Giorgos Xou; 27.07.2019
comment
Ну что ж. Ваш последующий ответ, в котором отражены детали, в любом случае лучше, чем мой опубликованный ответ! Хорошо сделано. - person Birdasaur; 29.07.2019

Вступление:

Прежде всего, я хочу поблагодарить всех за помощь и особенно @Birdasaur за то, что он вывел на поверхность класс SimpleFPSCamera [...]

Ответ, который сработал для моей проблемы:

Шаг 1. Добавьте эти 2 класса в свой проект:

(конечно изменить имя пакета ..)

Шаг 2. Настройте и отредактируйте файл SimpleFPSCamera.java, как показано на изображении выше, созданном Red & Green :

Редактировать SimpleFPSCamera.java

Шаг 3. Готово! Просто запустите это:

введите здесь описание изображения

И еще раз спасибо всем за помощь (:

Обновлять:

Ответ: JavaFX: SubScene не фокусируется внутри TabPane при нажатии?

person Giorgos Xou    schedule 28.07.2019