2011-04-04 352 views
5

我有一個由點頂點(XYZ)和最終三角面組成的三維模型。 使用OpenGL或camera-view-matrix-projection我可以將3D模型投影到2D平面,即視圖窗口或m * n分辨率的圖像。將二維投影映射回三維點雲

問題是如何確定2D投影平面中的像素與原始3D模型中對應的頂點(或面)之間的對應關係。

即,
從2D投影中給定像素的3D模型中最接近的頂點是什麼?
聽起來像在openGL或光線跟蹤問題中選擇。有沒有簡單的解決方案?

隨着射線追蹤的想法,它實際上是從一個視點找到與射線相交的第一個頂點/面。有人可以給我看一些教程或例子嗎?我想找到一個獨立於使用OpenGL的算法。

回答

2

在OpenGL中進行命中測試通常沒有光線跟蹤。相反,在渲染每個基元時,輸出中的平面用於存儲基元的唯一ID。命中測試就像在光標位置讀取ID平面一樣簡單。

+0

嗨。你能詳細解釋一下嗎?我有一個3D點雲,每個點都有XYZRGB。在圖像上投影點雲之後,我可以從像素座標中獲得它們的原始(x,y,z)嗎?我需要所有像素的原始位置。 – Ankitp94 2017-02-21 12:16:24

1

我的想法可能是創建一個頂點數組,然後按投影到屏幕點的距離(或距離平方,速度)對它們進行排序。列表中的第一項將最接近。這將是O(n)n頂點,但沒有更壞。

編輯:更好的速度和內存:只需循環遍歷所有頂點並跟蹤投影距離最近(距離平方)的頂點到視口像素。這假定您可以自己執行投影,而不依賴於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 
+0

2D投影中的最近點可能在3D空間中非常遙遠。 – 2011-04-05 01:05:17

+0

@MikeDaniels我不確定你的意思。是的,它可能離飛機上的投影非常遠,但我不相信這一點。據我瞭解,OP有一個3D點雲被渲染到屏幕上,用戶點擊屏幕選擇一個點,OP正在嘗試找到哪個點最接近(屏幕上)到拾取點。 – Phrogz 2011-04-05 01:26:47

+0

對不起,我不明白你的想法。我應該計算和排序什麼樣的距離? – elgcom 2011-04-05 07:14:27

1

除了本·福格特的回答是:

  1. 如果你這樣做了揀選對象單獨的過程,那麼你可以設置視口僅包含您將讀取的單個像素。

  2. 您還可以使用幾何着色器(gl_PrimitiveID)編碼三角形ID。