java - 使用 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
解决方案
推荐阅读
- sql - 连接两个表并获取给定名称的最新记录
- c# - 在 XPather.com 上使用 XML 命名空间的奇怪 XPath 行为?
- angular - 对于 PrimeNG 表,p-table 重置在角度 8 中不起作用
- macos - OSx 如何从两个相互依赖的不同二进制文件创建一个胖二进制文件
- python - 尽管添加了正确的范围,但带有 Python 的 Google Drive API 仍不允许文件下载
- web - 使用 Github Pages 在移动浏览器中查看 PDF
- mysql - 如何从mariadb读取十进制和日期到python?
- python - 为什么会发生这种情况?(django 模型会发生奇怪的事情)
- android - 如何在使用样式的android中切换时进行拇指切换?
- javascript - 如何将反应类转换为反应钩子(firebase 存储)