我正在用OpenGL做一个游戏。这个游戏由一架在3D世界上自由飞行的飞机组成,它必须通过一些特定的区域,比如穿过窗户。现在,我正在尝试计算飞机与上面提到的“窗口”的碰撞。我认为作为第一种方法,对飞机的轨迹有一个扫描的AABB,对于每个窗口都有一些AABB,比如如果这些AABB重叠,就会有飞机穿过它的可能情况。但当我试图计算AABB时,问题就开始了,因为我所知道的每个算法都需要知道同一参考系中两个对象(plane+window)的坐标。我的程序绘制世界就好像它是在移动的东西,而不是平面,它总是以原点为中心(实际上,在z=-10处,所以它被渲染了)。真正的问题是如何计算从平面上看的每个“窗口”的坐标。这是我用来绘制场景的代码:
glLoadIdentity();
//these are the rotations of the plane of the ground
glRotatef(RotHorizont, 0.0f, 0.0f, 1.0f);
glRotatef(-directionX, 1.0f, 0.0f, 0.0f);
glRotatef(-directionY, 0, 1.0f, 0);
//and these are the movement of the plane
//(the multiplication by 0.0174532925f is to convert the angles to radians
Tx -= (float)Math.sin(directionY * 0.0174532925f) * velocity;
Tz -= (float)Math.cos(directionY * 0.0174532925f) * velocity;
Ty -= (float)Math.sin(directionX * 0.0174532925f) * velocity;
glTranslatef(-Tx, Ty, -Tz);
/*
here I draw the ground and the windows
*/
....
//and now I draw the plane
gl.glLoadIdentity();
gl.glTranslatef(0.0f, 0.0f, -10.0f);
/* draw the plane */那么,我怎么才能得到“窗口”的坐标呢?或者有没有其他方法来计算碰撞?我真的需要你的帮助,我会非常感激的。谢谢大家!
发布于 2011-12-07 23:55:45
您可以通过位置(3坐标矢量)及其大小(3坐标矢量)定义AABB,并应用任何AABB碰撞检测算法来解决您的问题。
正如您所指出的,计算必须在相同的坐标系中完成。但是,由于您处理的是AABB (而不是OBB),因此不需要处理方向(要么计算AABB,以便对象在旋转后仍保留在其中,要么在每次对象旋转后重新计算它)。因为"AA“的意思是”轴对齐“,所以你通常已经在处理一个共同的参照系(否则就是OBBs)。因此,唯一需要的“转换”就是翻译。
如果平面的中心是坐标系的中心,则平面的AABB位置将为(0,0,0) (或(0,0,-10))。对于你的窗口,这取决于你如何定义它们,但是找到它们的中心应该是相当容易的(使用OpenGL,你要处理的是products of transformation matrices,找到那些将你从原始坐标系带到窗口的坐标系)。如果您提供更多信息,我们可以为您提供有关如何实现此目标的更多详细信息。
链接:
发布于 2011-12-07 23:10:12
这是一本关于这个主题的非常好的书:http://realtimecollisiondetection.net/
或者,这个站点也有一个很好的方法集合,用于计算不同类型之间的碰撞:http://www.realtimerendering.com/intersections.html
https://stackoverflow.com/questions/8417410
复制相似问题