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 и определить, в каком направлении вы находитесь, и, следовательно, погоду, чтобы добавить или вычесть, ИЛИ вы можете рассчитать вектор вперед на основе ваших углов, а затем проверьте наличие знака компонента.