2015-02-06 80 views
1

我試圖實現'raypicker'選擇我的項目中的對象。我不完全理解如何實現這一點,但我從概念上理解它應該如何工作。我一直在努力學習如何做到這一點,但是我發現大多數的教程都讓我頭痛。我目前的代碼是基於我發現的最近的教程之一,here.'雷'創作raypicking不完全工作

經過幾個小時的修訂,我相信我的raypicker的問題實際上是在第一個地方創建射線。如果我用無疑位於三角形區域內的座標替換/硬編碼我的近/遠平面,拾取器可以正確識別它。

我的問題是這樣的:我的光線創作似乎沒有充分考慮我當前的「相機」或視角,因此相機旋轉不會影響我的鼠標所在的位置。 我相信要解決這個問題,我需要類似使用gluUnProject()或類似的東西,但是每當我使用它時,返回的x,y,z座標都會令人難以置信的小,

我當前創建的ray是一團糟。我試圖使用其他人最初提出的方法,但它似乎像我嘗試過的任何方法,它從來沒有與我的選擇器/交叉函數一起工作。

下面是我的射線創作代碼:

void oglWidget::mousePressEvent(QMouseEvent *event) 
{ 

    QVector3D nearP = QVector3D(event->x()+camX, -event->y()-camY, -1.0); 
    QVector3D farP = QVector3D(event->x()+camX, -event->y()-camY, 1.0); 

    int i = -1; 
    for (int x = 0; x < tileCount; x++) 
    { 
     bool rayInter = intersect(nearP, farP, tiles[x]->vertices); 
     if (rayInter == true) 
      i = x; 
    } 
    if (i != -1) 
    { 
     tiles[i]->showSelection(); 
    } 
    else 
    { 
     for (int x = 0; x < tileCount; x++) 
      tiles[x]->hideSelection(); 
    } 
    //tiles[0]->showSelection(); 
} 

要重複,我用來加載了視,型號&投影矩陣,並unproject鼠標座標,但1920×1080的窗口內,所有我得到的是每個鼠標事件的xy & z在-2到2範圍內的值,這就是爲什麼我試圖使用此方法,但此方法不適用於相機旋轉和縮放。

我不想做的像素顏色採摘,因爲誰知道我以後可能需要這種技術,我把在迄今

+0

有人可以告訴我我做錯了什麼嗎?我一直在這個好幾天無處可去!我甚至嘗試過關於鼠標和頂點的投影和非投影的不同組合,但沒有任何工作正常 – Yattabyte 2015-02-06 23:47:42

+0

你知道,你可以通過繪製你的場景到另一個緩衝區來實現一個選擇器,而不是繪製顏色「繪製「對象ID到緩衝區中。爲了找出你點擊的對象,你所要做的就是從緩衝區中讀取對象ID。這是有利的,因爲它將是像素完美的,並且它也將解決頂點着色器中的任何操作,而且無需額外成本。 – 2015-02-07 02:11:00

回答

0

好的,所以這是我的麪包屑痕跡的開始。

我在某種程度上遇到了與矩陣的QT數據類型有關的問題,以及有關矩陣變換的邏輯。

這個問題中的這個特殊問題是由於沒有實際進行任何轉換而產生的。

步驟來解決這個問題是:

  • 轉換鼠標座標到NDC空間(-1到1的範圍內:X /屏幕寬度* 2 - 1,Y - 高/身高* 2 - 1)
  • 抓取我的視圖矩陣的4x4矩陣(可以是在渲染或重新計算時使用的矩陣)
  • 在新矢量中,讓它等於逆視矩陣乘以逆投影矩陣。

爲了打造光線,我必須做到以下幾點:

  • 採取事先計算的數值爲分別相乘的矩陣。這將乘以矢量4(4個點的數組),其中它將保存先前計算出的x和y座標,以及012和+1,並且然後+1。
  • 然後這個載體將整個向量
  • 創建另一個向量4這簡直就像在過去的最後一個席位值進行劃分,但不是-1,把「1」
  • 再次將其除以最後的現貨價值。

現在光線的座標已經在遠近平面上創建,因此它可以與場景中沿着它的任何東西相交。

我打開了一系列問題(因爲我的系列問題存在很大的不確定性),所以我的問題的一部分也與它們重疊。

  • In here,我才知道,我需要把屏幕高度考慮切換爲笛卡爾座標系y軸的原點,因爲窗戶有y軸的左上角開始。此外,檢索矩陣是多餘的,但也是錯誤的,因爲它們從未被宣佈爲「正確」。
  • In here,我得知unProject沒有工作,因爲我試圖使用OpenGL函數來拉模型和查看矩陣,但是我從來沒有真正將它們設置在第一位,因爲我手動構建了矩陣。我解決了這個問題2次:我手動完成了數學計算,並且製作了所有相同數據類型的矩陣(它們是早期的混合數據類型,也導致了問題)。我知道我的操作順序稍微偏離了(需要將矩陣乘以一個矢量,而不是相反),我的近平面需要爲-1,而不是0,並且矢量的最後一個值這將與矩陣(值「W」)需要相乘爲1

現金去誰幫我解決這些問題的人:

1

由於您在構建射線時似乎遇到問題,因此我將如何執行此操作。這尚未直接進行測試。你可以這樣做,確保所有的載體都在同一個空間。如果您使用多個模型矩陣(或其堆棧),則計算需要分別重複進行。

  1. 使用pos = gluUnproject(winx, winy, near, ...)獲取鼠標座標在模型空間近平面上的位置; near報錯glFrustum()gluPerspective()
  2. 原點的光線的值是在模型空間中的攝像機的位置是:rayorig = inv(modelmat) * camera_in_worldspace
  3. 的射線的方向是從1的位置的歸一化矢量。射線來源:raydir = normalize(pos - rayorig)

在鏈接的網站上,他們使用射線的兩個點,他們似乎沒有規範射線方向矢量,所以這是可選的。

+0

每當我使用unproject函數,返回的座標是完全錯誤的。如果我點擊座標(0,-180,0)處的頂點,則光標的鼠標座標變成(-0.66,-2.01,0或1)。這些座標沒有意義,因爲頂點是+ x,而不是負數。另外,什麼是「正常化」?我沒有太多的矢量邏輯經驗 – Yattabyte 2015-02-09 02:41:22