2012-03-12 7 views
1

Итак, я написал программу, которая отображает сетку с использованием объекта Buffer Vertex, и позволяет мне перемещать камеру. Теперь я хочу, чтобы объект перемещался независимо от камеры/просмотра.OpenGL - трансформации объектов и VBOs

Однако я не уверен, как двигаться, перемещая мои ячейки в пространстве. Googling имеет тенденцию искать источники, которые говорят мне вращать объекты с помощью glRotatef() и т. Д., Или что использование glRotatef() и его братьев и сестер - плохая идея, потому что они устарели. Возможно, я не использую правильные поисковые термины, но я не нахожу ничего такого, что кажется хорошей отправной точкой. Я вижу неопределенные ссылки на матричную математику, но я не знаю, как использовать это и какой подход принять. Другие источники говорят, что я должен применить вершинный шейдер для преобразования объектов.

Я предполагаю, что смогу вручную восстановить меш каждый кадр, но это кажется ужасной идеей (у ячеек часто есть более 50 тыс. Треугольников, и я бы хотел иметь их как минимум), и я не знаю, t действительно нужно, чтобы вершины постоянно использовались в остальной части моей памяти, если они уже хранятся в VBO ... правильно?

Как я могу манипулировать сетями, которые хранятся в VBOs независимо от глобального пространства? Какие ресурсы следует использовать при обучении?

ответ

9

Вы должны использовать свою модельную модель для применения преобразований к своим вершинам. Чтобы применить преобразование к определенному объекту/сетке, а не ко всему экрану, вставьте копию вашей матрицы ModelView в стек, примените преобразование, нарисуйте свой объект, а затем поместите эту матрицу, чтобы вернуться к старой модели ModelView.

Не нужно перекомпоновать позиции вершин! Это именно то, что эти матрицы разработаны, чтобы помочь вам избежать. И тот факт, что они хранятся в VBO, не имеет для вас значения - вершины, переданные OpenGL вручную, обрабатываются точно так же.

И вы можете проверить this question и transformation article его принимающие ответы на ссылки - они будут полезны, если вы по-прежнему получаете перемены и стек матриц.

Надеюсь, что это поможет!

Редактировать: Быстрый пример того, почему стек полезен. Скажем, вы рисуете простую сцену: парень на плоту (с парусом) в океане.

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

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

Затем вы рисуете свой плот. Но ваш плот двигался! Он перемещается вдоль оси X. Теперь, поскольку плот является независимым объектом, а преобразования, которые применяются к плоту, не должны применяться к более крупному миру, вы нажимаете матрицу на стек. Это копирует существующую матрицу ModelView. Все эти преобразования камер уже применяются; Ваша «дрейфующая» трансформация на плоту в дополнение к преобразованиям, которые вы делали на более низких уровнях стека.

Рисовать плот. Затем, до вы вытащите эту матрицу со стека, нарисуйте вещи, которые находятся на плоту - парень и парус.Поскольку они движутся с плотом, все преобразования, которые применяются к плоту, должны применяться к ним, к.

Скажите, что вы сначала нарисуете свой казуай. Но он тоже переехал - он прыгает в воздух. Таким образом, вы нажимаете еще одну матрицу на стек, применяете «прыгающее» преобразование, а затем визуализируете своего человека. Если есть что-то, что должно двигаться с человеком - если он держит что-нибудь, скажем - вы тоже нарисуете его здесь. Но это не так. Поэтому вытащите «скачущую» матрицу из стека.

Теперь вы снова находитесь в контексте «плота». Поскольку вы применили «прыгающее» преобразование к копии, «дрейфующее» преобразование оставалось нетронутым на уровне стека. Нарисуйте паруса сейчас, и он будет на вершине плота, прямо там, где он должен быть.

И тогда вы закончите с плотом, чтобы вы могли вытащить эту матрицу из стека. Вы возвращаетесь к преобразованию простой камеры. Нарисуйте еще статическую геометрию - острова или что-то еще.

И вот почему матричный стек полезен. Именно поэтому люди создают более сложные сцены сцен как «графики сцены», поэтому они могут отслеживать вложенность преобразований. Это также полезно в скелетной анимации, где положение запястья зависит от положения локтя, которое зависит от положения плеча и т. Д.

И это было дольше, чем я ожидал, но, надеюсь, полезно. Ура!

+1

Итак, сначала 'glPushMatrix()', затем преобразования, такие как 'glTranslatef (x, y, z)', затем нарисовать VBO и, наконец, 'glPopMatrix()' - правильно? Я добавил эту структуру в текущий код и, похоже, работает нормально! Я не был знаком с функциями push и pop; Спасибо! Также спасибо за ссылки! – GarrickW

+0

@GarrickW - Технически вам нужны только функции push и pop, если вы перемещаете один «объект» на своем экране, и вы не хотите, чтобы эти преобразования применялись ко всему остальному. Я добавил пример - надеюсь, что это станет проще. Ура! –

+0

А, я вижу - большое спасибо! Это помогает прояснить ситуацию совсем немного. – GarrickW