Вы должны использовать свою модельную модель для применения преобразований к своим вершинам. Чтобы применить преобразование к определенному объекту/сетке, а не ко всему экрану, вставьте копию вашей матрицы ModelView в стек, примените преобразование, нарисуйте свой объект, а затем поместите эту матрицу, чтобы вернуться к старой модели ModelView.
Не нужно перекомпоновать позиции вершин! Это именно то, что эти матрицы разработаны, чтобы помочь вам избежать. И тот факт, что они хранятся в VBO, не имеет для вас значения - вершины, переданные OpenGL вручную, обрабатываются точно так же.
И вы можете проверить this question и transformation article его принимающие ответы на ссылки - они будут полезны, если вы по-прежнему получаете перемены и стек матриц.
Надеюсь, что это поможет!
Редактировать: Быстрый пример того, почему стек полезен. Скажем, вы рисуете простую сцену: парень на плоту (с парусом) в океане.
Во-первых, вы хотите настроить угол обзора камеры, поэтому сделайте все, что вам нужно, чтобы настроить это. Вам не нужно - и на самом деле не нужно хочу - чтобы нажать и поп-матрицы здесь, потому что эти преобразования применимы ко всему в вашей сцене (в OpenGL, перемещение камеры = перемещение всего мира. но вы привыкли к этому.).
Затем вы рисуете свой океан. Не нужно его преобразовывать, потому что это статический объект и не движется.
Затем вы рисуете свой плот. Но ваш плот двигался! Он перемещается вдоль оси X. Теперь, поскольку плот является независимым объектом, а преобразования, которые применяются к плоту, не должны применяться к более крупному миру, вы нажимаете матрицу на стек. Это копирует существующую матрицу ModelView. Все эти преобразования камер уже применяются; Ваша «дрейфующая» трансформация на плоту в дополнение к преобразованиям, которые вы делали на более низких уровнях стека.
Рисовать плот. Затем, до вы вытащите эту матрицу со стека, нарисуйте вещи, которые находятся на плоту - парень и парус.Поскольку они движутся с плотом, все преобразования, которые применяются к плоту, должны применяться к ним, к.
Скажите, что вы сначала нарисуете свой казуай. Но он тоже переехал - он прыгает в воздух. Таким образом, вы нажимаете еще одну матрицу на стек, применяете «прыгающее» преобразование, а затем визуализируете своего человека. Если есть что-то, что должно двигаться с человеком - если он держит что-нибудь, скажем - вы тоже нарисуете его здесь. Но это не так. Поэтому вытащите «скачущую» матрицу из стека.
Теперь вы снова находитесь в контексте «плота». Поскольку вы применили «прыгающее» преобразование к копии, «дрейфующее» преобразование оставалось нетронутым на уровне стека. Нарисуйте паруса сейчас, и он будет на вершине плота, прямо там, где он должен быть.
И тогда вы закончите с плотом, чтобы вы могли вытащить эту матрицу из стека. Вы возвращаетесь к преобразованию простой камеры. Нарисуйте еще статическую геометрию - острова или что-то еще.
И вот почему матричный стек полезен. Именно поэтому люди создают более сложные сцены сцен как «графики сцены», поэтому они могут отслеживать вложенность преобразований. Это также полезно в скелетной анимации, где положение запястья зависит от положения локтя, которое зависит от положения плеча и т. Д.
И это было дольше, чем я ожидал, но, надеюсь, полезно. Ура!
Итак, сначала 'glPushMatrix()', затем преобразования, такие как 'glTranslatef (x, y, z)', затем нарисовать VBO и, наконец, 'glPopMatrix()' - правильно? Я добавил эту структуру в текущий код и, похоже, работает нормально! Я не был знаком с функциями push и pop; Спасибо! Также спасибо за ссылки! – GarrickW
@GarrickW - Технически вам нужны только функции push и pop, если вы перемещаете один «объект» на своем экране, и вы не хотите, чтобы эти преобразования применялись ко всему остальному. Я добавил пример - надеюсь, что это станет проще. Ура! –
А, я вижу - большое спасибо! Это помогает прояснить ситуацию совсем немного. – GarrickW