将3D位置转换为2D屏幕位置

时间:2013-11-10 19:37:25

标签: math 3d 2d converter

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

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

使用这些变量,我设法获得摄像机视图的右边缘和左边缘。使用这两个变量,我能够得到0到1之间的点,其中图标应该显示在x轴上。 (0在左边缘,1是右边缘)这似乎工作得很好,但只有当我与X轴或Z轴对齐时,如下例所示:http://i.imgur.com/OIZWBME.png

问题是,我不知道如何在相机旋转时使其工作。我已经尝试将两个单独的点组合在一起,但也与其他变量相结合,比如相机玩家的世界旋转和角度。

有没有人对如何使这项工作有任何想法?如果我忘记提供任何信息,请告诉我!

1 个答案:

答案 0 :(得分: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

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