我在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 */
那么,我该如何获得“窗口”的坐标? 或者还有其他方法来计算碰撞? 我真的需要你的帮助,我会非常感激。 谢谢大家!
非常感谢您的回复!因此,如果我理解正确,我需要为每个窗口提取模型矩阵,并获取该点的原点坐标? – WaLi
我试过了,得到了一个窗口的模型矩阵(这是正确的,因为我已经绘制了矩阵的东西)。但是,我怎样才能从该矩阵提取坐标?我认为把这个矩阵乘以向量'[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
首先,我会说使用OOP处理位置/方向信息的类将是一个好主意。 OpenGL只会用来显示结果。正如你所看到的,碰撞检测与显示无关。你不能那样做吗?这可能会让你的生活更轻松。 如果你不能,我想你需要应用反转转换矩阵来“返回”到适当的参考框架。 – BenC