我正在开发一个“基于块的游戏”(类似于 Minecraft),但我被困在一件事上:
假设我可以控制世界上的一切(块和实体),并且每个人都有一个 AABB(位置、大小等)......我怎么能得到我的鼠标正在查看/指向的内容?玩家有一个根据鼠标移动的旋转系统。我只是不知道如何获取我正在查看的块/实体。
您可以使用来自眼睛矢量的光线投射形式。基本上将该射线延伸到您希望能够考虑到的玩家可以触及的距离,然后测试该射线与附近块的交点。具有最近交叉点的街区应该是您关注的街区。
要测试该射线与块的交点,您需要对照块上的每个平面检查它。您可以使用光线平面相交算法来完成此操作。
显然,尽量减少您测试的块和平面的数量以提高性能。
除了 Marc 的变体,您可以使用按颜色选择。为此,您需要执行以下步骤:
1) 关闭光照、混合、多重采样、纹理等。如果您使用着色器,只需设置最简单的着色器程序(它应该准备好,以便您只需要一次glUseProgram
调用),它只转换您的几何体并用指定的颜色渲染它的每个部分。不要关闭 z 缓冲区!
2) 将您的场景渲染到应用了所有变换的屏幕外缓冲区。您想要区分的每个项目都应该有自己的颜色。如果 3 个颜色通道中的每一个都有 8 位,那么您将能够在 2^(3*8)=16777216 个项目中进行选择。
3) 在您感兴趣的点,即在鼠标指针的窗口坐标处,从屏幕外缓冲区中选取颜色值。第一步我们没有关闭z-buffer,所以你会得到鼠标指向的最近物体的颜色。
4) 重置渲染状态(开启多重采样,选择合适的着色器或开启光照等效果)并将场景渲染到窗口缓冲区。
在我看来,这种技术比光线投射更容易实现,因为您只需调整渲染器的状态,而硬件会执行所有艰苦的工作。
当您通过使用平截头体剔除、八叉树、bsp等提高常规渲染的性能时,此技术的性能会自动提高。
有关帧缓冲区对象的更多信息:
关于颜色选择的话题:
我相信您可以在 google 中找到更多关于颜色编码挑选的教程。