【问题标题】:Getting Number of Cubes with Integer Coordinates with Certain Distance from Origin获取距原点一定距离的整数坐标的立方体数量
【发布时间】:2018-02-10 15:19:59
【问题描述】:

我正在为我的游戏开发一个体素系统,该系统使用块的动态加载。为了优化它,我有一个块池和一个渲染距离,我想做的是用适量的块填充池。所以,我需要一种方法来找到那个数量。我尝试了以下方法,但似乎效率很低。

private void CreatePool()
{
    int poolSize = 0;
    for (int x = -m_RenderDistance; x <= m_RenderDistance; x++) {
        for (int y = -m_RenderDistance; y <= m_RenderDistance; y++) {
            for (int z = -m_RenderDistance; z <= m_RenderDistance; z++) {
                if (Position3Int.DistanceFromOrigin(new Position3Int(x, y, z)) <= m_RenderDistance)
                    poolSize++;
            }
        }
    }
}

更正式地说,这个问题涉及找到与原点有一定距离的整数坐标的唯一立方体的数量。

如果您认为有更好的方法来解决这个问题,或者我做错了什么,请告诉我。

谢谢,

昆汀

【问题讨论】:

  • int v = (m_RenderDistance*2)+1; poolSize = v * v * v;?

标签: c# unity3d optimization pool voxel


【解决方案1】:

我认为它的距离检查您认为效率低下?如果您只是计算 Start() 或 Awake(),那么您所拥有的应该不会太糟糕。

如果您对立方结果没问题,Draco18s 解决方案很好。如果你想要一个没有距离检查的球形结果,你可以尝试一些球体体积的公式:4/3*PI*r^3

结帐Bresenham's circle。

这是我拥有的填充 3d Bresenham Circle 的近似算法。它与您已经拥有的非常相似,只是进行了更有效的平方距离检查并进行了细微调整以获得更具吸引力的 bresenham 外观圆):

    public static List<Vector3> Get3DCircleKeys(int radius){
        List<Vector3> keys = new List<Vector3>();

        for(int y=-radius; y<=radius; y++){
            for(int x=-radius; x<=radius; x++){
                for(int z =-radius; z<=radius; z++){
                    // (+ radius*.08f) = minor modification to match Bresenham result
                    if(x*x+y*y+z*z <= radius*radius + radius*.08f){ 
                        keys.Add(new Vector3(x,y,z));
                    }
                }
            }
        }

        return keys;
    }

然而,这将提供与球体体积不同的计数,但通过对其或球体体积计算进行一些调整,它可能足够好,或至少,比实例化一个完整体积的立方体更有效,其中许多体素将超出渲染距离的范围。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    相关资源
    最近更新 更多