gpt4 book ai didi

c++ - 从立方体数组中删除内部面的最佳方法是什么?

转载 作者:行者123 更新时间:2023-11-30 04:46:09 25 4
gpt4 key购买 nike

我正在尝试使用 opengl 创建一个看起来像 Minecraft 的东西,并且已经到了可以绘制聚集在一起的“ block ”立方体的地步。但是,我似乎找不到从立方体簇(16x16x16 的立方体立方体)中删除所有看不见的面孔的好方法。

我已经为单个立方体创建了基本基础结构(所有面坐标彼此分开),然后复制所有立方体信息并使用 glm::translate 和 drawVertexArrays 绘制它。

例如:背面

float cubeMapTest1[] =
{
// Back face
-0.5f, -0.5, -0.5f, 0.0f, 0.0f, // Bottom-left
0.5f, -0.5f, -0.5f, 1.0f, 0.0f, // bottom-right
0.5f, 0.5f, -0.5f, 1.0f, 1.0f, // top-right
0.5f, 0.5f, -0.5f, 1.0f, 1.0f, // top-right
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f, // top-left
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, // bottom-left
};

//...

unsigned int VBOs[6], VAOs[6];
glGenVertexArrays(6, VAOs);
glGenBuffers(6, VBOs);

glBindVertexArray(VAOs[0]);

glBindBuffer(GL_ARRAY_BUFFER, VBOs[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(cubeMapTest1), cubeMapTest1, GL_STATIC_DRAW);

// position attribute
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
// texture coord attribute
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float)));
glEnableVertexAttribArray(1);

//...

//^^^对所有6张脸重复^^^

//然后创建一个从 0 到 16^3 的值的立方体,以便稍后绘制

std::vector<glm::vec3> cubePositions;
int i = 0;
int chunkSize = 16;
int chunkVolume = chunkSize * chunkSize * chunkSize;

for (size_t j = 0; j < chunkSize; j++)
{
for (size_t k = 0; k < chunkSize; k++)
{
for (size_t h = 0; h < chunkSize; h++)
{
i++;
//order of h j k affect layers
cubePositions.resize(i + 1);
cubePositions[i] = { h, j, k };
}
}
}

//开始while循环

//绘制

//...

有了这个,我应该使用法线来确定要“剔除”哪些内面吗?鉴于我的目标,最好的剔除方法是什么?我知道这很乱而且我的问题有点含糊,但我不知道从哪里开始解决这个问题。稍后我将使用实例化和索引对其进行优化。

最佳答案

算法本身非常简单。对于 block 中的每个立方体,对于立方体的每个面,检查该方向上的相邻立方体(在 block 内。不要打扰基于相邻 block 的剔除)。如果存在相邻的立方体,则剔除该面。

换句话说,您所做的是为特定 block 构建顶点数据数组。对于每个立方体,您根据未剔除该立方体的哪些面,将一定数量的顶点添加到该数组。因此,您检查 6 个相邻的立方体(再次,在同一 block 内),如果那里没有立方体,则为该面添加顶点。

关于c++ - 从立方体数组中删除内部面的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56946125/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com