代码之家  ›  专栏  ›  技术社区  ›  michael

OpenGL绝对坐标

  •  0
  • michael  · 技术社区  · 17 年前

    我对创建游戏非常陌生(并且通常在OpenGL中工作)。我正在尝试做一个二维游戏,但当我试图让我的头周围碰撞检测遇到了一个绊脚石。

    例如,我翻译当前矩阵,再次旋转和翻译,然后画一个点。我怎么知道这一点与我可能画的其他东西有关?

    有没有从当前矩阵计算“绝对”坐标的方法?

    请尽可能简单地解释!谢谢)

    6 回复  |  直到 17 年前
        1
  •  3
  •   Kylotan    17 年前

    OpenGL不是一个游戏引擎,而是一个渲染库。另一方面,碰撞检测是游戏逻辑的一个功能。因此,它不应该与OpenGL有任何关系,OpenGL只是一种在屏幕上放置可视化表示的查看机制——它不了解您的游戏对象,也不包含任何有用的持久数据。如果你确实尝试将一个对象的位置存储在一个矩阵中,并通过转换来移动它,那么你最终可能会受到累积浮点错误的影响,从而导致不可预测的行为。

    您应该做的是手动保持对象的所有位置(以及方向、速度等)。所有对象的移动都应该由您在应用程序代码中执行。当渲染对象时,您读取对象的当前值并将其传递给OpenGL。通常,您为要渲染的每个类型对象获取多边形数据,按对象实例的方向旋转它,按其位置平移它,然后渲染。每帧重复一次。

    如果你对 Model-View-Controller 范例然后你的游戏对象就是模型,OpenGL提供了一个视图。因此,您应该根据需要操纵您的模型,并在需要时从中读取视图。

        2
  •  2
  •   Ryan Kearney    17 年前

    最好只跟踪每一个物体的绝对位置。

        3
  •  1
  •   larryq    17 年前

    令人沮丧,不是吗?所有OpenGL和图形编程初学者都有与您类似的问题。跟踪各种参照系可能很困难。

    我建议的第一件事是从亚马逊或其他零售商那里获得OpenGL超级圣经的副本。它从绝对起点开始,并从那里逐步构建。早期推荐NEHE网站的海报也给出了很好的建议。

    至于您的问题本身,当您创建OpenGL程序时,您可以将“ModelView”矩阵设置为标识(有关详细信息,请参阅《超级圣经》),并且您在glpoint()调用中设置的所有坐标都将相对于该矩阵定义为参照系。如果除了从这里调用glpoint()之外,您不做任何事情,那么您的所有对象都将处于相同的绝对坐标系中。

    当您开始调用gltranslate、glrotate和glloadmatrix时,会变得很棘手,因为这些函数会转换引用框架。当发生这种情况时,所有随后的glpoint()调用都是相对于新的引用框架的。

    (如另一张海报所述,如果要返回到早期的参考框架,必须在转换前将ModelView矩阵保存在堆栈上,然后才能“弹出”堆栈并返回到以前的位置。)

    很难在支持网站上描述这一点,但可以将其视为牙医座椅上的一系列机械臂。他可以把托盘移到你下巴下面,然后以一定角度旋转托盘来托住你的下巴。每一个独立的运动都可以看作是一个转换,在OpenGL中实现为一个矩阵。

    就像我说的,很难在网上恰当地描述这一点。抓起超级圣经书,它会更有意义。祝你好运!

        4
  •  0
  •   gbjbaanb    17 年前

    当我学习OpenGL时,我使用了以下2种资源。

    似乎是 gametutorials 已经付钱了,卖了一张CD,但写得很好,所以可能值得买。

    然而, NeHe 仍然是网上的免费教程,包括 this one for collision detection .

    http://www.gamedev.net/reference/list.asp?categoryid=31

        5
  •  0
  •   Andrew Khosravian    17 年前

    “绝对”是什么意思?

    如果你想要你的点相对于之前的点,你可以反转你刚才做的变换:用第二个平移的负平移,围绕同一轴以相同的数量反向旋转,然后用第一个平移的负平移。这将为您提供从新坐标到旧坐标系的转换。

    或者,您可以使用变换,您必须将旧的点引入新的坐标系。

        6
  •  0
  •   Jon Seigel    17 年前

    在世界坐标中跟踪物体的位置,并直接比较它们。

    要进行显示,请使用相机模型,并对其应用所有转换。

    推荐文章