具有尖锐特征的二元光滑体素

时间:2014-01-26 19:23:00

标签: c++ 3d smooth voxel marching-cubes

我正在尝试创建一个由体素(立方体)组成的3D世界。我试图让世界变得平坦,但我需要保留一些街区" blocky"。 Marching Cubes是一种非常流行的平滑世界的方式,但我没有看到一种非常好的方式来添加" blocky"立方体给他们。

因为我只使用1或0作为密度,所以有一种简单的方法可以简化this视频中的普通块的世界,并保持" blocky"像它们一样的立方体?

我知道许多其他算法允许使用尖锐功能等。但由于我只需要1次传递,因此不需要对网格进行完全平滑处理,是否有更好的方法来平滑,而不是使用众多更复杂的算法之一?

编辑以清除我对光滑和"块状"的含义。立方体:

我认为视频中的网格流畅。使用" blocky"立方体我指的是90度角的立方体。这些平滑的体素不是那么光滑,但它足以达到我的目的。

1 个答案:

答案 0 :(得分:0)

假设1) “平滑”和“方形”部分之间的区别将基于显示/游戏内材料类型。

假设2) 二进制密度的使用是由于实际上并不存储密度,而是以某种可能压缩的方式存储每个点的物质的类型或类型。

假设3) 网格不需要是多方面的。 (允许自行穿越,但不应该有洞)。

结果: 每种材料的单独网格通道。 如果材料是“光滑型”,则在其上运行行进立方体。 如果材料是“块状”型,则在每个点周围放置六个四边形中的一些。

为了保持“坚固性”(表面的连续性,没有孔),平滑的通道必须考虑任何实体占用的空间,而块通道应该只忽略面是块的情况(或连续光滑的材料,但是需要额外的8个点进入支票,这可能比关于一堆废物内部面板更糟糕)。   为了避免重复,仅当8个点中的至少一个是“平滑类型”时才绘制平滑表面,而如果中心点是“块类型”则绘制块通道。

据我所知,3 ^ 8的问题源于在角落处进行单次传递。通过添加第二遍(在边和中心上有点),在行进立方体传递中已经存在的2 ^ 8之外,只需要计算2 ^ 6 + 1个案例。