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
不要担心,我不会经常访问,我也应该,哈哈! –