从3D到当前视图2D坐标的Java3D转换

时间:2018-07-30 15:46:12

标签: java java-3d

我正在尝试为Java3D中的3D场景添加2D叠加层,该叠加层的一部分是在2D对象到3D场景中的对应点之间绘制一条线...

搜索了从3D到2D的转换并读取了这些线程:

从海象里面的代码

https://github.com/CAIDA/walrus/blob/master/H3ViewParameters.java

将方法复制到扩展Canvas3D的类中:

public Transform3D getObjectToEyeTransform() {
    Point3d m_eye = new Point3d();
    getCenterEyeInImagePlate(m_eye);
    Transform3D m_imageToEye = new Transform3D();
    m_imageToEye.set(new Vector3d(-m_eye.x, -m_eye.y, 0.0));
    Transform3D m_vworldToImage = new Transform3D();
    getVworldToImagePlate(m_vworldToImage);

    Transform3D transform = new Transform3D(m_imageToEye);
    transform.mul(m_vworldToImage);
    //transform.mul(m_objectTransform);
    return transform;
}

,然后在方法postRender的叠加层中,尝试执行以下操作:

Transform3D viewTrans3d = getObjectToEyeTransform();
Vector3d point = new Vector3d(1,1,1);
viewTrans3d.invert();
viewTrans3d.transform(point);
this.getGraphics2D().drawLine(0, 0, (int)point.x, (int)point.y);

得到非常奇怪的线条,它确实以一种非常合乎逻辑的模式(当我旋转和倾斜视图时)发生了变化,但与我的预期相去甚远...

问题:

  1. 评论了m_objectTransform矩阵乘法,因为 不明白它的目的,有什么想法吗?
  2. 为什么需要反转变换矩阵?没有反转的结果甚至更奇怪...
  3. 是否有更简单的方法来实现???听起来像是不久前就解决了...

1 个答案:

答案 0 :(得分:1)

这可以通过使用getVworldToImagePlate类中的getPixelLocationFromImagePlate然后使用Canvas3D来完成。例如:

public Point2d getPosition2d(Point3d point) {
    Transform3D transform = new Transform3D();
    getVworldToImagePlate(transform);
    transform.mul(objectTransform);

    Point3d newPoint = new Point3d(point);
    transform.transform(newPoint);

    Point2d point2d = new Point2d();
    getPixelLocationFromImagePlate(newPoint, point2d);
    return point2d;
}

objectTransform变量应该是应用于显示的3d对象的场景中任何TransformGroup的变换。如果您没有TransformGroup,则可以将其省略。另外,不应反转转换,只需按原样使用即可。