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

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

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

1
Nicsoft 25 Янв 2010 в 17:55

2 ответа

Лучший ответ

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

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

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

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

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

1
Ben Supnik 29 Янв 2010 в 01:41
Спасибо! Это похоже на информацию, которую я нашел где-то еще, так что я предполагаю, что это общий способ сделать это. Я не понимаю одного: «Одни и те же данные координат можно повторно использовать, потому что они нарисованы в разных местах». Не могли бы вы это объяснить? Я новичок, извините за мою "непонятность" ...
 – 
Nicsoft
29 Янв 2010 в 11:04

Команды "преобразования" (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, на координаты влияют ОБЩИЕ результаты всех ПРЕДЫДУЩИХ матричных процедур. Но необработанные данные , которые вы используете для рисования своих элементов, не изменились.

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

2
Ben Supnik 29 Янв 2010 в 19:26