Перемещение камеры в OpenGL - PullRequest
1 голос
/ 29 декабря 2011

Я работаю над рендерингом ландшафта в OpenGL. Мой код следующий:

void Render_Terrain(int k)
{
    GLfloat angle = (GLfloat) (k/40 % 360);

    //PROJECTION
    glm::mat4 Projection = glm::perspective(45.0f, 1.0f, 0.1f, 100.0f);

    //VIEW
    glm::mat4 View = glm::mat4(1.);

    //ROTATION
    //View = glm::rotate(View, angle * -0.1f, glm::vec3(1.f, 0.f, 0.f));
    //View = glm::rotate(View, angle * 0.2f, glm::vec3(0.f, 1.f, 0.f));
    //View = glm::rotate(View, angle * 0.9f, glm::vec3(0.f, 0.f, 1.f));

    View = glm::translate(View, glm::vec3(0.f,0.f, -4.0f)); // x, y, z position ? 

    //MODEL
    glm::mat4 Model = glm::mat4(1.0);

    glm::mat4 MVP = Projection * View * Model;
    glUniformMatrix4fv(glGetUniformLocation(shaderprogram, "MVP_matrix"), 1, GL_FALSE, glm::value_ptr(MVP));

    //Transfer additional information to the vertex shader 
    glm::mat4 MV = Model * View;
    glUniformMatrix4fv(glGetUniformLocation(shaderprogram, "MV_matrix"), 1, GL_FALSE, glm::value_ptr(MV));

    glClearColor(0.0, 0.0, 0.0, 1.0);

    glDrawArrays(GL_LINE_STRIP, terrain_start, terrain_end );

}

Я могу вращаться вокруг осей X, Y, Z, масштабировать местность, но я не могу найти способ перемещения камеры. Я использую OpenGL 3+, и я немного новичок в графике.

Ответы [ 3 ]

4 голосов
/ 29 декабря 2011

Лучший способ перемещения камеры - использование функции gluLookAt (), которая имитирует движение камеры, поскольку камеру нельзя перемещать вообще. Функция принимает 9 параметров. Первые 3 - это координаты XYZ глаза, где именно находится камера. Вторые 3 параметра - это координаты XYZ центра, то есть точки, на которую камера смотрит с глаз. Это всегда будет центр экрана. Третьи 3 параметра - это координаты XYZ вектора UP, который направлен вертикально вверх от глаза. Управляя этими 3 координатами XYZ, вы можете имитировать любое движение камеры по вашему желанию.

Проверьте эту ссылку .

Более подробная информация:

-Если вы хотите, например, вращаться вокруг объекта, вы поворачиваете свой глаз вокруг вектора вверх. -Если вы хотите двигаться вперед или назад, вы добавляете или вычитаете глаз, а также центральные точки. -Если вы хотите наклонить камеру влево или вправо, поверните вектор вверх вокруг вектора взгляда, где вектор взгляда находится в центре - глаз.

gluLookAt работает с устаревшим конвейером фиксированных функций, поэтому вместо него следует использовать glm :: lookAt. * ​​1011 *

2 голосов
/ 29 декабря 2011

Вы используете постоянный вектор для перевода. В закомментированном коде (который, я полагаю, вы использовали для проверки вращения) вы используете angle для регулировки вращения. У вас должна быть похожая переменная для перевода. Затем вы можете изменить glm::translate вызов на:

View = glm::translate(View, glm::vec3(x_transform, y_transform, z_transform)); // x, y, z position ?  

и получите перевод.

Вам, вероятно, следует передать более одного параметра в Render_Terrain, поскольку для перемещения и поворота требуется как минимум шесть параметров.

1 голос
/ 29 декабря 2011

В OpenGL камера всегда на (0, 0, 0). Вам нужно установить матричный режим на GL_MODELVIEW, а затем изменить или установить матрицу модели / вида, используя такие вещи, как glTranslate, glRotate, glLoadMatrix и т. Д., Чтобы создать впечатление, что камера сместилась. Если вы используете GLU, вы можете использовать gluLookAt , чтобы направить камеру в определенном направлении.

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