我正在制作一个 Minecraft 克隆作为我的第一个 OpenGL 项目,并且卡在框选择部分。进行可靠的盒子选择的最佳方法是什么?
我一直在研究一些 AABB 算法,但没有一个能很好地解释它们究竟做了什么(尤其是经过超级调整的算法),而且我不想使用我不理解的东西。
由于世界由立方体组成,我使用八叉树来消除光线投射计算的一些压力,基本上我唯一需要的是这个函数:
float cube_intersect(Vector ray, Vector origin, Vector min, Vector max)
{
//???
}
射线和原点很容易获得
Vector ray, origin, point_far;
double mx, my, mz;
gluUnProject(viewport[2]/2, viewport[3]/2, 1.0, (double*)modelview, (double*)projection, viewport, &mx, &my, &mz);
point_far = Vector(mx, my, mz);
gluUnProject(viewport[2]/2, viewport[3]/2, 0.0, (double*)modelview, (double*)projection, viewport, &mx, &my, &mz);
origin = Vector(mx, my, mz);
ray = point_far-origin;
min 和 max 是立方体的对角。
考虑到我必须检查的立方体数量,即使使用八叉树,我什至不确定这是正确的方法。
我也尝试过gluProject
,它可以工作,但非常不可靠,并且没有给我立方体的选定面。
编辑
所以这就是我所做的:用射线计算空间中的位置:
float t = 0;
for(int i=0; i<10; i++)
{
Vector p = ray*t+origin;
while(visible octree)
{
if(p inside octree)
{
// then call recursive function until a cube is found
break;
}
octree = octree->next;
}
if(found a cube)
{
break;
}
t += .5;
}
它实际上速度惊人,并在第一个找到的立方体后停止。
如您所见,光线必须经过多个八叉树才能找到立方体(实际上是空间中的一个位置)——屏幕中间有一个十字准线。增量步长越低,选择越精确,但也越慢。