Я пытаюсь научиться добавлять несколько объектов и работать с ними в моем 3D-мире. Разрабатываю для iPhone. Что касается моего вопроса ниже, я не смог найти хорошую информацию об этом во время поиска в Google.
У меня есть функция, которая создает все массивы вершин с данными для создания сферы. Нет проблем с добавлением его как единственного объекта. Проблема в том, что данные для сферы не знают о каких-либо других объектах, которые я мог создать и добавить в мир. Конечно, я понимаю, что могу объединить массивы с вершинами и добавить все это одновременно, и мир будет выглядеть так, как я хочу, с моими объектами на месте. Но тогда как мне сделать glTranslatef(,,)
, glScalef
и glRotatef(,,,)
? Это повлияет на весь мир, и, возможно, я хочу только повернуть сферу. Как мне изменить положение только вершин сферы и ничего больше, когда я хочу переместить сферу?
Итак, вопрос, который я действительно хочу задать: какие стратегии / шаблоны следует использовать при работе с несколькими объектами, чтобы иметь возможность работать с ними как с отдельными объектами, а не с миром как с одним блоком, содержащим много объектов. объекты? Позже мне понадобится стратегия, которая также работает с обнаружением столкновений. Мне просто нужна помощь, чтобы двигаться в правильном направлении в процессе обучения.
2 ответа
В основном есть два шаблона: использование стека матриц и копирование данных.
Чтобы использовать стек матриц, вы делаете что-то вроде этого:
for each object {
glPushMatrix
glTranslate(location of first object)
/* rotate as desired too */
draw_one_object();
glPopMatrix();
}
Одни и те же данные координат можно повторно использовать, потому что они нарисованы в разных местах.
Альтернативный вариант (копирование данных) - выделить гораздо больший массив, скопировать в него данные N раз, а затем добавить смещения объектов к каждой копии, чтобы сформировать уникальные копии исходных данных.
Команды "преобразования" (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, на координаты влияют ОБЩИЕ результаты всех ПРЕДЫДУЩИХ матричных процедур. Но необработанные данные , которые вы используете для рисования своих элементов, не изменились.
(Вы можете думать о командах матрицы как о изменении того, как видеокарта видит ваши геометрические данные. Они не меняют сами геометрические данные.) Это похоже на разницу между покраской вашего дома в красный цвет и нанесением на солнцезащитных очках красной тонировки; Матричные процедуры изменяют способ наблюдения за данными видеокартой, и, таким образом, это изменение не является постоянным.
Похожие вопросы
Новые вопросы
objective-c
Этот тег следует использовать только для вопросов, касающихся функций Objective-C или зависящих от кода на языке. Теги [cocoa] и [cocoa-touch] следует использовать, чтобы узнать о фреймворках или классах Apple. Используйте связанные теги [ios], [macos], [apple-watch] и [tvos] для проблем, характерных для этих платформ.