例如-有这样的代码
//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
scaleX
,scaleY
,scaleZ
rotate
layoutX
,layoutY
translateX
,translateY
,translateZ
最终的边界在概念上将位于Node
父级的坐标空间中,但是节点不必具有父级即可计算这些边界。
请注意,此方法未考虑节点的可见性。计算仅基于此Node
的几何。
此属性将始终具有非null值。
请注意,只要节点的几何形状发生更改,或者发生以下任何更改,就会自动重新计算boundsInParent
:转换ObservableList
,任何平移,布局或比例变量或旋转变量。因此,将节点中的任何这些值绑定到依赖于此变量的表达式是错误的。例如,出于定位节点的目的,形状或translateX
,translateY
的x或y变量绝对不应绑定到boundsInParent
。
您将获得一个Bounds
对象,该对象具有用于查询节点的位置和尺寸的方法,包括用于三维对象的方法。如上述文档所述,“父边界”考虑了应用的转换(即“本地边界+转换”)。当然,这些值都在节点的父级上下文中。如果需要在不同空间中的坐标,则需要对其进行转换-Node
类为此提供了许多方法。
关于java - JavaFX如何获取3D场景中对象的坐标,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59436151/