Моя цель — создать простой гизмо перевода и вращения в JavaFX.
Существует множество примеров того, как это можно реализовать на C++ (например, https://nelari.us/post/gizmos/). Но у меня возникли проблемы с переводом этого кода в JavaFX. Главным образом потому, что базовая математика недоступна с помощью JavaFX (например, получение матрицы камеры из PerspectiveCamera). Мне трудно понять, как получить нужные ингредиенты из доступных компонентов JavaFX.
Мой план состоит в том, чтобы реализовать обработчики событий MouseEvent для нажатия и перетаскивания, а затем проецировать движение перетаскивания в соответствующее пространство преобразования (перемещение, вращение). Но я действительно понятия не имею, с чего начать.
Я попытался найти в Интернете какие-либо реализации этого в JavaFX и ничего не нашел.
Я надеюсь, что кто-то в этом сообществе может либо помочь мне перевести руководство по C++, на которое я ссылался в начале этого поста, либо помочь мне добавить правильные обработчики перетаскивания для компонентов Gizmo в код, указанный ниже.
Ниже следует суть, содержащая тестовое приложение простой 3D-сцены, содержащей гизмо и простую реализацию камеры (благодаря https://github.com/FXyz/FXyzLib для этого). Это много строк, но большинство из них связано с классами, используемыми для создания визуальных элементов, действительно важным классом является класс Gizmo.
https://gist.github.com/dosier/f075259da0d87f431a361fd300b7e133 (код слишком длинный для включения здесь)
Редактировать №1 — 8 октября:
Я попытался установить обработчик обнаружения перетаскивания для каждого из конусов перетаскивания, а затем установить обработчик перетаскивания в сцене. Я не хочу, чтобы возвращаемые координаты события перетаскивания зависели от того, пересекался ли узел. Я попробовал код, указанный ниже, но он не дает правильных результатов. Я думаю, что если я разобрался с этим, я могу получить переводную часть функционала gizmo, тогда останется только вращение:
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, который, кажется, предоставляет все ингредиенты, необходимые мне для работы по математике. Но я не совсем понимаю все части математики в учебнике. В любом случае, вот суть моего текущего прогресса: