我有世界3D坐标[3D_x, 3D_y, 3D_z]
我希望使用Perspective投影投影到屏幕坐标[screen_x, screen_y]
上。我还需要一个摄像头视图,经过一些研究,我理解的是LookAt矩阵。我知道以下数值:
screen = [screen_width, screen_height]
Camera_Coordinates = [cx, cy, cz]
Target_Coordinates = [0,0,0]
最后我有一个3D坐标[3D_x, 3D_y, 3D_z]
,透视投影矩阵,View Matrix
我错过了什么吗?如果不是,我应该以什么顺序将上述数据相乘以获得最终屏幕坐标[screen_x, screen_y]
?
答案 0 :(得分:0)
好像你错过了几个步骤。 实际上,您需要根据相机的旋转和位置计算一个world_to_view矩阵,然后将您的world_to_view矩阵乘以projection_matrix以获取transform_matrix,然后您必须将in_world坐标相乘以获得“在视图中”坐标。 然后你必须使用下面的公式(我使用的那个)将获得的坐标投影到屏幕(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;
我知道我的方法远非完美(我正在寻找一种更好的方法)并且我在这个过程中丢弃了一些矩阵乘法,但我自己发现它并且它正在工作。 ;-) 而且,你不需要一个lookat_matrix,但它可能非常有用(例如它可以用于背面剔除)