OpenGL положение камеры и скайбокс - PullRequest
2 голосов
/ 12 ноября 2011

Интеграция этого учебного пособия по камере http://www.swiftless.com/tutorials/opengl/camera2.html и небольшая проблема с центрированием камеры в скайбоксе.

Использование этого кода ниже делает мою камеру внутри коробки:

void reshape(int w, int h)
{
   glViewport(0, 0, (GLsizei) w, (GLsizei) h);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   if (w <= h)
      glOrtho(-1.0, 1.0, -1.0*(GLfloat)h/(GLfloat)w, 
              1.0*(GLfloat)h/(GLfloat)w, -10.0, 10.0);
   else
      glOrtho(-1.0*(GLfloat)w/(GLfloat)h, 
              1.0*(GLfloat)w/(GLfloat)h, -1.0, 1.0, -10.0, 10.0);
   glMatrixMode(GL_MODELVIEW);
} 

Чтобы нарисовать скайбокс, я следовал этому уроку: http://sidvind.com/wiki/Skybox_tutorial Я пытался перевести объекты ближе к камере, но не сработал, как я ожидал. Теперь я не уверен, что мне нужно делать.

Ценю любую помощь.

1 Ответ

2 голосов
/ 12 ноября 2011

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

Это можно сделать, установив последний столбец матрицы вида модели в (0,0,0,1).

Итак, ваш код рендеринга выглядит так:

void render_skybox()
{

    push_modelview();
    set_modelview_column(3, 0, 0, 1);
    draw_skybox();
    pop_modelview();

}

void render()
{
    set_viewport();
    set_projection();

    apply_camera_transform();

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