Opengl 计算AABB碰撞

Opengl 计算AABB碰撞,opengl,collision-detection,Opengl,Collision Detection,我正在用OpenGL做一个游戏。游戏由一架在3D世界上自由飞行的飞机组成,它必须穿过一些特殊的区域,比如穿过窗户。现在,我正在计算飞机与上面提到的“窗户”的碰撞。我认为,作为第一种方法,对飞机的轨迹有一个扫描的AABB,每个窗口有一些AABB,例如,如果这些AABB重叠,那么飞机通过它的潜在情况。 但当我试图计算AABBs时,问题就开始了,因为我知道的每个算法都需要知道同一参考系中两个对象(平面+窗口)的坐标。我的程序绘制世界就像它是运动的物体一样,而不是平面,它总是以原点为中心(实际上,z=-

我正在用OpenGL做一个游戏。游戏由一架在3D世界上自由飞行的飞机组成,它必须穿过一些特殊的区域,比如穿过窗户。现在,我正在计算飞机与上面提到的“窗户”的碰撞。我认为,作为第一种方法,对飞机的轨迹有一个扫描的AABB,每个窗口有一些AABB,例如,如果这些AABB重叠,那么飞机通过它的潜在情况。 但当我试图计算AABBs时,问题就开始了,因为我知道的每个算法都需要知道同一参考系中两个对象(平面+窗口)的坐标。我的程序绘制世界就像它是运动的物体一样,而不是平面,它总是以原点为中心(实际上,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 */
那么,我该如何得到“窗口”的坐标呢? 还是有其他方法来计算碰撞? 我真的需要你的帮助,我会非常感激的。
谢谢大家!

这是一本关于这个主题的好书:


此外,本网站还提供了一系列计算不同类型碰撞的方法:

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

正如你所指出的,计算必须在同一个坐标系下进行。但是,由于您处理的是AABB(而不是OBB),因此不需要处理方向(计算AABB使对象在旋转后仍保留在其中,或者在每次对象旋转后重新计算AABB)。由于“AA”意味着“轴对齐”,您通常已经在处理一个公共参考框架(否则将是OBB)。因此,唯一需要的“转换”是翻译

如果平面的中心是坐标系的中心,则平面的AABB位置将为(0,0,0)(或(0,0,-10))。对于您的窗口,这取决于您如何定义它们,但是应该很容易找到它们的中心(使用您正在处理的OpenGL,找到从原始坐标系到windows坐标系的中心)。如果您提供更多信息,我们可以为您提供有关如何实现这一目标的更多详细信息

链接:


非常感谢您的回复!因此,如果我理解正确,我需要提取每个窗口的modelmatrix,并获取该点原点的坐标?我已经尝试过了,获取窗口的modelmatrix(这是正确的,因为我用该矩阵绘制了一些东西)。但是我如何从矩阵中提取坐标呢?我认为将该矩阵乘以向量
[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首先,我认为使用OOP和类处理位置/方向信息将是一个好主意。OpenGL将仅用于显示结果。如您所见,碰撞检测与显示无关。你不能那样做吗?这可能会让你的生活更轻松。如果你不能,我想你需要应用逆变换矩阵“返回”到正确的参考系。嗯,我想我理解你说的,但我不知道怎么做。如何处理位置/方向信息而不从opengl获取?你的意思是重新考虑整个程序,然后我做了所有的计算,然后用opengl绘制?因为我的程序已经完成了很多工作,重新考虑一下(关于绘制场景)所有的工作都太多了……好吧,您绘制的对象是由您的参数定义的。如何在场景中放置窗口?