5

クリックした場所の世界座標を既に見つけることができ、これも深度バッファーでチェックします。これには、次のコードが使用されます。

GLint viewport[4];
GLdouble modelview[16];
GLdouble projection[16];
GLfloat winX,winY;
glGetIntegerv(GL_VIEWPORT, viewport);
glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
glGetDoublev(GL_PROJECTION_MATRIX, projection);

// obtain the Z position (not world coordinates but in range 0 - 1)
GLfloat z_cursor;
winX = (float)x_cursor;
winY = (float)viewport[3]-(float)y_cursor;
glReadPixels(winX, winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &z_cursor);

// obtain the world coordinates
GLdouble x, y, z;
gluUnProject(winX, winY, z_cursor, modelview, projection, viewport, &x, &y, &z);

x_cursor と y_cursor がカーソル座標です。

これまでのところ非常に良好で、x、y、z を印刷すると良好なようです。

しかし今...すべてのポリゴン/三角形を含むファイルを解析した後。すべてをopenGL DISPLAY Listsに入れました。したがって、私のプログラムは基本的にリストを呼び出して、それらを翻訳/回転するだけです。すべてのオブジェクトには固有の名前があります。だから私が保持しているのはリストだけで、すべてのオブジェクトのポイント/三角形を保持しているわけではありません

私の質問 :

クリックした場所の世界座標はわかりますが、どのオブジェクトがその位置に一致するかをどのように把握できますか!?

4

4 に答える 4

4

オブジェクト ID だけが必要で、2 倍のオーバードローを許容する場合:

1) 色と深度のバッファをクリアする

2) 色 -> オブジェクト ID マップを維持しながら、すべてのオブジェクトを異なる単色で描画します (ライティングとテクスチャリングを無効にします)。

3) マウスの位置でカラー バッファを読み取り、色を記録し、カラー マップを調べます。

4) 色と深度のバッファをクリアし、通常どおりシーンを再レンダリングします。

于 2011-08-11T15:44:08.650 に答える
1

私はあなたが興味があるかもしれないと思います: http ://www.gpwiki.org/index.php/OpenGL:Tutorials:Picking

于 2011-08-11T15:29:49.127 に答える
0

OpenGL Picking チュートリアルを参照してください。これには、完全に機能する例が含まれています。ただし、カメラに最も近いオブジェクトのみを選択したい場合 (たとえば、上にペイントされたもの) は、コードを改善できるようです。ただし、コードを変更してこの結果を得ることができます。

void list_hits(GLint hits, GLuint *names)
{
    int i; int bestmatch; GLuint bestdistance;
    if (hits < 1) {
      return;
    }
    bestmatch = 0;
    bestdistance = names[bestmatch*4+1]; // min distance to object.
    for (i = 1; i < hits; i++)
    {
        distance = names[i*4+1];
        if (distance < bestdistance) {
           bestmatch = i; bestdistance = distance;
        }
    }
    printf("Hit: %d.\n", bestmatch);
 }

警告: 以前にこれを行ったことがありますが、この特定のコードはテストされていません。

于 2011-08-11T16:45:40.107 に答える
0

目の視点からシーンに光線を投射します。

ベクトル演算を使用して、近平面でのマウス クリックのワールド空間 xyz 位置を計算します。

これがあなたがする必要があることの図です:

ここに画像の説明を入力

アンプロジェクトには逆行列が含まれるため、これはアンプロジェクトよりも効率的です(これは非常にコストがかかります)。

これは、クリックされたピクセルのレイトレーサーのシーンにレイをキャストするために使用するプロセスとまったく同じです。(レイ トレーサーでは、色を取得しています。ここでは、オブジェクトの ID を取得しています)。

于 2012-11-27T01:55:44.160 に答える