10

c++ (vs2008) で openGl を使用した 3D 点群表示の方向性が必要です。テクスチャを使用して 3D 点群表示をしようとしています。各ポイントの x、y、z を表す 3 つの 2D 配列 (それぞれ同じサイズ 1024x512) があります。私は正しい軌道に乗っていると思います

glBegin(GL_POINTS);
for(int i=0; i<1024; i++)
{
   for(int j=0; j<512; j++)
   {
       glVertex3f(x[i][j], y[i][j], z[i][j]);
   }
 }    
}    
glEnd();

これで、バッファ内のすべての頂点が読み込まれます (私はそう思います) が、ここから先に進む方法がわかりません。または、私はここで完全に間違っています。

次に、3D ポイント クラウドとディスプレイでテクスチャとして使用するカラー データ (0 ~ 255 の値) を含む別の 2D 配列 (同じサイズ) を用意します。

4

1 に答える 1

2

点描画コードはそのままで大丈夫です。

(長期的には、これらの点を繰り返し描画する必要がある場合、たとえばユーザーがビューを回転させた場合などにパフォーマンスの問題が発生する可能性があります。3 つの配列のデータを並べ替えて、x、y、z の値が隣り合う 1 つにすることで、より高速な頂点配列/VBO を使用する必要がありますが、今のところ、壊れていない場合は修正しないでください。)

ポイントに色を付けるには、各 glVertex の前に glColor が必要です。OpenGLではglVertexはそれが完全な頂点であることを大まかに意味するため、描画後ではなく、前でなければなりません。データを点群として記述したので、glBegin を GL_POLYGON に変更せず、GL_POINTS のままにします。

OK、1 バイトのカラー インデックス値を持つ別の配列があります。それをグレースケールレベルとして使用することから始めることができます

glColor3ub(color[i][j], color[i][j], color[i][j]);

黒から白に変化するポイントを表示する必要があります。

各ポイントの真の色を取得するには、カラー ルックアップ テーブルが必要です。データに付属するテーブルか、作成中のテーブルがあると思います。次のように宣言する必要があります

static GLfloat ctab[256][3] = {
    1.0, 0.75, 0.33,  /* Color for index #0 */
    ...
};

glVertex の前に使用されます

glColor3fv(ctab[color[i][j]]);

最近 OpenGL が内部で使用しているため、浮動小数点色を使用しました。色の値を 0..255 にしたい場合は、配列を Glubyte に変更し、glColor3fv を glColor3ub に変更します。

お役に立てれば。

于 2012-10-10T23:56:21.927 に答える