所以我一直在努力理解3D拣选的概念,但由于我找不到任何视频指南,也没有任何实际讲英语的具体指南,事实证明这是非常困难的。如果有人对LWJGL中的3D拾取有很好的经验,你能不能给我一个例子,逐行解释一切意味着什么。我应该提一下,我所做的就是将光线射出屏幕中心(不是鼠标的位置)并让它检测到一个普通的立方体(以6 QUADS渲染)。
答案 0 :(得分: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);
}
代码备注:
这种方法背后的想法是每个对象都将精确呈现用户看到它的方式,除了所有模型都是纯色。然后,检查所请求的屏幕坐标的像素颜色,以及将颜色编入索引的模型:这是您的对象!
但我建议您添加背景颜色(或glClearColor)的检查,以防您实际碰到任何物体。
如有必要,请询问进一步的解释。