2011-12-29 5 views
1

Я работаю над рендерингом местности в OpenGL. Мой код выглядит следующим образом:Перемещение камеры в 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+, и я новичок в графике.

+0

Попробуйте задать этот вопрос на http://gamedev.stackexchange.com/, вместо этого вам может быть повезло больше. – Cyclonecode

ответ

1

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

+2

Ну, похоже, он использует ядро ​​GL3 без каких-либо устаревших матричных материалов (или, по крайней мере, без встроенных матриц). –

4

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

Отъезд link.

Дальнейшие детали:

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

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

+0

«буквально и не двигает мир, чтобы имитировать движение камеры». ** ** перемещает мир, чтобы имитировать движение камеры. Оба понятия одно и то же. –

+0

@NicolBolas Ха-ха, вроде бы правда. Камера не может быть перемещена вообще. Они оба одинаковые. – Waleed

+0

'gluLookAt' работает на устаревшем конвейере с фиксированной функцией, поэтому вы должны рекомендовать' glm :: lookAt' вместо этого. –

2

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

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

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

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

+0

u означает, что я должен изменить x y и z, умножив их на функцию sin или cos, а затем называя выше? –

+0

@TestTest, no. Давайте немного поднимемся. Что такое 'k', которое вы передаете' Render_Terrain'? – MSN

Смежные вопросы