如何将3D位置转换为屏幕上的2D点?

3
我正在尝试在三维环境中呈现二维文本,但为此我需要能够将一组三维坐标转换为屏幕上的二维点。我的相机具有视图投影矩阵、视野和三维空间中的位置。我要呈现的文本在屏幕上有一个二维点。
以下是我的进展:
public final Vector2f get2DPointFrom3DPosition(Vector3f position) {//position is the point in 3D space that I'm trying to render the text at
    final Vector3f camPos = this.getTransform().getPos();//where Vector3f == (x, y, z), and is a 3D position in space
    final Matrix4f viewProjection = this.getViewProjection();//where Matrix4f == float[][]
    final double fov = this.getFieldOfView();//usually 70.0f
    float X;
    float Y;
    //complicated math that I can't find with google or figure out
    return new Vector2f(X, Y);//where vector2f is a pixel position on the screen
}

如果我错过了类似的问题或者有什么不清楚的地方,我提前向您道歉。我找到了这个问题,但它不是关于Java的,我找不到底层的数学计算:将3D点投影到2D屏幕位置的问题


你可以尝试一下这个教程。它是关于将2D向量转换为3D坐标,但步骤很容易反转。 - javac
1
顶部的图表展示了如何从一个空间到另一个空间 - 你必须沿着逆时针方向跟随箭头。你不需要一个模型矩阵(因为你已经有了3D位置),viewProjection可能包含视图和投影矩阵。是否需要进行透视除法取决于你使用的数学库。然后将其转换为视口空间应该很容易。 - javac
我已经成功地完成了2D到3D的转换以及反向转换,但它们只返回一个值从-1到1的vector3f。我需要的是能够返回实际世界坐标和屏幕点的东西。 - Brian_Entei
你到底想做什么?如果你想渲染某种菜单文本,你可以切换到正交投影,然后渲染文本。或者你想让文本出现在场景中?那么你应该看看广告牌。 - Dawnkeeper
要进行3D到2D的转换,您需要获取ModelViewProjection矩阵并将其提供给3D点。请参见此处 - Dawnkeeper
显示剩余7条评论
1个回答

0
2D_X = 3D_X / Z
2D_Y = 3D_Y / Z

这个计算至少可以在数学上为您指明正确的方向。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接