在LWJGL / OpenGL上“鼠标悬停在对象上”?

时间:2013-01-20 03:30:25

标签: java opengl vector lwjgl collision

我正在开发一种“基于块的游戏”(类似于Minecraft),我陷入了一件事:

假设我控制了世界上的所有东西(块和实体),并且每个人都有AABB(位置,大小等)......我怎么能得到我的鼠标看/指向的东西?根据鼠标移动,播放器具有旋转系统。我只是不知道如何获得我正在看的块/实体。

2 个答案:

答案 0 :(得分:2)

您可以使用眼睛向量中的ray casting形式。基本上将该光线延伸到您希望能够在您的播放器触及范围内考虑的距离,然后测试该光线与附近区域的交叉点。具有最近交点的块应该是您关注的块。

要测试该光线与块的交叉点,您需要针对块上的每个平面进行检查。您可以使用光线平面交叉算法来实现此目的。

显然,尽量减少你测试的块和平面数量,以提高性能。

答案 1 :(得分:2)

除了Marc的变体,您可以使用颜色选择。为此,您需要执行以下步骤:

1)关闭照明,混合,多重采样,纹理等。如果你使用着色器,只需设置最简单的着色器程序(它应该准备好,你只需要一个glUseProgram调用),它只会转换你的几何体并用指定的颜色渲染它的每个部分。不要关闭z缓冲区!

2)将场景渲染到屏幕缓冲区,并应用所有变换。您要区分的每个项目都应该具有自己的颜色。如果你有3个颜色通道的每个8位,那么你将能够在2 ^(3 * 8)= 16777216个项目中进行选择。

3)从您感兴趣的点,即鼠标指针的窗口坐标处,从屏幕外缓冲区中选择颜色值。在第一步,我们没有关闭z缓冲区,因此您将获得鼠标指向的最近对象的颜色。

4)重置渲染状态(打开多重采样,选择正确的着色器或打开灯光和其他效果)并将场景渲染到窗口缓冲区。

在我看来,这种技术比光线投射更容易实现,因为你只需要调整渲染器的状态,硬件就可以完成所有艰苦的工作。

使用frustum cullingoctreebsp等提高常规渲染的效果时,此技术的效果会自动增加。

有关帧缓冲对象的更多信息:

关于颜色挑选的主题:

我相信你可以在谷歌找到更多关于颜色编码拣选的教程。