【发布时间】:2012-05-30 01:48:49
【问题描述】:
所以我一直在尝试理解 3D 拾取的概念,但由于我找不到任何视频指南或任何实际会说英语的具体指南,事实证明这非常困难。如果有人对 LWJGL 中的 3D 拾取经验丰富,您能否给我一个示例,逐行解释所有内容的含义。我应该提一下,我正在尝试将光线射出屏幕中心(而不是鼠标所在的位置)并让它检测到一个普通的立方体(以 6 个 QUADS 渲染)。
【问题讨论】:
所以我一直在尝试理解 3D 拾取的概念,但由于我找不到任何视频指南或任何实际会说英语的具体指南,事实证明这非常困难。如果有人对 LWJGL 中的 3D 拾取经验丰富,您能否给我一个示例,逐行解释所有内容的含义。我应该提一下,我正在尝试将光线射出屏幕中心(而不是鼠标所在的位置)并让它检测到一个普通的立方体(以 6 个 QUADS 渲染)。
【问题讨论】:
虽然我不是 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)的检查,以防万一您实际上没有碰到任何物体。
如有必要,请要求进一步解释。
【讨论】: