Реализация гизмо трехмерного преобразования с использованием JavaFX

Моя цель - создать простую гизмо перевода и поворота в JavaFX.

Есть множество примеров того, как это можно реализовать на C++ (например, https://nelari.us/post/gizmos/). Но у меня возникают проблемы с переводом этого кода в JavaFX. В основном потому, что лежащая в основе Math не является легко доступной с помощью JavaFX (например, получение матрицы камеры из PerspectiveCamera). Мне сложно понять, как получить нужные ингредиенты из доступных компонентов JavaFX.

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

Я попытался найти в Интернете любую реализацию этого в JavaFX, но ничего не нашел.

Я надеюсь, что кто-то из этого сообщества может помочь мне в переводе учебника по C++, который я связал в начале этого сообщения, или помочь мне добавить нужные обработчики перетаскивания для компонентов Gizmo в код, указанный ниже.

Ниже следует суть, содержащая тестовое приложение простой 3D-сцены, содержащей гизмо, и с простой реализацией камеры (за это спасибо библиотеке https://github.com/FXyz/FXyzLib). Это много строк, но большинство из них связано с классами, используемыми для создания визуальных элементов, действительно важным классом является класс Gizmo.

https://gist.github.com/dosier/f075259da0d87f431a361fd300b7e133 (код слишком длинный, чтобы включать его сюда)

Редактировать №1 - 8 октября:

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

final PickResult currentPickResult = me.getPickResult();
final Node currentNode = currentPickResult.getIntersectedNode();
final Point3D currentPoint;
if(currentNode != null)
    currentPoint = currentNode.localToParent(currentPickResult.getIntersectedPoint());
else
    currentPoint = currentPickResult.getIntersectedPoint();

Редактировать №2 - 8 октября:

Итак, я приложил некоторые усилия к переносу кода в учебнике, который я связал с JavaFX, мне удалось найти некоторый (экспериментальный) код в пакете com.sun.javafx, который, кажется, предоставляет все ингредиенты, которые мне нужны для работы с математикой. Но я не совсем понимаю все части математики в этом учебнике. В любом случае, вот суть моего текущего прогресса:https://gist.github.com/dosier/3481e18dfaaf38a36f4e91b525917642

0 ответов

Другие вопросы по тегам