【问题标题】:How to get the absolute rotation of a Node in JavaFX如何在 JavaFX 中获取节点的绝对旋转
【发布时间】:2014-05-19 15:25:54
【问题描述】:

在 JavaFX 中,Node 的 rotateProperty 为我提供了相对于其父级的旋转度数。有没有办法获得相对于场景或屏幕的绝对旋转度数?

例如,有没有一种方法可以从我可以从 getLocalToSceneTransform() 获得的 Node 的 Transform 对象中计算角度?

【问题讨论】:

  • 嗨,欢迎来到 Stack Overflow。请向我们展示您的尝试并发布您遇到的错误/问题。
  • 到目前为止,我尝试了 Node.getRotate(),它为我提供了与其父级的相对旋转。当前快速而肮脏的解决方案是递归调用 getParent() 并累积 getRotate() 的值,直到我收到 getParent()=null 并相应地到达场景节点的根。但是,我不确定这个解决方案有多强大。由于有像 localToScene() 这样的方法,以绝对方式获取节点的边界,我想知道是否有更优雅的方式。

标签: javafx javafx-8


【解决方案1】:

所以,我自己做了数学计算,就我而言,我要么通过以下方式获得弧度的旋转:

double xx = myNode.getLocalToSceneTransform().getMxx();
double xy = myNode.getLocalToSceneTransform().getMxy();
double angle = Math.atan2(-xy, xx);

double yx = myNode.getLocalToSceneTransform().getMyx();
double yy = myNode.getLocalToSceneTransform().getMyy();
double angle = Math.atan2(yx, yy);

在这两种情况下都可以转换为 360 度:

angle = Math.toDegrees(angle);
angle = angle < 0 ? angle + 360 : angle;

【讨论】:

    【解决方案2】:

    这个问题并没有很好地定义,因为场景图中的不同节点可能围绕不同的轴旋转。

    getLocalToSceneTransform() 方法将返回一个Transform,表示从节点的本地坐标系到Scene 的坐标系的转换。这是一个仿射变换;如果你愿意,你可以提取它相对于 x-y-和 z-轴的 3x4 矩阵表示。

    【讨论】:

    • 感谢 James_D。为了更好地定义它:我只对从Node.getRotate() 获得的二维旋转感兴趣。您对使用来自getLocalToSceneTransform()Transform 对象的建议已经是我在我的问题中提出的一个建议——我仍然不知道如何从该对象获取/计算角度。尝试将其转换为 Rotate 无效。
    • xy 平面中的旋转..so,大概是围绕 z 轴?并且根据Java 8 API Doc“发生旋转的枢轴点是Node.rotate()操作的未转换layoutBounds的中心”。谢谢
    • 你可能需要学习(或思考)一些线性代数和几何。关键是累积的旋转是关于场景图层次结构中每个节点的不同点。所以我什至不清楚累积所有这些旋转甚至会导致旋转。它可能是一些更一般的仿射变换。
    猜你喜欢
    • 1970-01-01
    • 2014-09-19
    • 1970-01-01
    • 2012-06-27
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 2015-01-03
    相关资源
    最近更新 更多