在Javafx 8中,如何获得3d节点的正确屏幕位置?

时间:2014-05-26 04:02:28

标签: java 3d javafx javafx-8

我目前正在使用javafx 8进行三维可视化项目。

由于在旋转相机时太多的点很慢,我决定隐藏在场景中没有显示的那些点(在我的情况下为3d框)。

问题是当我调用box.localToScreen(0,0,0)时,坐标似乎有些不正确。例如,有时该点仍然显示在屏幕上,但localToScreen(0,0,0)返回的坐标可能是负数。我错过了什么吗?或者我误用了这种方法?

以下是我的一些代码:

// where I build these boxes from points
for (point p : mergedList) {
    Box pointBox = new Box(length, width, height);

    boxList.add(pointBox);
    pointBox.setTranslateX(p.getX());
    pointBox.setTranslateY(p.getY());
    pointBox.setTranslateZ(p.getZ());

...

// where I call localToScreen to get its coordinates
for (Box b : boxList) {
    Point2D p = b.localToScreen(0, 0, 0); // I have also tried b.localToScreen(b.getTranslateX(), b.getTranslateY(), b.getTranslateZ())
    double x = p.getX(), y = p.getY();
    System.out.println(x);
    System.out.println(y);
}

提前致谢。

2 个答案:

答案 0 :(得分:0)

我也在寻找一些localToScreen和screenToLocal问题的解决方案。 对于您的情况,如果您使用多个监视器,则只有主监视器为您提供正坐标。辅助监视器将为您提供负坐标。 您是否尝试过localToScene而不是localToScreen?

答案 1 :(得分:0)

首先,localToScreen方法通过“调用”对象点转换“提供”点。

使用getLocalToSceneTransform()... 这是您的“世界 - 矩阵”,并保留您所有的转换信息。旋转,缩放等。 你的位置值是{Tx,Ty,Tz},所以将它们插入Point3D,你在SceneSpace中的位置(大多数是准确的)

“隐藏”盒子的另一个脏选项是将它的Cullface设置为Front。这将减少一些性能问题,因为它不需要渲染,但会导致鼠标拣选等其他潜在问题。

我最近发布了一个32k +立方体渲染的视频,我注意到0个性能问题, (视频编码不是很好,一开始模糊) Video

希望它有所帮助!