0

我正在尝试为现有的电脑游戏创建屏幕覆盖。此覆盖应显示显示 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 个点与其他变量(如相机-玩家世界旋转和角度)结合起来。

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

蒂姆

4

1 回答 1

1

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

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

一个简单的自上而下的 ascii-art 示例:

([]<是相机, a, b,c是点)

您已经可以绘制的内容:

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

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

     <-----y------>

^         [ ]
|          ^
|            b
x               a
|       c
|
v

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

改造后:

            <---------fake y------>

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

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

于 2013-11-10T20:00:00.123 回答