我目前正在使用C++实现Marching Cubes算法,并通过在OpenGL中渲染样本数据集来理解它。
我遇到的问题是,我渲染的网格缺少三角形。如下图所示,我看到大约有一半的三角形缺失。
填充三角形并创建四边形是否是解决该问题的正确方法,或者我漏掉了什么明显的东西?
我使用的边交叉表来自以下链接: 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;
}
更新:
在找到一个例子后,我修改了我的代码并能够渲染所有三角形。现在,我发现当我旋转物体时,物体开始倒置z轴,并显示物体内部。
为什么在旋转过程中物体会倒置z值?