我在OpenGL中制作游戏。游戏包含一个在3D世界中自由飞行的飞机,必须经过一些特定的区域,就像是通过窗户一样。现在,我正在尝试计算飞机与提到的“窗户”的碰撞。我认为作为第一种方法,为了飞机的轨迹有一个扫掠的AABB,并且每个窗口都有一些AABB,例如如果这些AABB重叠,那么飞机有可能通过它。 但是当我尝试计算AABB时问题就开始了,因为我知道的每个算法都需要知道同一参考系统中两个对象(平面+窗口)的坐标。我的程序将世界描绘成移动的东西,而不是平面,它始终以原点为中心(实际上,在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 */
那么,我怎么能得到“窗户”的坐标? 还是有其他方法来计算碰撞? 我真的需要你的帮助,我会非常感激。 谢谢大家!
答案 0 :(得分:3)
这是一本关于这个主题的好书:http://realtimecollisiondetection.net/
或者,此网站还有很多方法可用于计算不同类型之间的冲突:http://www.realtimerendering.com/intersections.html
答案 1 :(得分:2)
您可以通过位置(3坐标向量)及其大小(3坐标向量)定义AABB,并应用任何AABB碰撞检测算法来解决您的问题。
正如您所指出的,计算必须在相同的坐标系中完成。但是,由于您正在处理AABB(而不是OBB),因此您不需要处理方向(计算AABB以便在旋转后对象将保留在其中,或者在每次对象旋转后重新计算它)。由于“AA”表示“轴对齐”,因此您通常已经处理了一个共同的参考框架(否则它将是OBB)。因此,唯一可能需要的“转换”是翻译。
如果飞机的中心是坐标系的中心,则飞机的AABB位置将为(0,0,0)(或(0,0,-10))。对于你的窗户来说,这取决于你如何定义它们,但是找到它们的中心应该相当容易(使用OpenGL处理products of transformation matrices,找到那些从原始坐标系带到窗口的窗口)。如果您提供更多信息,我们可以为您提供有关如何实现这一目标的更多详细信息。
<强>链接:强>