将屏幕2D转换为世界3D坐标

时间:2015-07-24 15:01:08

标签: c++

我想将2D屏幕坐标转换为3D世界坐标。我搜索了很多,但没有得到任何令人满意的结果。

注意:我没有使用OpenGL,也没有使用任何其他图形库。

我拥有的数据:

屏幕X

屏幕Y

屏幕高度

屏幕宽度

宽高比

1 个答案:

答案 0 :(得分:1)

如果你有Camera world Matrix和Projection Matrix,这很简单。

如果你没有世界矩阵,你可以根据它的位置和轮换来计算它。

worldMatrix = Translate(x, y, z) * RotateZ(z_angle) * RotateY(y_angle) * RotateX(x_angle);

其中translate返回4x4平移矩阵,Rotate返回给定轴周围的4x4旋转矩阵。

投影矩阵可以从纵横比,视场角以及近平面和远平面计算。

This blog对如何计算投影矩阵有很好的解释。

您可以通过执行以下操作取消投影屏幕坐标:

mat = worldMatrix * inverse(ProjectionMatrix)
dir = transpose(mat) * <x_screen, y_screen, 0.5, 1>

dir /= mat[3] + mat[7] + mat[11] + mat[15]
dir -= camera.position

您的光线将从dir方向指向相机。

这应该有用,但它不是一个超级具体的例子,说明如何做到这一点。

基本上您只需要执行以下步骤:

calculate camera's worldMatrix
calculate camera's projection matrix
multiply worldMatrix with inverse projection matrix.

create a point <Screen_X_Value, Screen_Y_Value, SOME_POSITIVE_Z_VALUE, 1>
apply this "inverse" projection to your point.
then subtract the cameras position form this point.

生成的矢量是摄像机的方向。沿该光线的任何点都是与您的2D屏幕坐标对应的3D坐标。