我想将2D屏幕坐标转换为3D世界坐标。我搜索了很多,但没有得到任何令人满意的结果。
注意:我没有使用OpenGL,也没有使用任何其他图形库。
我拥有的数据:
屏幕X
屏幕Y
屏幕高度
屏幕宽度
宽高比
答案 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坐标。