1

我认为可以通过将场景图的变换矩阵应用于 z-normal (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();

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

4

2 回答 2

2

如果我做对了,你想要一个垂直于屏幕平面但在世界坐标中的向量?

在这种情况下,您希望INVERT从或取决于屏幕指向的轴进行World -> Screen and do Screen -> World转换。(0,0,-1)(0,0,1)

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

于 2008-09-02T21:05:56.027 回答
0

是的,你没看错我的问题。对不起,我昨天有点困惑。现在,我按照您的建议将问题中的两段代码混合在一起,从而更正了代码:

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);

谢谢你。

于 2008-09-03T06:07:08.893 回答