5

点の頂点(XYZ)と最終的には三角形の面で構成される3Dモデルがあります。OpenGLまたはcamera-view-matrix-projectionを使用して、3Dモデルを2D平面、つまりビューウィンドウまたはm*n解像度の画像に投影できます。

問題は、2D投影計画のピクセルと、元の3Dモデルの対応する頂点(または面)との対応をどのように判断できるかです。

つまり、
2D投影からの特定のピクセルの3Dモデルで最も近い頂点は何ですか?
openGLまたはレイトレーシングの問題を選択しているように聞こえます。しかし、簡単な解決策はありますか?

レイトレーシングのアイデアでは、実際には、視点から光線と交差する最初の頂点/面を見つけることです。誰かが私にいくつかのチュートリアルや例を見せてもらえますか?OpenGLの使用とは独立したアルゴリズムを見つけたいと思います。

4

3 に答える 3

2

通常、OpenGL でのヒット テストはレイトレーシングなしで行われます。代わりに、各プリミティブがレンダリングされるときに、出力のプレーンを使用してプリミティブの一意の ID が格納されます。ヒット テストは、カーソル位置で ID プレーンを読み取るのと同じくらい簡単です。

于 2011-04-04T22:05:07.253 に答える
1

私の(おそらくナイーブな)考えは、頂点の配列を作成し、それらをスクリーンポイントに投影された距離(または速度のために距離の2乗)でソートすることです。リストの最初の項目が最も近くなります。n個の頂点に対してO(n)になりますが、悪くはありません。

編集: 速度とメモリの点で優れています。すべての頂点をループして、ビューポート ピクセルに投影が最も近い (距離の 2 乗) 頂点を追跡します。これは、OpenGL に依存せずに自分でプロジェクションを実行できることを前提としています。

たとえば、擬似コードでは次のようになります。

function findPointFromViewPortXY( pointOnViewport )
  closestPoint = false
  bestDistance = false
  for (each point in points)
    projectedXY     = projectOntoViewport(point)
    distanceSquared = distanceBetween(projectedXY, pointOnViewport)
    if bestDistance==false or distanceSquared<bestDistance
      closestPoint = point
      bestDistance = distanceSquared
  return closestPoint
于 2011-04-04T22:05:53.140 に答える
1

Ben Voigtの答えに加えて:

  1. 選択可能なオブジェクトに対して個別のパスを実行する場合は、読み取る単一のピクセルのみを含むようにビューポートを設定できます。

  2. ジオメトリ シェーダーを使用して三角形 ID をエンコードすることもできます ( gl_PrimitiveID)。

于 2011-04-05T20:58:17.313 に答える