【问题标题】:Converting from 3D to 2D coordinates question从 3D 转换为 2D 坐标问题
【发布时间】:2011-04-10 19:13:27
【问题描述】:

我正在使用 OpenGL 和 c++ 来制作游戏。现在,我想知道如何将 3D 坐标转换为 2D 位置,例如:在 3D 模型的头部上绘制 2D 健康条,或者类似的东西。 xD

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

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

我也想知道如何将 2D 坐标转换回 3D,所以我也知道。

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

感谢阅读

-莫尔玛

【问题讨论】:

  • 感谢大家的快速回答:D ima 看看这些并研究这些。再次感谢

标签: c++ opengl 3d sfml


【解决方案1】:

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

【讨论】:

  • 请记住,尽管将 2D 点“取消投影”到 3D 空间中会给您一条线。这将从眼睛,通过该点并到达后剪裁平面。
【解决方案2】:

绘制健康条的常用方法和类似的方法是将一些边界体积(边界框、边界球等)或锚点转换为屏幕空间。这很容易,因为您只需要遵循 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 是不可能的。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      您只需对坐标进行与 openGL 相同的变换即可。这通常涉及以下步骤:

      1. 将其乘以平移矩阵(即相机矩阵)。这会将您的 3d 坐标置于面向屏幕的坐标系中

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

      大概你有这些矩阵,因为你必须在 openGL 中加载它们,但你也可以要求它们。

      【讨论】:

        猜你喜欢
        • 2018-05-25
        • 2012-03-06
        • 1970-01-01
        • 2015-01-01
        • 2015-06-29
        • 2014-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多