微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用JavaFX实施3D变换Gizmo

如何解决使用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 举报,一经查实,本站将立刻删除。