Реализация гизмо 3D-преобразования с использованием JavaFX

Моя цель — создать простой гизмо перевода и вращения в 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, который, кажется, предоставляет все ингредиенты, необходимые мне для работы по математике. Но я не совсем понимаю все части математики в учебнике. В любом случае, вот суть моего текущего прогресса:


person Stan van der Bend    schedule 04.10.2020    source источник
comment
Гизмо выглядит хорошо. Однако перетаскивание в 3D — непростая задача. Этот вопрос имеет возможное решение, а также ссылки на другой вопрос с другим подходом.   -  person José Pereda    schedule 05.10.2020
comment
@JoséPeda приветствует, я помню, как наткнулся на этот пост и еще один похожий, он, безусловно, был полезен. В настоящее время я пытаюсь получить одни и те же координаты из результата выбора независимо от того, пересекался ли узел или нет. Я отредактировал свой пост с моей текущей попыткой, но это не дает тех же результатов. Я также попытался заменить localToParent на localToScene.   -  person Stan van der Bend    schedule 08.10.2020