2014-10-17 3 views
0

Я думаю, что всем, кто использовал Box2D и OpenGL, известно, что происхождение корпусов Box2D находится в центре тела и для текстур OpenGL, оно находится внизу слева угол. Я использую Box2D для создания тела и прикрепление текстуры OpenGL к нему с помощью функции,Корпус Box2D с смещением начала текстуры OpenGL в GLFW

glTranslatef(Player_Body->GetPosition().x, Player_Body->GetPosition().y, 0.0f)

Однако, поскольку GetPosition() возвращает происхождение, моя текстура крепится к корпусу с левым нижним углом в центр тела. Как изменить начало текстуры OpenGL в центр текстуры?

Я не думаю, что это имеет какое-либо отношение к преобразованиям World to Screen. По крайней мере, пока нет. Потому что я не занимаюсь какой-либо физикой, просто отображая статическое тело. В настоящее время соотношение составляет Meters:Pixels -> 1:1 (я знаю, что это плохая практика, но это всего лишь временный тест). Моя программа использует GLFW как систему окон. Я ранее использовал GLUT, он отображался правильно, но у меня была проблема контекста монитора с GLUT, поэтому я использую GLFW. Однако код OpenGL для рисования и преобразования остается тем же. Также код Box2D. Итак, как я могу это решить?

P.S. : Я не отправляю код, потому что это скорее вопрос, связанный с логикой. Но я отправлю, если потребуется.

ответ

0

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

Координаты текстуры в OpenGL определяются спецификацией в координатном пространстве, где нижний левый угол текстуры является источником. То, что вы можете изменить, - это ваши вершины в пространстве объектов. Без кода я собираюсь предположить, что ваши вершины определены как (0, 0) до (w, h) при их создании. В пространстве объектов это означает, что один угол вашего прямоугольника находится в начале координат, и все это в одном квадранте. Ваш вызов glTranslatef - это то, что берет вершины из пространства объектов в мировое пространство.

Вместо этого вы должны сдвинуть свои вершины так, чтобы центр прямоугольника находился в начале пространства объектов. то есть от (-w/2, -h/2) до (w/2, h/2), таким образом, когда вы переводите вершины в пространство объектов, начало координат находится в центре.

Вот визуализация того, что я говорю о (в пространстве объекта):

 |        | 
     |*****       | 
     |*****       | 
     |*****      ***** 
----------------- < current ------*****------ < new 
     |        ***** 
     |        | 
     |        | 
     |        | 
+1

Да, мои вершины определяются как вы сказали. Мой 'glOrtho()' был определен как 'glOrtho (0, 1, 0, 1, -1, 1)'. Я более привык к картезианской системе, используемой в математических графах, которые использовали только положительный квадрант, особенно те, которые связаны с временем. Следовательно, я изменил его. Но теперь, благодаря вашему решению, я изменил его, и он работает отлично. Решение, столь простое и очевидное, все же кажется настолько неуловимым. Большое спасибо, Роберт! Спасибо за помощь! –

+0

@BhargavJannabhatla В любое время :) –

Смежные вопросы