LWJGL Picking - Выбрать определенный блок при наведении ( 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);
}

Он возвращает "/ 2 + 0,5f", потому что это необходимо из-за смещений, которые у меня есть для блоков (если бы я удалил 0,5f, смещение было бы в центре вместо угла)

1 ответ

Решение

Я говорю мне, что ошибка, основанная на видео, происходит, когда вы смотрите в положительном направлении z (или как бы вы ни были в обратном направлении). Я предполагаю, что вы не принимаете во внимание направление движения, как я вижу в вашем коде, что вы просто добавляете постоянную 0,5F к позиции вашего курсора.

Поэтому, когда вы обращены назад, он добавляет 0,5, что делает его позади стены (так как спина отрицательна Z). одна простая проверка будет состоять в том, что компонент Z вашего прямого вектора положителен или отрицателен, и на основе этого определяется коэффициент, добавленный к курсору, затем делается то же самое для X.

В зависимости от того, как вы реализовали свою камеру (например, если вы использовали углы Эйлера (rx, ry, rz) или если вы использовали кватернионы / векторы вперед), то, как вы будете выполнять эту проверку, будет различным, не стесняйтесь спрашивать меня о примерах на основе в вашей системе, если вам нужно.

надеюсь, это помогло!

PS: если вы используете углы, вы можете либо проверить диапазон значений вращения оси Y и определить, в каком направлении вы находитесь, и, следовательно, погоду, чтобы добавить или вычесть, ИЛИ вы можете рассчитать вектор вперед на основе ваших углов, а затем проверьте наличие знака компонента.

Другие вопросы по тегам