我正在使用OpenGL在网格上实现Catmull-Clark细分。我可以很好地绘制我的网格,我使用顶点数组。
我绘制的数组称为extraVert1 []。
为了实现这个细分,除了用于绘制的顶点之外,我还必须对某些点进行操作。我已经实现了标准的半边数据结构,以便迭代网格的边缘并生成细分所需的边缘点。
问题在于
当我计算边缘点时,我将它们存储到一个顶点数组中,并使相应的面指向该边缘点顶点(每个面指向4个点)。
代码片段如下(edgeAry1 []是半边数组)
edgePoint1[j].x = (edgeAry1[i].end->x + edgeAry1[i].next->next->next->end->x + edgeAry1[i].heFace->center.x + edgeAry1[i].opp->heFace->center.x) / 4.0;
edgePoint1[j].y = (edgeAry1[i].end->y + edgeAry1[i].next->next->next->end->y + edgeAry1[i].heFace->center.y + edgeAry1[i].opp->heFace->center.y) / 4.0;
edgePoint1[j].z = (edgeAry1[i].end->z + edgeAry1[i].next->next->next->end->z + edgeAry1[i].heFace->center.z + edgeAry1[i].opp->heFace->center.z) / 4.0;
faceAry1[i].e = &edgePoint1[j];
j++;
当这个代码执行时(它遍历faceAry1 []中的每个面),我得到了网格中心周围的随机边和三角形,即使我从未对extraVert1 []进行任何更改,我从中绘制的数组
我认为这与我的指针有关,所以我单独注释掉每个操作数,但没有一个改变任何东西。然后我将每行设置为仅4.0。这给了我一个额外的三角形,点[大约](0,0,0),(4,0,0),(4,4,4)。
调试时,我在这部分代码之前和之后都经历了extraVer1 []数组。它保持不变。我的绘制代码是:( extraVert的大小为408)
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, extraVert1);
glDrawArrays(GL_QUADS, 0, 408);
glDisableClientState(GL_VERTEX_ARRAY);
同样,我没有以任何方式修改绘图数组extraVert1 [],所以我完全不知道为什么会发生这种情况。如果有人有兴趣回答,我相信我需要提供更多信息,所以请随时提出要求。在那之前,我将继续努力。
更新
似乎使用足够大的不同数组来存储这些值(在本例中为extraVert2 [])。问题似乎是覆盖内存,但我不确定如何。我的数组声明如下:
face faceAry1[34];
float extraVert1[408];
halfEdge edgeAry1[136];
vertex edgePoint1[136];
vertex extraVert2[1632];
我可以将信息存储在extraVert2 []中,没有任何问题。如果我按照extraVert2 []和edgePoint1 []的顺序翻转,我会遇到和以前一样的问题。有人知道是什么原因造成的吗?
答案 0 :(得分:0)
虽然我不知道3D渲染的工作原理,但随机边缘和三角形通常来自uninitialized variables或dangling pointers。这两个通常是我的程序中意外随机行为的原因。我也认为这与你的指针有关,但由于我不了解3D渲染,它可能与任何3D特定的上下文有关。