【问题标题】:JavaFX 3D set rotation to "absolute position"JavaFX 3D 将旋转设置为“绝对位置”
【发布时间】:2019-01-28 18:50:57
【问题描述】:

我正在玩,试图制作一个小的 JavaFX 应用程序来可视化通过串行端口从基于 arduino 的板和一些传感器接收到的数据。

在添加了一些实时更新的 LineGraphs 之后,我目前正在尝试通过旋转一个简单的框元素来显示从微控制器接收到的横滚、俯仰和偏航值。

我有一个线程每 x 毫秒调用一个函数,它将传入的数据存储到带有 changeListenerObservableList 中,并调用基于控制器的函数来更新/旋转盒子。

由于角度的计算已经在微控制器上完成,我想将盒子旋转到接收到的绝对方向。

据我目前的了解,我不能简单地从任何以前的方向旋转到新的绝对方向,而只能相对于以前的方向改变方向。

我想出了以下想法,只需从 observableList 的倒数第二个中减去最后一个滚动/俯仰/偏航值。

Data dataTmp = observableList.get(observableList.size()-2);
Data dataTmp2 = observableList.get(observableList.size()-1);

newRoll = dataTmp2.getRoll() - dataTmp.getRoll();
newPitch = dataTmp2.getPitch() - dataTmp.getPitch();
newYaw = dataTmp2.getYaw() - dataTmp.getYaw();

Platform.runLater(new Runnable() {
    @Override
    public void run() {
        controller.setToPosition(newRoll, newPitch, newYaw);
    }
});

//...

这只在一定程度上有效。我还是想旋转到从微控制器接收到的绝对位置。

所以我的问题是:有没有办法将盒子的方向重置为例如0, 0, 0 从哪里我可以旋转到我的新绝对方向?简单地移除盒子并添加一个新盒子根本行不通。

group.getChildren().remove(box);
box = new Box(300,50,300);
group.getChildren().add(box);

提前感谢您提供任何想法甚至解决方案。如果您需要更多信息或代码 sn-ps 让我知道。

【问题讨论】:

  • 这本书JavaFX 9 By Example 正好有一个例子。您可以获取源代码here。无论如何,您还没有发布如何设置框旋转 (controller::setToPosition),因此很难在这方面为您提供帮助。
  • here 看到的示例中,有几个显示三个正交轴,它们转换为Group

标签: javafx rotation


【解决方案1】:

参考这个exampleonMouseMoved 处理程序在鼠标移动时围绕xy 轴旋转红色Box。当按下 Z 键时,以下onKeyPressed 处理程序将红色的Box 恢复到其原始位置。每个处理程序都使用Rotate 类的setAngle() 方法。

scene.setOnKeyPressed(e -> {
    if (e.getCode() == KeyCode.Z) {
        content.rx.setAngle(0);
        content.ry.setAngle(0);
        content.rz.setAngle(0);
    }
});

同样,您的setToPosition() 实现可以调用setAngle() 来建立新的横滚、俯仰和偏航值。

之前:

之后:

更巧妙的是,验证您是否同步了对数据采集线程和JavaFX application thread 之间共享的任何数据的访问。这个example 说明了一个Task<Canvas>,而您的应用程序可能改为实现Task<Point3D>,其中Point3D 保存滚动、俯仰和偏航值。

【讨论】:

    猜你喜欢
    • 2019-07-04
    • 1970-01-01
    • 2011-02-02
    • 2014-12-26
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 2019-07-16
    相关资源
    最近更新 更多