我认为可以通过将场景图的变换矩阵应用到 z-法线 (0, 0, 1) 来完成,但它不起作用。我的代码是这样的:

Vector3f toScreenVector = new Vector3f(0, 0, 1);
Transform3D t3d = new Transform3D();
tg.getTransform(t3d); //tg is Transform Group of all objects in a scene
t3d.transform(toScreenVector);

然后我也尝试了这样的事情:

Point3d eyePos = new Point3d();
Point3d mousePos = new Point3d();
canvas.getCenterEyeInImagePlate(eyePos);
canvas.getPixelLocationInImagePlate(new Point2d(Main.WIDTH/2, Main.HEIGHT/2), mousePos); //Main is the class for main window.

Transform3D motion = new Transform3D();
canvas.getImagePlateToVworld(motion);
motion.transform(eyePos);
motion.transform(mousePos);

Vector3d toScreenVector = new Vector3f(eyePos);
toScreenVector.sub(mousePos);
toScreenVector.normalize();

但这仍然无法正常工作。我认为一定有一种简单的方法来创建这样的向量。你知道我的代码有什么问题或者更好的方法吗?

有帮助吗?

解决方案 2

是的,你答对了我的问题。抱歉,我昨天有点困惑。现在我已经按照您的建议并将问题中的两段代码混合在一起更正了代码:

Vector3f toScreenVector = new Vector3f(0, 0, 1);

Transform3D t3d = new Transform3D();
canvas.getImagePlateToVworld(t3d);
t3d.transform(toScreenVector);

tg.getTransform(t3d); //tg is Transform Group of all objects in a scene
t3d.transform(toScreenVector);

谢谢。

其他提示

如果我理解正确,你想要一个垂直于屏幕平面但在世界坐标中的向量?

在这种情况下你想要 INVERT 的转变从 World -> Screen and do Screen -> World(0,0,-1) 或者 (0,0,1) 取决于屏幕指向下方的轴。

由于 ModelView 矩阵只是一个旋转矩阵(忽略齐次变换部分),因此您可以通过旋转部分的转置或简单读取底行来简单地将其拉出 - 因为这会转置到 Z 转置下的坐标列。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top