在鼠标下查找对象

时间:2010-09-03 21:19:12

标签: c++ c algorithm 3d

我正在开发一款基本上整个地形都是用AABB盒子制作的游戏。我知道每个盒子的顶点,最小值和最大值。我还设置了这样的相机:

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glRotatef(Camera.rotx,1,0,0);
glRotatef(Camera.roty,0,1,0);
glRotatef(Camera.rotz,0,0,1);

glTranslatef(-Camera.x,-Camera.y,-Camera.z);

我要做的是基本上找到鼠标所在的立方体。我想过给鼠标定位一个向前的方向向量并简单地迭代直到'鼠标子弹'击中某些东西。然而,这包括多次在所有对象中进行交互。有没有办法只通过遍历所有对象一次来完成它?

由于

5 个答案:

答案 0 :(得分:3)

这通常被称为“挑选”This here看起来像一个很好的基于gl的链接

如果是tldr,则可以使用

的基本算法
  1. 按z排序对象(或保持它们按z排序,或深度缓冲技巧等)
  2. 迭代并进行边界测试,当你击中第一个时停止。

答案 1 :(得分:1)

这称为光线跟踪(哎呀,我的错误,它实际上是 Ray Casting )。每个物理引擎都有此功能。你可以看看最简单的一个 - ODE,或者它的衍生物 - 子弹。它们是开源的,因此您可以取出您不需要的东西。它们都有一个方便的数学库,可以处理所有经常需要的矩阵和顶点操作。 他们都有关于如何完成这项任务的演示。

答案 2 :(得分:0)

OpenGL FAQ

中有大量有关OpenGL中命中测试的信息

答案 3 :(得分:0)

我建议你考虑从更大的角度来看待这个问题。

这些方框只是分辨率较低的点。诀窍是降低鼠标的分辨率,以确定它所在的盒子。

您可能必须执行2d到3d转换(反之亦然)。在大多数游戏中,鼠标都存在于二维坐标世界中。鼠标“下方”的东西是3d宇宙的二维投影。

答案 4 :(得分:0)

您想要使用3D拾取算法。这个想法是你从用户在虚拟世界中的位置沿着点击方向绘制一条光线。 This blog post非常清楚地解释了如何实现这样的算法。基本上,您的屏幕坐标需要从屏幕空间转换为虚拟世界空间。有一个网站对所涉及的各种转换有很好的描述,由于我的排名,我无法发布链接。搜索钩子鼠标拣选算法书[我不拥有该网站,我没有创作该文件]。

一旦获得所需方向的光线,就需要执行与现实世界中几何形状相交的测试。由于您完全拥有AABB盒,因此可以使用简单的矢量方程来检查哪些几何体与光线相交。我会说,将你的盒子近似为球体会让生活变得非常简单,因为有一个非常简单的球体射线相交测试。因此,您的光线将通过您从第一步(第一步中绘制的光线)获得的内容来描述,然后您需要使用相交测试。如果你可以使用球体,球体的中心将是你画出盒子的点,直径就是盒子的宽度。

祝你好运!