【发布时间】:2015-06-16 09:55:40
【问题描述】:
我正在实现一个行进立方体算法,通常基于Paul Bourke 的实现,并进行了一些重大调整:
- 标量场的预计算(浮点值)
- 使用 std::map 避免最终列表中的重复顶点
- 顶点存储以在 Ogre3D 中可视化最终网格
基本上我更改了他近 80% 的代码。我生成的网格有一些难看的 terrasses,我不知道如何避免它们。我认为对标量字段使用浮点可以完成这项工作。这是常见的效果吗?如何避免?
计算边上的顶点位置。 (cell.val[p1] 包含给定顶点的标量值):
//if there is an intersection on this edge
if (cell.iEdgeFlags & (1 << iEdge))
{
const int* edge = a2iEdgeConnection[iEdge];
int p1 = edge[0];
int p2 = edge[1];
//find the approx intersection point by linear interpolation between the two edges and the density value
float length = cell.val[p1] / (cell.val[p2] + cell.val[p1]);
asEdgeVertex[iEdge] = cell.p[p1] + length * (cell.p[p2] - cell.p[p1]);
}
你可以在这里找到完整的源代码:https://github.com/DieOptimistin/MarchingCubes 我在这个例子中使用 Ogre3D 作为库。
【问题讨论】:
-
它当然可以变得平滑,但你能把它缩小到几行代码,这些代码给你一个你不同意的像素位置,而不是屏幕截图吗?帮你调试截图真的好难……
-
我编辑了这个问题。由于无需任何额外的平滑算法就可以使其平滑,我假设我在计算顶点位置时存在错误。
-
你有上下文中的原始比较来渲染相同的场景进行比较吗?如果是这样,请发布屏幕截图。我猜想以某种方式缓存的顶点位置被错误地选择了,或者沿着立方体边缘的插值是基于错误的值。
-
你的方法看起来很理智。检查您的线性插值实际上是否正常工作,并检查它在其间插值的值是否符合您的预期。那真的是什么?我假设它是场强的等值面,但场方程是什么?
-
应该长度 = v[p1] / (v[p2] - v[p1]) ?不是+?
标签: c++ ogre3d marching-cubes