1

所以我一直在尝试理解 3D 拾取的概念,但由于我找不到任何视频指南或任何实际会说英语的具体指南,事实证明这非常困难。如果有人对 LWJGL 中的 3D 拾取经验丰富,您能否给我一个示例,逐行解释所有内容的含义。我应该提一下,我正在尝试将光线射出屏幕中心(而不是鼠标所在的位置),并让它检测到一个普通的立方体(以 6 个 QUADS 渲染)。

4

1 回答 1

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.

于 2012-05-30T02:42:40.267 回答