【问题标题】:LWJGL 3D pickingLWJGL 3D采摘
【发布时间】:2012-05-30 01:48:49
【问题描述】:

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

【问题讨论】:

    标签: opengl lwjgl picking


    【解决方案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)的检查,以防万一您实际上没有碰到任何物体。

    如有必要,请要求进一步解释。

    【讨论】:

    • 这是一个绝妙的答案!我不敢相信这还没有被批准。
    • 对不起,我已经有一段时间没有遇到堆栈溢出了。已批准:D 非常感谢。
    • 别担心,我也不会经常光顾,哈哈!
    • 这不是真正的采摘,而是首选方法。
    • 这是一个很好的解决方法,适用于给出的问题。尽管如此,它还是使用了额外的内存,并且与正常的渲染过程相冲突。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 2012-12-07
    • 1970-01-01
    相关资源
    最近更新 更多