例如-有这样的代码

    //create new cylinder
    Cylinder cylinder = new Cylinder(2, 6);
    ...
    //somewhere add transform
    cylinder.getTransforms().add(new Translate(0, -5, 0));
    ...
    //and somewhere i call
    cylinder.setTranslateX(3);
    cylinder.setTranslateY(-2);


结果,圆柱体在场景{3,-7,0}上移动并且其坐标

为了获得实际的协调,我尝试这样的事情:

    double coordY = 0;

    for(Transform t : cylinder.getTransforms() ){
        coordY += t.getTy();
    }

    coordY += cylinder.getTranslateY();


它有效,但这显然不是最合理的方法...
更新1

如正确评论fabian

该方法不考虑是否相对于原点以外的点进行了旋转

例如:

        Rotate rotate = new Rotate();
        rotate.setAngle(60);

        rotate.setPivotX(2);
        rotate.setPivotY(1);
        rotate.setPivotZ(3);

        cylinder.getTransforms().add(rotate);


在这种情况下,结果将不正确


如何获得此圆柱体或任何其他对象(如Shape3d或MeshView)的真实坐标{x,y,z}

谢谢!

最佳答案

查询Node#getBoundsInParent属性:


  此节点的矩形边界,包括其变换。通过采用局部界限(由boundsInParent定义)并应用通过设置以下附加变量创建的变换来计算boundsInLocal
  
  
  transforms ObservableList
  scaleXscaleYscaleZ
  rotate
  layoutXlayoutY
  translateXtranslateYtranslateZ
  
  
  最终的边界在概念上将位于Node父级的坐标空间中,但是节点不必具有父级即可计算这些边界。
  
  请注意,此方法未考虑节点的可见性。计算仅基于此Node的几何。
  
  此属性将始终具有非null值。
  
  请注意,只要节点的几何形状发生更改,或者发生以下任何更改,就会自动重新计算boundsInParent:转换ObservableList,任何平移,布局或比例变量或旋转变量。因此,将节点中的任何这些值绑定到依赖于此变量的表达式是错误的。例如,出于定位节点的目的,形状或translateXtranslateY的x或y变量绝对不应绑定到boundsInParent


您将获得一个Bounds对象,该对象具有用于查询节点的位置和尺寸的方法,包括用于三维对象的方法。如上述文档所述,“父边界”考虑了应用的转换(即“本地边界+转换”)。当然,这些值都在节点的父级上下文中。如果需要在不同空间中的坐标,则需要对其进行转换-Node类为此提供了许多方法。

关于java - JavaFX如何获取3D场景中对象的坐标,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59436151/

10-11 22:21
查看更多