2012-05-30 39 views
1

所以我一直在尝试理解3D采摘的概念,但是因为我找不到任何视频指南,也没有任何实际讲英语的具体指南,所以这被证明是非常困难的。如果有人对LWJGL的3D拾取有丰富的经验,你能否给我一个一行一行解释一切的例子。我应该提到,我所要做的就是将光线射出屏幕中心(而不是鼠标所在的位置),并让它检测到一个普通的立方体(以6个角度呈现)。LWJGL 3D采摘

回答

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'除外
  • 当我'计算索引',我真的只是撤消了我在渲染过程中执行的数学计算以获得索引

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

但是,我建议添加一个检查背景颜色(或您的glClearColor),以防万一您没有实际击中任何物体。

如有需要,请索取进一步解释。

+0

这是一个梦幻般的答案!我不敢相信这还没有被批准。 – Oskar

+0

对不起,我一直在堆栈溢出已经有一段时间了。核准:非常感谢。 – Tarrjue

+0

不要担心,我不会经常访问,我也应该,哈哈! –