【发布时间】:2014-02-12 00:19:10
【问题描述】:
我目前正在通过在 OpenGL 中渲染示例数据集来理解和使用 C++ 实现 Marching Cubes 算法。
我遇到了我渲染的网格缺少三角形的问题。我看到几乎一半的三角形缺失,如下所示。
填充三角形和创建四边形是解决问题的正确方法,还是我遗漏了一些明显的东西?
我使用的边相交表来自以下链接: http://paulbourke.net/geometry/polygonise/
我有 12 个 if 语句(其中显示了 2 个),而不是使用 12 位条目的边缘标志数组。我使用 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;
}
更新:
在找到一个示例后,我修改了我的代码并能够渲染所有三角形。现在,我看到了一个问题,当我旋转对象时,对象开始反转 z 轴并从里到外显示对象。
为什么对象会在旋转过程中开始反转 z 值?
【问题讨论】:
-
它们是丢失了,还是倒退了?您是否尝试过禁用剔除?或者,您的 Element/ElementArray 缓冲区的数据类型是什么?如果您使用 GLushort 并输入超过 64k 的索引,就会开始发生奇怪的事情。
-
不看代码就很难提出任何建议。我想代码很长,所以也许将您的问题发布在 Code Review 上会更好?
-
大卫,谢谢您的回复。我会看看它是否可能是剔除或计算错误。我使用的数据类型是 unsigned char (0-255) - 1 Byte。 3D 阵列的每个单元格最多为 255,数据为 255 宽 x 255 高 x 240 深。而且,彼得,我以前没有尝试过代码审查,但会试一试。感谢您的帮助。
-
@PeterR.Bloomfield:这个问题与代码审查无关。如果问题是关于解决问题,最好在这里。 CR 仅适用于工作代码。
标签: c++ opengl 3d marching-cubes