2012-05-30 99 views
1

所以我一直在嘗試理解3D採摘的概念,但是因爲我找不到任何視頻指南,也沒有任何實際講英語的具體指南,所以這被證明是非常困難的。如果有人對LWJGL的3D拾取有豐富的經驗,你能否給我一個一行一行解釋一切的例子。我應該提到,我所要做的就是將光線射出屏幕中心(而不是鼠標所在的位置),並讓它檢測到一個普通的立方體(以6個角度呈現)。LWJGL 3D採摘

回答

1

儘管我不是3D拾取專家,但我之前已經完成了,所以我會盡力解釋。

你提到你想拍攝光線,而不是按鼠標位置;只要該射線平行於屏幕,該方法仍然可以工作,就像隨機屏幕座標一樣。如果不是,而且你真的想射出光線,朝某個方向傾斜,事情會變得更復雜一點,但我不會去(但)。

現在如何處理一些代碼?

Object* picking3D(int screenX, int screenY){ 
    //Disable any lighting or textures 
    glDisable(GL_LIGHTING); 
    glDisable(GL_TEXTURE); 

    //Render Scene 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 
    orientateCamera(); 

    for(int i = 0; i < objectListSize; i++){ 
     GLubyte blue = i%256; 
     GLubyte green = min((int)((float)i/256), 255); 
     GLubyte red = min((int)((float)i/256/256), 255); 
     glColor3ub(red, green, blue); 
     orientateObject(i); 
     renderObject(i); 
    } 

    //Get the pixel 
    GLubyte pixelColors[3]; 
    glReadPixels(screenX, screenY, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, pixelColors); 

    //Calculate index 
    int index = pixelsColors[0]*256*256 + pixelsColors[1]*256 + pixelColors[2]; 

    //Return the object 
    return getObject(index); 
} 

代碼註釋:

  • screenX是該像素的x位置和screenY是像素的y位置(以屏幕座標)
  • orientateCamera()簡單地調用任何glTranslate, glRotate,glMultMatrix等需要在您的場景中定位(並旋轉)相機
  • orientateObject(i)與orientateCamera相同,但場景中的對象'i'除外
  • 當我'計算索引',我真的只是撤消了我在渲染過程中執行的數學計算以獲得索引

此方法背後的想法是,每個對象都將呈現完全如何用戶看到它,除了所有的模型都是純色的。然後,檢查所請求的屏幕座標的像素顏色,以及顏色索引到哪個模型:這是您的對象!

但是,我建議添加一個檢查背景顏色(或您的glClearColor),以防萬一您沒有實際擊中任何物體。

如有需要,請索取進一步解釋。

+0

這是一個夢幻般的答案!我不敢相信這還沒有被批准。 – Oskar

+0

對不起,我一直在堆棧溢出已經有一段時間了。覈准:非常感謝。 – Tarrjue

+0

不要擔心,我不會經常訪問,我也應該,哈哈! –