首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL冲突检测

OpenGL冲突检测
EN

Stack Overflow用户
提问于 2009-05-03 18:52:53
回答 2查看 4.6K关注 0票数 2

我目前正在使用JOGL设计我的第一个FPS游戏。(OpenGL的Java绑定)。

到目前为止,我已经能够生成“world”(一系列立方体)和一个玩家模型。我让玩家和魔方之间的碰撞检测工作得很好。

现在我正试着把枪加进去。我有正确绘制的枪模型,并加载到球员模型。我正在尝试实现的第一把枪是激光枪,它可以对你瞄准的任何物体发射瞬时视线激光。在我实现敌人模型之前,我想让激光和墙壁之间的碰撞检测工作。

我的激光,目前,是由一系列的小立方体绘制的,一个接一个。第一个立方体是在玩家的枪的末端绘制的,然后它从那里连续绘制。这个想法是继续绘制激光的立方体,直到检测到与世界上的立方体发生碰撞。

我知道立方体在世界上的位置。问题是我必须调用glMatrixPush来绘制我的角色模型。然后在此模型视图中绘制激光器。这意味着我失去了我的旧坐标系--所以我在一个坐标系中绘制世界,然后在另一个坐标系中绘制激光。在这个播放器矩阵中,我多次调用glRotate和glTranslate,以便将所有内容与相机旋转的方式同步。然后,通过沿这个新系统的z轴平移来构建激光发生器。

我的问题是,通过所有这些转换,我不再知道我的激光在地图坐标系中的位置,主要是由于涉及相机的旋转。

有没有人知道如何解决这个问题的方法,或者有什么想法?我相信我需要一种方法来将激光的新坐标转换成地图的旧坐标,但我不确定如何撤销对它所做的所有变换。OpenGL可能还提供了一些功能来处理这类我不知道的问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-05-04 22:02:23

在第一个答案中提出的观点是,你不应该一开始就依赖矩阵来定位对象。在你考虑绘制之前,你应该跟踪激光的位置和旋转。然后使用平移和旋转命令将其放在您知道应该放在的位置。

你在试着向后做事情,是的,这确实意味着你必须做矩阵数学,而OpenGL不会跟踪,因为ModelView矩阵是OpenGL唯一跟踪对象位置的东西。OpenGL没有“世界空间”或“相机空间”的概念。只有一个矩阵,所有的输入都被乘以。这非常简单。但在某些情况下,我确实更喜欢DirectX有一个独立的视图矩阵和模型矩阵的方式。

所以,如果你没有矩阵数学就不知道对象的位置,那么我会认为这是一个基本的设计问题。如果你不需要知道对象的位置,那么矩阵变换到你的心内容,但如果你确实需要它的位置,从位置开始。

(与第一个答案所说的差不多,只是用了不同的方式...)

票数 3
EN

Stack Overflow用户

发布于 2009-05-03 19:12:18

你不应该把激光看作是发射它的角色的一个空间子。一旦它被发射,激光就是它自己的实体,所以你应该像下面这样渲染:

代码语言:javascript
复制
glPushMatrix(viewMatrix);
glPushMatrix(playerMatrix);
DrawPlayer();
glPopMatrix();
glPushMatrix(laserMatrix);
DrawLaser();
glPopMatrix();
glPopMatrix();

此外,请确保不要将渲染转换逻辑与游戏逻辑混在一起。应始终存储对象的世界空间位置,以便能够测试交点,而不管当前的OpenGL矩阵堆栈如何。

记住要小心处理空间上的父/子关系。在实践中,它们并不是那么频繁。有关更多信息,请谷歌场景图的问题。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/817719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档