我对创建游戏非常陌生(并且通常在OpenGL中工作)。我正在尝试制作一款2D游戏,但在尝试探测碰撞时,我遇到了一个绊脚石。
让我们说例如我翻译当前矩阵,旋转并再次翻译然后绘制一个点。我如何知道这一点与我可能绘制的其他内容有何关系?
有没有办法从当前矩阵计算“绝对”坐标?
请尽可能简单解释!谢谢:))
答案 0 :(得分:3)
OpenGL不是游戏引擎,而是渲染库。另一方面,碰撞检测是游戏逻辑的一个功能。因此,它应该与OpenGL无关,OpenGL只是在屏幕上放置可视化表示的查看机制 - 它对游戏对象一无所知,也不对它们持有任何有用的持久数据。如果您尝试将对象的位置存储在矩阵中并通过转换移动它,那么您最终会受到累积浮点错误的影响,从而导致不可预测的行为。
你应该做的是手动保持所有物体的位置(以及方向,速度等)。对象的所有移动都应由您在应用程序代码中执行。当渲染对象时,您会读取它们的当前值并将它们传递给OpenGL。通常,您为要渲染的每个类型对象获取多边形数据,按对象实例的方向旋转它,按其位置进行平移,然后渲染。每帧重复一次。
如果您完全熟悉Model-View-Controller范例,那么您的游戏对象就是模型,OpenGL提供了一个视图。因此,您应该根据需要操作模型,并在需要时从中读取视图。
答案 1 :(得分:2)
最好只跟踪每个物体的绝对位置。
答案 2 :(得分:1)
令人沮丧,不是吗?所有OpenGL和图形编程初学者都有类似于你的问题。跟踪各种参考框架可能很困难。
我建议的第一件事是从亚马逊或其他零售商处获取OpenGL SuperBible的副本。它始于绝对开始,并从那里逐步建立起来。推荐NeHe网站的早期海报也提供了很好的建议。
至于你的问题本身,当你创建一个OpenGL程序时,你可以将“modelview”矩阵设置为标识(更多信息请参见SuperBible),你在glPoint()调用中设置的所有坐标都将相对于该矩阵作为参考框架。如果除了从这里调用glPoint()之外什么都不做,那么所有对象都将在相同的绝对坐标系中。
当你开始调用glTranslate和glRotate以及glLoadMatrix时会变得棘手,因为这些函数会改变引用框架。当发生这种情况时,所有后续的glPoint()调用都相对于该新的引用框架。
(如另一张海报所述,如果你想回到早期的参考框架,你必须在转换之前将模型视图矩阵保存在堆栈上,然后你可以“弹出”堆栈并返回到哪里你以前。)
很难在支持网站上描述这一点,但将其视为牙医椅上的一系列机械臂。他可以将托盘移到下巴下面,然后以一定角度旋转托盘。每个独立运动都可以被视为一个转换,在OpenGL中作为矩阵实现。
就像我说的那样,很难在线描述。抓住SuperBible书,它会更有意义。祝你好运!
答案 3 :(得分:0)
当我学习OpenGL时,我使用了以下2个资源。
似乎gametutorials已经付费出售CD,但它们写得很好所以可能值得购买。
但是,NeHe仍然是网络上的免费教程,包括this one for collision detection。
答案 4 :(得分:0)
“绝对”是什么意思?
如果你想要你的点相对于先前的点你可以反转你刚才所做的变换:平移第二次平移的负值,绕同一轴旋转相反的方向旋转相同的量,然后通过负数转换第一个翻译。这将为您提供从新坐标到旧系统的转换。
或者,您可以使用已有的变换将旧点转换为新的坐标系。
答案 5 :(得分:0)
跟踪世界坐标中的物体位置,并直接比较它们。
要进行显示,请使用相机型号,并将所有转换应用到它。