LWJGL 采摘 - Select 悬停时的特定块( gluUnProject() )

LWJGL Picking - Select Certain Block When Hovering ( gluUnProject() )

这个视频会展示我目前的情况,我目前在网上找不到任何答案。

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

它 returns "/ 2 + 0.5f" 因为我对块的偏移量需要它(如果我删除了 0.5f,偏移量将在中心而不是角落)

根据视频,我认为错误来自于您面向正 z 方向(或任何您的后向)。我的猜测是你没有考虑面向方向,正如我在你的代码中看到的那样,你只是在光标的位置添加了一个常量 0.5F。

因此,当你面向后方时,它会增加 0.5,使其位于墙后(因为后方是负 Z)。一个简单的检查是天气前向向量的 Z 分量是正还是负,并根据它决定添加到光标的因子,然后对 X 执行相同的操作。

根据您实现相机的方式(即:如果您使用欧拉角(rx、ry、rz)或者如果您使用四元数/前向向量),您进行检查的方式会有所不同,请随意如果需要,请根据您的系统向我索取示例。

希望对您有所帮助!

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