1
所以我一直在嘗試理解3D採摘的概念,但是因爲我找不到任何視頻指南,也沒有任何實際講英語的具體指南,所以這被證明是非常困難的。如果有人對LWJGL的3D拾取有豐富的經驗,你能否給我一個一行一行解釋一切的例子。我應該提到,我所要做的就是將光線射出屏幕中心(而不是鼠標所在的位置),並讓它檢測到一個普通的立方體(以6個角度呈現)。LWJGL 3D採摘
所以我一直在嘗試理解3D採摘的概念,但是因爲我找不到任何視頻指南,也沒有任何實際講英語的具體指南,所以這被證明是非常困難的。如果有人對LWJGL的3D拾取有豐富的經驗,你能否給我一個一行一行解釋一切的例子。我應該提到,我所要做的就是將光線射出屏幕中心(而不是鼠標所在的位置),並讓它檢測到一個普通的立方體(以6個角度呈現)。LWJGL 3D採摘
儘管我不是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);
}
代碼註釋:
此方法背後的想法是,每個對象都將呈現完全如何用戶看到它,除了所有的模型都是純色的。然後,檢查所請求的屏幕座標的像素顏色,以及顏色索引到哪個模型:這是您的對象!
但是,我建議添加一個檢查背景顏色(或您的glClearColor),以防萬一您沒有實際擊中任何物體。
如有需要,請索取進一步解釋。
這是一個夢幻般的答案!我不敢相信這還沒有被批准。 – Oskar
對不起,我一直在堆棧溢出已經有一段時間了。覈准:非常感謝。 – Tarrjue
不要擔心,我不會經常訪問,我也應該,哈哈! –