3d камера в OpenGL и SFML

Я пытаюсь заставить мою сцену в OpenGL двигаться, но у меня проблемы. Я просмотрел несколько учебных пособий и знаю математические концепции, лежащие в основе матриц OpenGL. У меня просто проблемы с этим. Все, что мне нужно, это как 1 пример. Если бы я мог видеть пример того, как «камера» движется в одном направлении, когда нажата клавиша, я мог бы изменить код для своих собственных целей.

-3

Решение

Ну, у OpenGL действительно нет «камеры». У него есть конвейер преобразования (либо фиксированная функция, либо программируемый). Также OpenGL не поддерживает «сцену», а просто рисует точки, линии и треугольники в кадровом буфере, по одному за раз.

После того, как вы сконцентрировались на том факте, что вы, по сути, не очень отличаетесь от других API рисования (goTo(x,y); lineTo(x,y); или похожее) во многих вещах в OpenGL гораздо больше смысла.

Таким образом, «камера» в OpenGL — это просто преобразование просмотра, применяемое в некоторой точке конвейера преобразования вершин. Обычно в качестве последнего преобразования в матрице представления модели — преобразование модели с последующим преобразованием представления, следовательно, представление модели.

Есть много способов указать преобразование вида, и типичная вспомогательная функция, часто используемая для этого, gluLookAt, Поскольку преобразования применяются в обратном порядке, они умножаются на матрицу (если, по крайней мере, используется OpenML glMultMatrix или одна из встроенных функций манипуляции с матрицей), преобразование просмотра выполняется первым, когда определяется матрица вида модели. Так что в вашей функции рисования код обычно выглядит

glMatrixMode(GL_MODELVIEW)
glLoadMatrix(view.transformation) # same as glLoadIdentity(); glMultMatrix(view.transformation)

foreach(object o in objects):
glMatrixMode(GL_MODELVIEW)
glPushMatrix()
glMultMatrix(o.transformation)

o.draw()

glMatrixMode(GL_MODELVIEW)
glPopMatrix()

Вы заметили, как я всегда проверяю, что я нахожусь в правильном матричном режиме перед каждой манипуляцией матрицей? Это потому, что object :: draw может переключаться в другой матричный режим (например, GL_TEXTURE), а переключение матричных режимов требует лишь незначительных затрат, поэтому вы должны всегда делать это перед последовательностью манипуляций с матрицей.

В качестве дополнительной подсказки: вы всегда должны размещать свой код для настройки области просмотра и матрицы проекции в начале кода чертежа. Не делайте поместите его в обработчик события изменения размера окна.

3

Другие решения

Ты можешь использовать gluLookAt «переместить» вашу камеру.

gluLookAt(eyex,eyey,eyez, centerx,centery,centerz, upx,upy,upz);

Они первые 3 координаты являются координатами вашего виртуального глаза. Следующие 3 — это координаты, на которые «смотрит» ваш глаз. Последние 3 — это вектор, указывающий на направление вашей сцены вверх (представьте, что это вращение вашего глаза).

Например,

gluLookAt(1,1,1, 0,0,0, 0,1,0);

Это делает ваш взгляд на (1,1,1), и вы смотрите на происхождение. Направление вектора вверх является положительной осью Y.

Если вы хотите переместить камеру, вы можете позвонить gluLookAt с обновленными параметрами при каждом нажатии клавиши из функции обратного вызова при нажатии клавиши.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector