2016-01-31 3 views
0

Это видео покажет мою текущую ситуацию, и я в настоящее время не могу найти ответы на него в Интернете.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 , смещение будет в центре вместо угла)

ответ

0

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

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

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

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

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

+0

Хорошо. Да, я уверен, что использую «углы Эйлера» (rx, ry, rz). Я не профессионал в 3D-программировании, LOL. Я посмотрю, что я могу сделать, спасибо за информацию! Я поговорю с вами позже, если мне нужна дополнительная информация;) – StinchinStein

+0

Спасибо! Кажется, я нашел решение. Я подсчитал, в каком направлении находится «игрок», и пошел оттуда. Еще раз спасибо! Я пытался понять это сейчас ... :) – StinchinStein