OpenGL C ++ Мини-карта текущих настроек - PullRequest
1 голос
/ 10 марта 2012

Я ищу способ создания второго вида из верхней части моей текущей 3D-сцены.Я хотел бы сделать это как можно проще.Основная идея заключается в том, что у вас есть подокно, в котором будет отображаться вид сверху настройки.

Я смотрел на подокна в openGL, но проблема в том, что вам нужно перерисовать все (в основном это заканчивается двумя сценами сдругой угол = не хорошо).Кроме того, поскольку это будет использоваться в трехмерной игре, называемой «укладка ящиков в башне» (вы должны поместить ящики друг на друга и сделать высокую башню), невозможно использовать способ подокна, чтобы сделать это (так как вы получите 2 сценыс разными блоками / местами / действиями /...)

Итак, как мне добавить «вторую камеру» в мою текущую сцену и затем расположить ее сверху.

Ответы [ 3 ]

4 голосов
/ 10 марта 2012

Я изучил подокна в openGL, но проблема в том, что вы должны перерисовать все (в основном заканчивая двумя сценами с другим углом = не хорошо)

Это на самом делеодин и единственный способ сделать это с OpenGL.

Так, как я могу добавить «вторую камеру» в мою текущую сцену и затем расположить ее сверху.

OpenGLне имеет камер.У него даже нет сцены.OpenGL просто рисует очень простые фигуры: точки, линии и треугольники.Кроме того, OpenGL не имеет представления о геометрии или сложных сценах.

Управление сценами зависит от вас, а рисование нескольких видов сцены должно быть реализовано вами.


Обновление:Псевдокод

draw_scene:
    for o in objects:
        glPushMatrix()
        glMultMatrix(o.transform)
        o.draw()
        glPopMatrix()

render_main_view:
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    glFrustum(...)

    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()

    glMultMatrix(main_camera_transform)

render_secondary_view:
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    glFrustum(...)

    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()

    glMultMatrix(secondary_camera_transform)

scissor_viewport(x,y,w,h)
    glScissor(x,y,w,h)
    glViewport(x,y,w,h)

render:
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

    glEnable(GL_SCISSOR_TEST)
    scissor_viewport(main_viewport.x,main_viewport.y,main_viewport.w,main_viewport.h)
    render_main_view()

    glClear(GL_DEPTH_BUFFER_BIT)
    scissor_viewport(secondary_viewport.x,secondary_viewport.y,secondary_viewport.w,secondary_viewport.h)
    render_secondary_view()
3 голосов
/ 10 марта 2012

Нарисуйте сцену один раз, используя настройки по умолчанию.

Затем примените другое преобразование вида (соответствующее вашей второй «камере»), используйте glViewport, чтобы выбрать прямоугольник экрана и снова нарисовать сцену. (Не забудьте сбросить glViewport, чтобы потом снова покрыть весь экран)

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

0 голосов
/ 10 марта 2012

Отказ от ответственности: я не пробовал это, и это действительно предложение.

Итак, вы говорите, что ваша игра состоит из стеков, и вам нужен вид сверху. Почему бы не «подделать» вид сверху? По сути, вы создаете текстуру, которая представляет миникарту вашей игры как ортогональный вид. ТОЛЬКО когда новый блок складывается, вам нужно будет обновить текстуру. Чтобы просмотреть его в текущей позиции, вам нужно будет установить соответствующие текстурные координаты «подокна» или окна просмотра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...