Изменение положения камеры с помощью openGL ES

У меня есть простой проект iOS, в котором я отображаю форму. Все идет нормально. Теперь я пытаюсь изменить положение камеры, чтобы мой объект просматривался в изометрической перспективе. Я не могу понять, как перемещать/вращать камеру с помощью OpenGL-ES 2.x.

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

Кто-нибудь может поделиться фрагментом кода Objective-C, чтобы помочь мне правильно расположить эту камеру?

ОБНОВЛЕНИЕ, ИСПОЛЬЗУЯ ПОДСКАЗКИ В ОТВЕТАХ:

Я использовал Cocos3D, чтобы помочь с матричными вычислениями.

CC3GLMatrix *camera = [CC3GLMatrix matrix];
[camera populateFromTranslation:CC3VectorMake(0, 0, 0)];
[camera rotateBy:CC3VectorMake(30, 0, 0)];
[camera rotateBy:CC3VectorMake(0, 45, 0)];  
glUniformMatrix4fv(_cameraUniform, 1, 0, camera.glMatrix);

Затем добавил камеру в вершину

gl_Position = Projection * Modelview * Camera * Position;

person mprivat    schedule 22.05.2014    source источник


Ответы (2)


OpenGL ES, тем более в версии 2.x, не имеет понятия объектов, миров, камер и чего бы то ни было. В общих чертах, он имеет поток входных вершин, определенным образом организованных для создания геометрии, которые обрабатываются индивидуально в соответствии с неким единым состоянием, затем он определяет, какие фрагменты нужно будет закрасить, и индивидуально выполняет расчет для определения выходного цвета для каждого из них. фрагмент.

Вы поставляете:

  • вершины
  • униформа
  • вершинный шейдер
  • фрагментный шейдер

Обычно у людей вершины описывают местоположения относительно центра модели.

У них есть некоторое состояние, описывающее, где в мире находится эта модель, и какое-то другое состояние, описывающее, где в этом мире находится камера. Они предоставляют эту информацию в виде униформы, обычно объединенной в единую матрицу.

Тогда у них будет вершинный шейдер, который более или менее просто применяет юниформу к вершине.

Наконец, фрагментный шейдер сэмплирует некоторые текстуры или что-то еще, что необходимо для рисования этого лица.

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

person Tommy    schedule 22.05.2014
comment
Спасибо за объяснение. Теперь это имеет смысл. - person mprivat; 23.05.2014

Насколько я знаю в OpenGL ES, не существует «объекта камеры». Вы должны переместить все остальное относительно исходной точки, чтобы переместить или повернуть сцену. Вы можете использовать шейдер, чтобы сделать это, как упомянул Таум.

person 67cherries    schedule 22.05.2014
comment
Что ж, да, это правда, но обычно вы добавляете в свой шейдер матрицу (uniform параметр), которая представляет преобразование камеры, и вы умножаете каждую вершину на эту матрицу. Ваш ответ создает впечатление, что обычная практика заключается в изменении значения вершин по одной;) - person Taum; 23.05.2014
comment
@ Таум, спасибо за это. Я давно не работал с OpenGL ES. Это то, что я имел в виду. - person 67cherries; 23.05.2014
comment
Спасибо за это, я думаю, я понял - person mprivat; 23.05.2014