2011-12-07 63 views
2

我在OpenGL中做游戏。游戏包括一架在3D世界中自由飞行的飞机,它必须经过一些特定的区域,就像它正在通过窗户一样。现在,我试图计算飞机与提到的“窗户”的碰撞。我认为,作为第一种方法,为飞机的轨迹扫描AABB,并为每个窗口配置一些AABB,例如如果这些AABB重叠,则有飞机经过它的潜在情况。 但是,当我尝试计算AABB时,问题就开始了,因为我所知道的每个算法都需要知道同一参考系统中两个对象(平面+窗口)的坐标。我的程序将世界看作是什么在移动,而不是以原点为中心的平面(实际上,在z = -10,因此它被渲染)。真正的问题是如何计算从飞机上看到的每个“窗口”的坐标。这是我用来画场景的代码:计算AABB碰撞

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 */ 

那么,我该如何获得“窗口”的坐标? 或者还有其他方法来计算碰撞? 我真的需要你的帮助,我会非常感激。 谢谢大家!

回答

2

您可以通过一个位置定义AABB( 3坐标矢量)及其大小(3坐标矢量),并应用任何AABB碰撞检测算法来解决您的问题。

正如您所指出的那样,计算必须在相同的坐标系下完成。但是,由于您正在处理AABB(而不是OBB),因此您无需处理方向(AABB是计算出来的,以便旋转后对象将保留在其中,或者在每次旋转对象后重新计算它)。由于“AA”表示“轴对齐”,因此您通常已经在处理一个通用的参照系(否则它将是OBB)。因此,可能需要的唯一“转换”就是翻译。如果你的飞机的中心是你的坐标系的中心,那么你飞机的AABB的位置将是(0,0,0)(或(0,0,-10))。对于你的窗户,这取决于你如何定义这些窗口,但它应该很容易找到他们的中心(用OpenGL处理​​products of transformation matrices,找到把你从原始坐标系统移到窗口的那个)。如果您提供更多信息,我们可以为您提供更多关于如何实现该目标的详细信息。

链接:

+0

非常感谢您的回复!因此,如果我理解正确,我需要为每个窗口提取模型矩阵,并获取该点的原点坐标? – WaLi

+0

我试过了,得到了一个窗口的模型矩阵(这是正确的,因为我已经绘制了矩阵的东西)。但是,我怎样才能从该矩阵提取坐标?我认为把这个矩阵乘以向量'[0; 0; 0; 1]'(代表窗口的原点),它应该给我从原始系统看到的坐标,但它不是那样的。 例如,用这个矩阵,我怎样才能提取从飞机上看到的坐标? '0.967 0.023 0.253 0.000 -0.112 0.933 0.342 0.000 -0.229 -0.360 0.905 0.000 15.392 89。237 -318.202 1.000' – WaLi

+0

首先,我会说使用OOP处理位置/方向信息的类将是一个好主意。 OpenGL只会用来显示结果。正如你所看到的,碰撞检测与显示无关。你不能那样做吗?这可能会让你的生活更轻松。 如果你不能,我想你需要应用反转转换矩阵来“返回”到适当的参考框架。 – BenC