从3D坐标转换到2D坐标的问题

Converting from 3D to 2D coordinates question

本文关键字:坐标 问题 2D 转换 3D      更新时间:2023-10-16

我使用OpenGL和c++来制作游戏。现在,我想知道如何将3D坐标转换为2D位置,例如:在3D模型的头部上绘制2D生命值条,或沿着这些线。xD

所以无论如何,我想知道我如何能够设置它可以在SFML中使用。现在我正在查找一些信息,但我不完全理解的方法…

基本上,我问我如何使用SFML将3D opengl坐标转换为屏幕上的2D坐标

我也想知道如何将2D坐标转换回3D,只是这样我也知道。

还有一些示例代码会很好,这样我就能得到一个更好的图片

感谢阅读

-Molma

既然你使用的是OpenGL,我建议gluProject用于从3D映射到2D, gluUnProject用于从2D映射到3D(注意@ChrisF关于不投影的评论)。
虽然我必须承认,我没有真正的OpenGL经验,我只是知道你想要的术语,并在谷歌上搜索它。:)

绘制生命条的通常方法是将一些边界体积(边界框,边界球体等)或锚点转换为屏幕空间。这很简单,因为你只需要遵循OpenGL转换管道:

clip_position = Projection_Matrix * Modelview_Matrix * vertex_position
viewport_position.{x,y} = viewport.{x,y} + viewport.{width,height} * (0.5 + clip_position.{x,y} / 2)
如果不提供额外的信息,2D到3D是不可能的

这篇短文解释了3D坐标的2D投影的基础知识。另一种方法有点困难,因为您只有两个已知值(2D坐标),这不足以准确地提取三个坐标。你能得到的最好结果是一条线(从观看者开始,穿过屏幕上的点,一直延伸到无穷远处)。3D点基本上可以在屏幕上的点后面的任何地方。但是如果你知道一些额外的东西,比如到摄像机的距离或者物体位置的一部分你知道二维坐标,你就可以确定三维坐标。

你只需要做与openGL对坐标相同的转换。这通常包括以下步骤:

  1. 乘以平移矩阵(即摄像机矩阵)。这将把你的3d坐标放到一个面向屏幕的坐标系统中

  2. 乘以投影矩阵。这将把坐标投影到屏幕上

假设你有这些矩阵,因为你必须在openGL中加载它们,但你也可以请求它们