我正在使用3D引擎,需要使用透视投影在3d世界空间和2D屏幕空间之间进行转换,因此我可以在3d空间中的项目上放置2d文本标签。 我已经看到了一些关于这个问题的各种答案的帖子,但他们似乎使用了我没有的组件。
我有一个Camera对象,只能设置它的当前位置和lookat位置,它不能滚动。相机沿着路径移动,某个目标对象可能会出现在其视图中,然后消失。 我只有以下值
任何人都可以给我一个只使用这些组件的算法吗?
非常感谢。
答案 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空间
您是否查过“广告牌”技巧?有时只需要知道正确的搜索词即可。这指的是始终面向相机的多边形(通常是矩形),无论相机的位置或方向如何。