首页 > 解决方案 > 使用 JavaFX 实现 3D 变换 Gizmo

问题描述

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

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

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

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

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

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

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

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

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

标签: javajavafxjavafx-3dfxyz3d

解决方案


推荐阅读