所以我一直在尝试理解 3D 拾取的概念,但由于我找不到任何视频指南或任何实际会说英语的具体指南,事实证明这非常困难。如果有人对 LWJGL 中的 3D 拾取经验丰富,您能否给我一个示例,逐行解释所有内容的含义。我应该提一下,我正在尝试将光线射出屏幕中心(而不是鼠标所在的位置),并让它检测到一个普通的立方体(以 6 个 QUADS 渲染)。
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”除外
- 当我“计算索引”时,我实际上只是撤消在渲染期间执行的数学运算以取回索引
The idea behind this method is that each object will be rendered exactly how the user sees it, except that all of a model is a solid colour. Then, you check the colour of the pixel for the screen coordinate requested, and which ever model the colour is indexed to: that's your object!
I do recommend, however, adding a check for the background color (or your glClearColor), just in case you don't actually hit any objects.
Please ask for further explanation if necessary.