将三维坐标投影到屏幕坐标

1 投票
1 回答
1362 浏览
提问于 2025-04-18 16:32

我有一些三维世界坐标 [3D_x, 3D_y, 3D_z],我想把它们投影到屏幕坐标 [screen_x, screen_y] 上,这个过程叫做透视投影。为了实现这个,我还需要一个相机视图,经过一些研究我了解到这就是所谓的“LookAt矩阵”。我知道以下这些值:

screen = [screen_width, screen_height]
Camera_Coordinates = [cx, cy, cz]
Target_Coordinates = [0,0,0]

所以最后我有一个三维坐标 [3D_x, 3D_y, 3D_z],透视投影矩阵和视图矩阵。

我是不是漏掉了什么?如果没有,我应该按照什么顺序把这些数据相乘,才能得到最终的屏幕坐标 [screen_x, screen_y]

1 个回答

0

看起来你漏掉了几个步骤。其实你需要先计算一个“世界到视图”的矩阵,这个矩阵是根据你的相机的旋转和位置来算的。然后,把这个“世界到视图”的矩阵和投影矩阵相乘,就能得到变换矩阵。接着,你需要把在世界坐标中的点进行相应的乘法运算,才能得到“在视图中的”坐标。

最后,你还需要用下面的公式把得到的坐标转换到屏幕(2D)空间,这就是我用的方法:

onscreen.x = ((camera.zfar / vertex.in_view.z) * vertex.in_view.x - camera.fov) + screen.width / 2.0;
onscreen.y = ((scene.zfar / vertex.in_view.z) * vertex.in_view.y - camera.fov) + screen.height / 2.0;

我知道我的方法并不完美(我还在寻找更好的方法),而且在这个过程中我省略了一些矩阵的乘法运算,但这是我自己找到的,确实能用。;-)

另外,你并不一定需要一个“观察矩阵”,但它可以非常有用(比如可以用来进行背面剔除)。

撰写回答