2

フロートのベクトルがあります。このベクトルは三角形のセットを記述し、各三角形は 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

4

1 に答える 1

5

glDrawArraysバッファ内のフロートの数ではなく、頂点の数を期待しています。したがって、正しい呼び出しは次のようになります。

glDrawArrays(GL_TRIANGLES, 0, this->vertexes->size() / 6);

6 倍以上の頂点glDrawArraysを描画できるようにすることで、有効なベクター データの終了後にガベージが表示され、前の反復からのデータである場合もありました。

于 2012-07-05T06:10:41.210 に答える