【问题标题】:Best box selection method for a Minecraft cloneMinecraft 克隆的最佳框选择方法
【发布时间】:2011-01-02 22:22:55
【问题描述】:

我正在制作一个 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;
}

它实际上速度惊人,在找到第一个立方体后就停止了。

正如您所见,光线必须经过多个八叉树才能找到立方体(实际上是空间中的一个位置)——屏幕中间有一个十字准线。增量步长越低,选择越精确,但也越慢。

【问题讨论】:

    标签: c++ opengl picking


    【解决方案1】:

    将盒子作为原语使用在内存需求和处理能力方面是多余的。 立方体非常适合渲染,即使在那里,您也可以找到更高级的算法,为您提供更好的最终图像(行进立方体)。 Minecraft 的图形在这个意义上是非常原始的,因为体素渲染已经存在了很长时间并且已经取得了重大进展。

    基本上,您应该利用所有框的间距相等且大小相同的事实。这些被称为体素。 与您所拥有的相比,网格中的光线投射是微不足道的 - 宽相位八叉树和窄相位 AABB 测试。我建议您对体素和体素集碰撞检测/光线投射进行一些研究,因为您会发现这两种算法更容易实现并且运行速度更快。

    【讨论】:

    • 复制粘贴你对谷歌说的话,发现:metanetsoftware.com/technique/tutorialB.html 谢谢,比我的解决方案好多了。
    • 同意.. 我为 xbox 进行了克隆,发现顶点处理密集.. 为我的下一个游戏切换到行进立方体,它运行得更快(作为 javascript 中的 chrome 应用程序!)@987654322 @
    【解决方案2】:

    您不需要内存中的任何显式八叉树结构。所需要的只是字节[,,]。只需在搜索过程中懒惰地生成一个盒子的 8 个孩子(就像国际象棋引擎生成孩子游戏状态一样)。

    【讨论】:

      【解决方案3】:

      我还认为您不必依赖实际的光线投射来确定要渲染的内容。鉴于您处于预定义的网格形式中,您实际上不会受制于“精确可见”的要求。如果您可以跟踪相机的位置并分配某种类型的 NSWE 指南针,您还可以使用它来确定 GPU 缓冲区是否应该考虑顶点数组进行渲染..

      我在这里详细介绍了这个理论https://stackoverflow.com/a/18028366/94167

      但是使用八叉树和相机定位 + 相机距离/边界,您基本上可以知道用户正在看到什么,而无需借助光线跟踪来获得精确信息?如果您可以将三角形合并为较大的三角形以进行渲染,然后使用纹理将大的可见性破坏为立方体形式(轻微手感),则可以显着减少顶点数。然后它只是渲染船体的问题,并通过跟踪你的相机方向是什么以及它在 xyz 的位置,你可以避免让一些不应该显示的面孔,因为它对性能的影响最小(尤其是如果你的着色器自己也做一些工作)

      我正在进一步试验,通过跟踪相机的中心点来确定它的水平焦点,然后你可以确定角度,这反过来又决定了你可能在它所面对的方向上看到的块的深度.

      【讨论】:

        猜你喜欢
        • 2019-01-21
        • 2021-06-29
        • 2012-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-19
        • 1970-01-01
        相关资源
        最近更新 更多