我的问题与此非常相似,但我无法解决这个问题,因为数学需要有所不同: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;
}
如果有帮助,这是一张图片:
由于
答案 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;