OpenGL - трансформации объектов и VBO - PullRequest
2 голосов
/ 12 марта 2012

Итак, я написал программу, которая визуализирует сетку, используя объект буфера вершин, и позволяет мне перемещать камеру.Теперь я хочу, чтобы объект двигался независимо от камеры / вида.

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

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

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

1 Ответ

10 голосов
/ 12 марта 2012

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

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

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

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

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

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

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

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

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

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

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

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

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

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

...