我在玩耍,试图制作一个小型JavaFX应用程序以可视化通过串行端口从基于arduino的板和一些传感器接收的数据。
在添加了一些动态更新的线图之后,我目前正试图通过旋转一个简单的盒形元素来显示从微控制器接收到的侧倾,俯仰和偏航值。
我有一个线程每隔 x ms调用一次函数,该线程将传入的数据存储到ObservableList
到changeListener
中,并调用基于控制器的函数来更新/旋转盒子的方向。
由于角度的计算已经在微控制器上完成,因此我想将盒子旋转到接收到的绝对方向。
据我到目前为止所了解的,我不能简单地从任何先前的方向旋转到新的绝对方向,而只能相对于先前的方向更改方向。
我想到了以下想法,即从倒数第二个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);
在此先感谢您提供任何想法或解决方案。如果您需要更多信息或代码段,请告诉我。
答案 0 :(得分:1)
参考此example,onMouseMoved
处理程序将红色Box
绕鼠标沿 x 和 y 轴旋转动作。当按下 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
保存着滚动,俯仰和偏航值。