Вы должны использовать матрицу ModelView для применения преобразований к вашим вершинам. Чтобы применить преобразование к определенному объекту / сетке, а не ко всему экрану, поместите копию матрицы ModelView в стек, примените преобразование, нарисуйте свой объект, а затем извлеките эту матрицу, чтобы вернуться к старой матрице ModelView.
Нет необходимости пересчитывать ваши позиции вершин! Это именно то, что эти матрицы предназначены, чтобы помочь вам избежать. И тот факт, что они хранятся в VBO, для вас не имеет значения - вершины, переданные в OpenGL вручную, обрабатываются точно так же.
И, возможно, вы захотите проверить этот вопрос , а статью о трансформации с принятым ответом ссылается на - они будут полезны, если вы все еще получаете навык преобразований и матричный стек.
Надеюсь, это поможет!
Редактировать: Быстрый пример того, почему стек полезен. Скажем, вы рисуете простую сцену: парень на плоту (с парусом) в океане.
Во-первых, вы захотите настроить угол наклона камеры, так что делайте любые преобразования, которые вам нужны, чтобы настроить это. Вам не нужно - и на самом деле не нужно - толкать и вставлять матрицы здесь, потому что эти преобразования применяются ко всему на вашей сцене (в OpenGL перемещение камеры = перемещение всего мира. Странно думать, но ты к этому привыкла.).
Тогда вы рисуете свой океан. Не нужно его трансформировать, потому что это статический объект, и он не двигается.
Тогда вы берете свой плот. Но твой плот переехал! Он дрейфует вдоль оси X. Теперь, поскольку плот является независимым объектом и преобразования, которые применяются к плоту, не должны применяться к большему миру, вы помещаете матрицу в стек. Это копирует существующую матрицу ModelView. Все эти преобразования камеры уже применяются; Ваше «дрейфующее» преобразование на плоту является дополнением к преобразованиям, которые вы делали на нижних уровнях стека.
Нарисуйте плот. Затем, за 1025 * до вы вытаскиваете эту матрицу из стека, вытягиваете вещи на плоту - парня и паруса. Поскольку они движутся вместе с плотом, все преобразования, которые применяются к плоту, должны применяться к ним, к.
Скажем, вы сначала нарисуете свой побег. Но он тоже тронут - он прыгает в воздух. Таким образом, вы помещаете другую матрицу в стек, применяете «прыжковое» преобразование, а затем визуализируете свою личность. Если есть что-то, что должно двигаться вместе с человеком - если он что-то держал, скажем - вы бы нарисовали это и здесь. Но он не Так что вытолкните «прыгающую» матрицу из стека.
Теперь вы вернулись в контекст "плот". Поскольку вы применили «прыжковое» преобразование к копии, «дрейфующее» преобразование осталось нетронутым на уровне стека. Нарисуйте парус сейчас, и он будет на вершине плота, именно там, где и должен быть.
И тогда вы закончили с плотом, так что вы можете вытолкнуть эту матрицу из стека. Вы вернулись к своей простой трансформации камеры. Нарисуйте еще статичную геометрию - острова или что-то в этом роде.
И именно поэтому стек матриц полезен. Именно поэтому люди строят сцены с более сложными сценами как «графы сцен», чтобы они могли отслеживать вложение преобразований. Это также полезно в скелетной анимации, где положение запястья зависит от положения локтя, которое зависит от положения плеча и т. Д.
И это было намного дольше, чем я ожидал - но, надеюсь, полезно. Ура!