0

我对创建游戏非常陌生(并且通常在 OpenGL 中工作)。我正在尝试制作 2D 游戏,但在尝试进行碰撞检测时遇到了一个绊脚石。

例如,我平移当前矩阵,旋转并再次平移,然后绘制一个点。我怎么知道那个点相对于我可能画的其他东西在哪里?

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

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

4

6 回答 6

3

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

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

如果您完全熟悉模型-视图-控制器范式,那么您的游戏对象就是模型,而 OpenGL 提供了一个视图。因此,您应该根据需要操作您的模型,并在需要时从中读取视图。

于 2009-09-18T18:14:30.983 回答
2

最好只跟踪每个对象的绝对位置。

于 2009-09-16T13:08:11.480 回答
1

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

我建议的第一件事是从 Amazon 或其他零售商处获取 OpenGL SuperBible 的副本。它从绝对的起点开始,然后从那里逐步构建。推荐 NeHe 网站的早期发帖人也给出了很好的建议。

至于您的问题本身,当您创建 OpenGL 程序时,您可以将“modelview”矩阵设置为标识(有关更多信息,请参阅 SuperBible),并且您在 glPoint() 调用中设置的所有坐标都将相对于该矩阵定义为参考框架。如果您从这里开始除了调用 glPoint() 之外什么都不做,那么您的所有对象都将位于同一个绝对坐标系中。

当您开始调用 glTranslate、glRotate 和 glLoadMatrix 时,它会变得很棘手,因为这些函数会转换参考框架。当这种情况发生时,所有后续 glPoint() 调用都相对于新的参考框架。

(正如另一张海报所提到的,如果你想回到早期的参考框架,你必须在转换之前将模型视图矩阵保存在堆栈上,然后你可以“弹出”堆栈并回到你之前的位置.)

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

就像我说的,很难在网上正确描述这一点。拿起 SuperBible 书,它会更有意义。祝你好运!

于 2009-09-18T18:36:21.667 回答
0

“绝对”是什么意思?

如果您希望您的点相对于先前的点,您可以反转您刚刚所做的变换:通过第二个平移的负值平移,围绕同一轴沿相反方向旋转相同的量,然后通过第一个平移的负值平移翻译。这将为您提供从新坐标到旧系统的转换。

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

于 2009-09-16T15:37:41.197 回答
0

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

看来游戏教程已经付费了,出售了一张 CD,但它们写得很好,所以可能值得购买。

但是,NeHe仍然是网络上的免费教程,包括这个用于碰撞检测的教程。

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

于 2009-09-16T12:51:52.743 回答
0

跟踪世界坐标中的对象位置,并直接比较它们。

要进行显示,请使用相机模型,并将所有变换应用到它。

于 2009-09-18T18:28:39.543 回答