屏幕空间的世界空间(透视投影)

时间:2010-08-15 22:28:49

标签: camera 3d

我正在使用3D引擎,需要使用透视投影在3d世界空间和2D屏幕空间之间进行转换,因此我可以在3d空间中的项目上放置2d文本标签。 我已经看到了一些关于这个问题的各种答案的帖子,但他们似乎使用了我没有的组件。

我有一个Camera对象,只能设置它的当前位置和lookat位置,它不能滚动。相机沿着路径移动,某个目标对象可能会出现在其视图中,然后消失。 我只有以下值

  • lookat position
  • 位置
  • 垂直视野
  • Z远
  • Z附近
  • 显然是目标对象的位置。

任何人都可以给我一个只使用这些组件的算法吗?

非常感谢。

2 个答案:

答案 0 :(得分:8)

所有图形引擎都使用矩阵在不同的协调系统之间进行转换。事实上,OpenGL和DirectX使用它们,因为它们是标准方式。

相机通常使用您拥有的参数构建矩阵:

  • 视图矩阵(将世界变换为从摄像机位置看你的位置),它使用了外观位置和摄像机位置(也就是通常为0,1,0的向上矢量)

  • 投影矩阵(从3D坐标转换为2D坐标),它使用fov,near,far和aspect。

您可以在互联网上找到如何构建矩阵的信息,以搜索创建它们的opengl函数:

  • gluLookat创建一个viewmatrix

  • gluPerspective:创建投影矩阵

但是我无法想象一个引擎不允许你得到这些矩阵,因为我可以确保它们在某个地方,引擎正在使用它。

一旦有了这些矩阵,就可以将它们相乘,得到viewprojeciton矩阵。此矩阵从世界坐标转换为屏幕坐标。因此,只需将矩阵与您想知道的位置相乘(以矢量4格式,即4º分量1.0)。

但等等,结果将是齐次坐标,你需要将得到的矢量的X,Y,Z除以W,然后你在Normalized屏幕坐标中有位置(0表示中心,0.5表示右,等)。

从这里可以轻松转换乘以宽度和高度。

祝你好运:)

P.S:当你使用3D时,理解三个矩阵(模型,视图和投影)非常重要,否则你每次都会绊倒。

答案 1 :(得分:0)

  

所以我可以在项目上放置2d文本标签   在3d空间

您是否查过“广告牌”技巧?有时只需要知道正确的搜索词即可。这指的是始终面向相机的多边形(通常是矩形),无论相机的位置或方向如何。