LWJGL 3D采摘

时间:2012-05-30 01:48:50

标签: opengl lwjgl picking

所以我一直在努力理解3D拣选的概念,但由于我找不到任何视频指南,也没有任何实际讲英语的具体指南,事实证明这是非常困难的。如果有人对LWJGL中的3D拾取有很好的经验,你能不能给我一个例子,逐行解释一切意味着什么。我应该提一下,我所做的就是将光线射出屏幕中心(不是鼠标的位置)并让它检测到一个普通的立方体(以6 QUADS渲染)。

1 个答案:

答案 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);
}

代码备注:

  • screenX是像素的x位置,screenY是像素的y位置(在屏幕坐标中)
  • orientateCamera()只需调用在场景中定位(和旋转)相机所需的任何glTranslate,glRotate,glMultMatrix等。
  • orientateObject(i)与orientateCamera相同,除了对象&#39; i&#39;在你的场景中
  • 当我计算索引&#39;时,我真的只是撤消我在渲染过程中执行的数学运算以获得索引

这种方法背后的想法是每个对象都将精确呈现用户看到它的方式,除了所有模型都是纯色。然后,检查所请求的屏幕坐标的像素颜色,以及将颜色编入索引的模型:这是您的对象!

但我建议您添加背景颜色(或glClearColor)的检查,以防您实际碰到任何物体。

如有必要,请询问进一步的解释。