Как работать с несколькими объектами в OpenGL-ES - PullRequest
1 голос
/ 25 января 2010

Я пытаюсь научиться добавлять несколько объектов и работать с ними в моем 3D-мире. Я разрабатываю для iPhone. Что касается моего вопроса ниже, я не мог найти хорошую информацию об этом, пока гуглил.

У меня есть функция, которая создает все вершины-массивы с данными для создания сферы. Нет проблем, добавив его в качестве единственного объекта. Проблема в том, что данные для сферы не знают о каких-либо других объектах, которые я, возможно, создал и добавил в мир. Конечно, я понимаю, что могу объединить массивы с вершинами и добавить их все одновременно, и мир будет выглядеть так, как я хочу, с моими объектами на месте. Но тогда как мне сделать glTranslatef(,,), glScalef и glRotatef(,,,)? Это повлияет на весь мир, и, возможно, я только хочу вращать сферу. Как изменить положение только вершин сферы и ничего больше, когда я хочу переместить сферу?

Итак, вопрос, который я действительно хочу задать, заключается в следующем: какие стратегии / шаблоны использовать при работе с несколькими объектами, чтобы иметь возможность работать с ними как с едиными объектами и не работать с миром как с одним чанком много предметов? Позже мне понадобится стратегия, которая бы работала и с обнаружением столкновений. Мне просто нужна помощь, чтобы двигаться в правильном направлении во время обучения.

Ответы [ 2 ]

2 голосов
/ 29 января 2010

Команды «преобразования» (glRotate, glTranslate и т. Д.) Не постоянно влияют на ваши данные координат. Они влияют только на рисунок, который сделан за один раз. Например, если у вас есть куб вокруг источника, то ...

draw_cube(); // draws the cube around the origin
glTranslate(10,0,0);
draw_cube(); // draws the cube 10 units to the right
glTranslate(2,0,0);
draw_cube(); // draws the cube 12 units to the right
draw_cube(); // draws the cube 12 units to the right again
glTranslate(-12,0,0);
draw_cube(); // draws the cube around the origin (again).

Другими словами, каждый раз, когда вы рисуете с помощью glDrawElements или glDrawArrays, на координаты влияют ОБЩИЕ результаты всех ПРЕДЫДУЩИХ матричных подпрограмм. Но необработанные данные , которые вы используете для рисования ваших элементов, не изменились.

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

1 голос
/ 29 января 2010

Существует два основных шаблона: использование стека матриц и копирование данных.

Чтобы использовать матричный стек, вы делаете что-то вроде этого:

for each object {
 glPushMatrix
 glTranslate(location of first object)
 /* rotate as desired too */
 draw_one_object();
 glPopMatrix();
}

Одни и те же данные координат можно повторно использовать, поскольку они рисуются в разных местах.

Альтернатива (копирование данных) состоит в том, чтобы выделить гораздо больший массив, скопировать в него ваши данные N раз, а затем добавить смещения объектов в каждую копию, чтобы сформировать уникальные копии исходных данных.

...