【问题标题】:Converting a 3D position to a 2D screen position将 3D 位置转换为 2D 屏幕位置
【发布时间】:2013-11-22 12:52:06
【问题描述】:

我正在尝试为现有的电脑游戏创建屏幕覆盖。此覆盖应显示显示 3D 世界中某些位置的图标。现在因为我无法访问我希望能够获取屏幕位置的数据,所以我必须使用以下变量来计算它:

  • 玩家位置 (x,y,z)
  • 相机位置 (x,y,z)
  • 点位置 (x,y,z)
  • 相机角度(FOV)

使用这些变量,我设法获得了相机视图的左右边缘。使用这 2 个变量,我可以获得 0 到 1 之间的点,该点应在 x 轴上显示图标。 (0 在左边缘,1 在右边缘)这似乎工作得很好,但前提是我与 X 或 Z 轴对齐,如下例所示:http://i.imgur.com/OIZWBME.png

问题是,我不知道如何在相机旋转时进行这项工作。我尝试将单独工作的 2 个点与其他变量(如相机-玩家世界旋转和角度)结合起来。

有人对我如何能够完成这项工作有任何想法吗?如果我忘记提供任何信息,请告诉我!

提姆

【问题讨论】:

    标签: math 3d 2d converter


    【解决方案1】:

    在维基百科 (https://en.wikipedia.org/wiki/3D_projection) 和其他在线教程 (http://www.codeproject.com/Articles/2158/A-short-discussion-on-mapping-3D-objects-to-a-2D-d) 上有相当不错的文章。

    本质上,对于这个简单的实例,它归结为在渲染之前旋转虚拟空间中的所有内容。将要绘制的点相对于相机位置移动,使相机成为新的轴点,然后就可以像以前一样绘制了。

    一个简单的自顶向下 ascii-art 示例:

    []< 是相机,abc 是点)

    你已经可以画出什么:

    ^    <-----y------>
    | 
    |            b
    |    []<        a
    x
    |          c
    |
    |
    v
    

    你不能画的东西: (相机移动和旋转)

         <-----y------>
    
    ^         [ ]
    |          ^
    |            b
    x               a
    |       c
    |
    v
    

    因此,您需要将相机的全局位置映射(通常使用矩阵)与其他所有位置的位置,以便您最终得到:

    改造后:

                <---------fake y------>
    
          ^          
          |         a
          |       
     fake |       b 
       x: |   []<
          |             c
          |
          v
    

    您现在可以正常绘制。我不是这方面的专家,但这有助于您入门吗?

    【讨论】:

    • 是的!这绝对可以。我不知道为什么我没有想到它。感谢您的帮助:)
    猜你喜欢
    • 2015-02-09
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    相关资源
    最近更新 更多