【问题标题】:Java3D transformation from 3D to current view 2D coordinate从 3D 到当前视图 2D 坐标的 Java3D 转换
【发布时间】:2018-07-30 15:46:12
【问题描述】:

我正在尝试在 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. 有更简单的方法吗???听起来像是很久以前解决的问题...

【问题讨论】:

    标签: java java-3d


    【解决方案1】:

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

    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 变量应该是场景中任何TransformGroup 的变换,应用于显示的 3d 对象。如果您没有任何TransformGroup,那么您可以忽略它。另外,变换不应该倒置,按原样使用即可。

    【讨论】:

    • 非常感谢!像魅力一样工作(甚至解决了我的下一个问题 - 它如何与当前视图之外的对象一起工作 -> 坐标将位于对象最短旋转的正确方向)
    猜你喜欢
    • 1970-01-01
    • 2012-03-06
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    相关资源
    最近更新 更多