JavaFX 3D устанавливает вращение в «абсолютное положение» - PullRequest
0 голосов
/ 28 января 2019

Я играю, пытаясь создать небольшое приложение JavaFX для визуализации данных, полученных через последовательный порт от платы на базе Arduino и некоторых датчиков.

После добавления некоторых обновлений LineGraph в режиме реального времени, я сейчас нахожусьпытаясь отобразить значения крена, тангажа и рыскания, полученные от микроконтроллера, вращая простой элемент box.

У меня есть один поток, вызывающий функцию каждые x мс, которая хранитвходящие данные в ObservableList с changeListener и вызывает функцию на основе контроллера для обновления / поворота ориентации блока.

Поскольку вычисление углов уже выполнено на микроконтроллере,Я хотел бы повернуть прямоугольник в соответствии с полученной абсолютной ориентацией.

Из того, что я понимаю, я не могу просто повернуть из любой предыдущей ориентации в новую абсолютную ориентацию, а только изменить ориентацию относительнок предыдущему.

Мне пришла в голову следующая идея просто вычесть последний бросок / шаг / узначения aw из предпоследнего из списка observableList.

Data dataTmp = observableList.get(observableList.size()-2);
Data dataTmp2 = observableList.get(observableList.size()-1);

newRoll = dataTmp2.getRoll() - dataTmp.getRoll();
newPitch = dataTmp2.getPitch() - dataTmp.getPitch();
newYaw = dataTmp2.getYaw() - dataTmp.getYaw();

Platform.runLater(new Runnable() {
    @Override
    public void run() {
        controller.setToPosition(newRoll, newPitch, newYaw);
    }
});

//...

Это работает только в определенной степени.Я все еще хочу повернуть в абсолютную позицию, полученную от микроконтроллера.

Поэтому мой вопрос таков: есть ли способ сбросить ориентацию коробки, например, на 0, 0, 0, откуда я мог быповернуть к моей новой абсолютной ориентации?Просто сняв коробку и добавив новую, ничего не получилось.

group.getChildren().remove(box);
box = new Box(300,50,300);
group.getChildren().add(box);

Заранее благодарим вас за любые идеи или даже решения.Если вам нужна дополнительная информация или фрагменты кода, дайте мне знать.

1 Ответ

0 голосов
/ 29 января 2019

Обращаясь к этому примеру , обработчик onMouseMoved поворачивает красный Box вокруг осей x и y при перемещении мыши.Следующий обработчик onKeyPressed восстанавливает красный Box в исходное положение при нажатии клавиши Z .Каждый обработчик использует метод setAngle() класса Rotate.

scene.setOnKeyPressed(e -> {
    if (e.getCode() == KeyCode.Z) {
        content.rx.setAngle(0);
        content.ry.setAngle(0);
        content.rz.setAngle(0);
    }
});

Аналогично, ваша реализация setToPosition() может вызывать setAngle() для установки нового броска, шага изначения рыскания.

До:

before

После:

after

Более тонко: убедитесь, что вы синхронизируете доступ к любым данным, которые совместно используются вашим потоком сбора данных и потоком приложения JavaFX .Этот пример иллюстрирует Task<Canvas>, тогда как ваше приложение может вместо этого реализовать Task<Point3D>, где Point3D содержит значения крена, тангажа и рыскания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...