gpt4 book ai didi

c++ - 行进立方体实现 - 网格中缺少三角形

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:43:36 26 4
gpt4 key购买 nike

我目前正致力于通过在 OpenGL 中渲染示例数据集来理解和使用 C++ 实现 Marching Cubes 算法。

我一直遇到渲染的网格缺少三角形的问题。我看到几乎一半的三角形缺失,如下所示。

填充三角形和创建四边形是否是解决问题的正确方法,还是我遗漏了一些明显的东西?

我用过的边交表来自以下链接: http://paulbourke.net/geometry/polygonise/

我没有使用 12 位条目的边缘标志数组,而是有 12 个 if 语句(显示了其中的 2 个)。我使用 3D 数组中的索引来根据边缘值 (0-11) 确定 x、y、z 的值

    if ((edge.point1 == 0 && edge.point2 == 1) ||
(edge.point1 == 1 && edge.point2 == 0))
{
p1.x = x; p1.y = y; p1.z = z;
p2.x = x+1; p2.y = y; p2.z = z;
}
else if ((edge.point1 == 1 && edge.point2 == 2) ||
(edge.point1 == 2 && edge.point2 == 1))
{
p1.x = x+1; p1.y = y; p1.z = z;
p2.x = x+1; p2.y = y+1; p2.z = z;
}

此外,插值函数如下。

point interpolate(point p1, point p2, unsigned char isovalue)
{
point p;

unsigned char d1 = getDataValue(p1.x, p1.y, p1.z);
unsigned char d2 = getDataValue(p2.x, p2.y, p2.z);

if (abs(double(isovalue)-double(d1)) == 0)
return(p1);
if (abs(double(isovalue)-double(d2)) == 0)
return(p2);
if (abs(double(d1)-double(d2)) == 0)
return(p1);

double val = double(isovalue - d1) / double(d2 - d1);

p.x = p1.x + val * (p2.x - p1.x);
p.y = p1.y + val * (p2.y - p1.y);
p.z = p1.z + val * (p2.z - p1.z);

return p;
}

Triangle mesh showing missing triangles

Entire rendered data set with the missing triangles issue

更新:

找到示例后,我修改了我的代码并能够渲染所有三角形。现在,我看到一个问题,当我旋转我的对象时,对象开始反转 z 轴并显示对象的内部。

为什么对象会在旋转过程中开始反转 z 值?

Missing triangles issue fixed but there is an inversion problem on z-axis

最佳答案

对于这种类型的空间划分算法,您可能希望使用非常简单的模型(球体或立方体),然后逐步调试您的实现并检查每个阶段的输入/输出。有时忽略一个小细节会搞砸结果。作为一个想法找到以下问题的答案:

  • 您的单元格配置计算正确吗?
  • 您是否在单元格配置和输出三角形之间执行了正确的一对一映射?
  • 你所有的三角形都是顺时针/逆时针排列的吗?

关于c++ - 行进立方体实现 - 网格中缺少三角形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21716090/

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