Java3D从3D到当前视图2D坐标的转换
Java3D transformation from 3D to current view 2D coordinate
我正在尝试在 Java3D 中为 3D 场景添加 2D 叠加层,该叠加层的一部分是从 2D 对象到 3D 场景中的相应点画一条线...
搜索了从 3D 到 2D 的转换并阅读了这些线程:
Translate Java 3D coordinates to 2D screen coordinates
3D to 2D projection
来自海象内部的代码:
https://github.com/CAIDA/walrus/blob/master/H3ViewParameters.java
将方法复制到 class 扩展 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);
变得非常奇怪的线,它确实以一种非常合乎逻辑的模式发生变化(当我旋转和倾斜视图时)但与我的预期相差甚远...
问题:
- 评论了m_objectTransform矩阵乘法,因为我
不明白它的用途,知道吗?
- 为什么我需要反转变换矩阵?如果没有反转,结果会更奇怪...
- 有更简单的方法吗???听起来好像很久以前就解决了...
这可以通过使用 getVworldToImagePlate
然后在 Canvas3D
class 中使用 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
变量应该是场景中应用于显示的 3d 对象的任何 TransformGroup
的变换。如果您没有任何 TransformGroup
,那么您可以将其省略。另外,变换不应该反转,直接使用就好了。
我正在尝试在 Java3D 中为 3D 场景添加 2D 叠加层,该叠加层的一部分是从 2D 对象到 3D 场景中的相应点画一条线...
搜索了从 3D 到 2D 的转换并阅读了这些线程:
Translate Java 3D coordinates to 2D screen coordinates
3D to 2D projection
来自海象内部的代码: https://github.com/CAIDA/walrus/blob/master/H3ViewParameters.java
将方法复制到 class 扩展 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);
变得非常奇怪的线,它确实以一种非常合乎逻辑的模式发生变化(当我旋转和倾斜视图时)但与我的预期相差甚远...
问题:
- 评论了m_objectTransform矩阵乘法,因为我 不明白它的用途,知道吗?
- 为什么我需要反转变换矩阵?如果没有反转,结果会更奇怪...
- 有更简单的方法吗???听起来好像很久以前就解决了...
这可以通过使用 getVworldToImagePlate
然后在 Canvas3D
class 中使用 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
变量应该是场景中应用于显示的 3d 对象的任何 TransformGroup
的变换。如果您没有任何 TransformGroup
,那么您可以将其省略。另外,变换不应该反转,直接使用就好了。