获取存在于不同块中的邻居块

时间:2017-05-24 16:04:06

标签: c# unity3d procedural-generation voxel

我的问题与此非常相似,但我无法解决这个问题,因为数学需要有所不同:https://gamedev.stackexchange.com/questions/65800/when-storing-voxels-in-chunks-how-do-i-access-them-at-the-world-level

我正在尝试删除块的某些面。如果它在当前块之外,我无法弄清楚如何获得块。

我有一个Chunk类,可以跟踪自己的块。为了测试,我的块是2 x 2,每个块有4个块,都是实心的。

class Chunk {

    private Blocks[,,] blocks;

    public Vector3 position;

    public Chunk(Vector3 world_pos){
        position = world_position;

        // Loops for populating blocks array...
        ...

        // Create mesh

        for(...){
            for(...){
                for(...){
                    Block block = GetBlock(x, y, z + 1); // Chance of this block being outside of this chunk
                }
            }
        }       
    }

    public Block GetBlock(int x, int y, int z){
        ...

        // If block is not in this chunk, use global GetBlock instead
    }

}

我在块中有一个名为“getBlock”的方法,它试图根据x,y和z位置获取一个块。如果索引超出范围,我会调用一个全局“getBlock”来尝试查找其中的块和块。这是我在努力的地方。

这是我的“getChunk”方法(不是我在教程中找到的代码),这似乎很好。

public Chunk getChunk(int x, int y, int z){
    float s = CHUNK_SIZE;
    float d = CHUNK_DEPTH;

    int posx = Mathf.FloorToInt(x / s) * CHUNK_SIZE;
    int posy = Mathf.FloorToInt(y / d) * CHUNK_DEPTH;
    int posz = Mathf.FloorToInt(z / s) * CHUNK_SIZE;

    Chunk chunk = null;

    this.chunks.TryGetValue(new Vector3(posx, posy, posz), out chunk);

    return chunk;
} 

这是我的全球“getBlock”。

public Block getBlock(int x, int y, int z){
    Chunk chunk = this.getChunk(x, y, z);
    Block block;

    if(chunk == null){
        block = Block_Types.AIR;
    } else {

        // Need to work out the block position I want here

        int posx = x;
        int posy = y;
        int posz = z;

        block = chunk.getBlock(posx, posy, posz);

    }

    return block;
}

如果有帮助,这是一张图片:

Picture

由于

1 个答案:

答案 0 :(得分:0)

将全局位置除以CHUNK_SIZE,并将余数作为块的本地位置。 您可以使用modulo(%)运算符:

x = posx % CHUNK_SIZE;
y = posy % CHUNK_SIZE;
z = posz % CHUNK_SIZE;

e.g。

0 / 2 = 0; r = 0;
1 / 2 = 0; r = 1;
2 / 2 = 1; r = 0;
3 / 2 = 1; r = 1;
4 = 2 = 2; r = 0;
5 = 2 = 2; r = 1;