LWJGL拣货 - 悬停时选择某个块(gluUnProject())

时间:2016-01-31 19:27:52

标签: lwjgl picking

此视频将显示我目前的情况,目前我无法在线找到任何答案。

https://www.youtube.com/watch?v=O8Mh-1Emoc8&feature=youtu.be

我的代码:

    public Vector3D pickBlock() {
    glDisable(GL_TEXTURE);
    IntBuffer viewport = BufferUtils.createIntBuffer(16);
    FloatBuffer modelview = BufferUtils.createFloatBuffer(16);
    FloatBuffer projection = BufferUtils.createFloatBuffer(16);
    FloatBuffer winZ = BufferUtils.createFloatBuffer(1);
    float winX, winY;
    FloatBuffer position = BufferUtils.createFloatBuffer(3);
    glGetFloat(GL_MODELVIEW_MATRIX, modelview);
    glGetFloat(GL_PROJECTION_MATRIX, projection);
    glGetInteger(GL_VIEWPORT, viewport);
    winX = (float)Display.getWidth() / 2;
    winY = (float)viewport.get(3) - (float)Display.getHeight() / 2;
    glReadPixels(Display.getWidth() / 2, (int)winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, winZ);
    gluUnProject(winX, winY, winZ.get(), modelview, projection, viewport, position);

    glEnable(GL_TEXTURE);
    return new Vector3D(position.get(0) / 2 + 0.5f, position.get(1) / 2 + 0.5f, position.get(2) / 2 + 0.5f);
}

返回" / 2 + 0.5f "因为我对块的偏移是必需的(如果我删除0.5f,偏移将在中心而不是角落)

1 个答案:

答案 0 :(得分:0)

我接触到我说,基于视频的错误来自于你面向正z方向(或任何你的背方向)。我的猜测是你没有考虑到面向的方向,因为我在你的代码中看到你只是在光标位置添加一个0.5F的常量。

因此,当你面向后方时,它会增加0.5,这使得它在墙后面(因为背面是负Z)。一个简单的检查是天气前向矢量的Z分量是正的还是负的,并根据它确定添加到光标的因子,然后对X做同样的事情。

取决于你如何实现你的相机(IE:如果你使用了欧拉角(rx,ry,rz)或者你使用的是四元数/前向矢量),你做检查的方式会有所不同,请随时问我根据您的系统提供的示例(如果需要)。

希望这有帮助!

PS:如果你正在使用角度,你可以检查y轴旋转值的范围并确定你面向的方向,从而加上或减去天气,或者你可以计算前向矢量根据您的角度,然后检查组件的for符号。