使用JavaFX实施3D变换Gizmo

问题描述

我的目标是在JavaFX中创建一个简单的平移和旋转小控件。

有很多示例可以说明如何在C ++中实现此功能(例如https://nelari.us/post/gizmos/)。但是我在将这段代码转换成JavaFX时遇到了麻烦。主要是因为无法使用JavaFX轻松访问基础数学(例如,从PerspectiveCamera获取相机矩阵)。我很难弄清楚如何从可用的JavaFX组件中获取正确的成分。

我的计划是实现用于按下和拖动的MouseEvent处理程序,然后将拖动运动投影到相应的变换空间(平移,旋转)中。但是我真的不知道从哪里开始。

我尝试在线搜索JavaFX中的任何实现,但找不到任何东西。

我希望这个社区中的某个人可以帮助我翻译我在本文开头链接的C ++教程,或者帮助我在下面的代码中为Gizmo组件添加正确的拖动处理程序。

下面是要点,要点包含一个包含gizmo的简单3D场景的测试应用程序,并带有一个简单的相机实现(这要归功于https://github.com/FXyz/FXyzLib库)。这行很多,但是大多数是由于用于创建视觉元素的类,真正重要的类是Gizmo类。

https://gist.github.com/dosier/f075259da0d87f431a361fd300b7e133代码太长,无法包含在此处)

编辑#1-10月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-10月8日:

因此,我在链接到JavaFX的教程中做了一些努力,以移植代码,我设法在com.sun.javafx程序包中找到了一些(实验性)代码,这些代码似乎提供了我所需要的所有要素。数学。但是我不太了解本教程中的所有数学部分。无论如何,这是我目前的进展要点: https://gist.github.com/dosier/3481e18dfaaf38a36f4e91b525917642

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)