我有一个浮点向量,这个向量描述了一组三角形,每个三角形用 18 个浮点数描述,前 3 个是第一个顶点,接下来 3 个描述最后一个顶点的法线,依此类推 3 次,直到描述每个三角形。
我在用
std::vector< GLfloat >
存储所有数字,这是我渲染三角形的代码
void Visualizer::draw3dModel()
{
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glNormalPointer(GL_FLOAT, 6 * sizeof(GLfloat), this->vertexes->data() + 3);
glVertexPointer(3, GL_FLOAT, 6 * sizeof(GLfloat), this->vertexes->data());
glPushMatrix();
glScalef(0.05f, 0.05f, 0.05f);
glColor3f(1,1,1);
glDrawArrays(GL_TRIANGLES, 0, this->vertexes->size());
glPopMatrix();
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
}
这段代码确实有效,但在某些时候我用新的三角形重新创建了浮点向量,它可以或多或少是三角形
在创建新三角形之前,我使用此函数清除顶点向量
std::vector< GLfloat >* MarchingCubesThread::getTriangles(float minvalue_scale)
{
this->generateTriangles(minvalue_scale);
for(unsigned int i=0; i < this->num_triangles; i++)
{
for(int j=0; j < 3; j++)
{
this->vertexes.push_back(this->triangles[i].p[j].x);
this->vertexes.push_back(this->triangles[i].p[j].y);
this->vertexes.push_back(this->triangles[i].p[j].z);
this->vertexes.push_back(this->triangles[i].norm.x);
this->vertexes.push_back(this->triangles[i].norm.y);
this->vertexes.push_back(this->triangles[i].norm.z);
}
}
return &(this->vertexes);
}
void MarchingCubesThread::generateTriangles(float minvalue_scale)
{
this->vertexes.clear();
this->triangles.clear();
this->triangles = MarchingCubesDataset(this->dataset->getMaxVal() * minvalue_scale, *(this->dataset), LinearInterp, this->num_triangles);
}
在创建了一组新三角形之后,OpenGL 渲染器很好地更新了网格,但在某些时刻,我得到了一些垃圾三角形和/或上次迭代的三角形,应该通过调用以下命令来清除它们:
this->vertexes.clear();
this->triangles.clear();
这里有一些连续拍摄的截图:
关于这里发生了什么的任何线索?,谢谢
PD:对于完整的源代码,这是 github 上的公共 git 存储库: https ://github.com/joecabezas/MemoriaJoeCabezasCode/tree/visualizer