2013-11-15 2 views
0

Я застреваю в рисовании полигонов как объекты Box2D. С OpenGL, чертеж многоугольника довольно прост т.е.Рисование многоугольников opengl и box2D

glBegin(GL_POLYGON); 

glColor3f(0,0,0); 
glVertex2f(2.0,6.0); 
glVertex2f(2.0,8.0); 
glVertex2f(2.5,8.0); 
glVertex2f(2.5,6.0); 

glEnd(); 

И то, что я видел в учебниках, с Box2D мы делаем это так:

void drawSquare(b2Vec2* points,b2Vec2 center,float angle) 
{ 
    glColor3f(1,1,1); 
glPushMatrix(); 
     glTranslatef(center.x*M2P,center.y*M2P,0); 
     glRotatef(angle*180.0/3.141,0,0,1); 

     glBegin(GL_QUADS); 
       for(int i=0;i<4;i++) 
       { 

         glVertex2f(points[i].x*M2P,points[i].y*M2P); 


       } 
     glEnd(); 
glPopMatrix(); 
} 

И дисплей код() является следующим образом:

void display() 
{ 
    glClear(GL_COLOR_BUFFER_BIT) 
    glEnable (GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D,11); 

//pix[0].mDraw(); 

glLoadIdentity(); 

b2Body* tmp=world->GetBodyList(); // Get no.of bodies 

b2Vec2 points[4]; 

while(tmp) 
{ 
     for(int i=0;i<4;i++) 
     points[i]=((b2PolygonShape*)tmp->GetFixtureList()->GetShape())->GetVertex(i); 

     drawSquare(points,tmp->GetWorldCenter(),tmp->GetAngle()); 

     tmp=tmp->GetNext(); 
} 




glFlush(); 
} 

Я застрял с этим следующим кодом:

/*for(int i=0;i<4;i++) 
points[i]=((b2PolygonShape*)tmp->GetFixtureList()->GetShape())->GetVertex(i); 

     drawSquare(points,tmp->GetWorldCenter(),tmp->GetAngle()); 

     tmp=tmp->GetNext();*/ 

Я действительно не получаю то, что назначается в массив точек?

+0

«точки» накапливают вершины многоугольника столкновения, которые считаются квадратами. Затем эти вершины передаются в функцию рисования, которая обрабатывается OpenGL для рендеринга. – Trillian

+0

Получил! У меня еще один вопрос! Для текстурирования мы даем textCords для каждой вершины. Я попытался добавить следующую команду сразу после моей команды glVertex2f() в drawSquare(), но я не получил желаемого результата. Я думаю, что это неправильный подход для отображения текстур. Может у пятно что-то неправильно или предложит мне правильный способ сопоставления текстур на моих полигонах 'glTexCoord2f (точки [i] .x * M2P, точки [i] .y * M2P); – Vector

ответ

0

points аккумулирует вершины коллизионного многоугольника, которые считаются квадратами. Затем эти вершины передаются в функцию рисования, которая обрабатывается OpenGL для рендеринга.

Что касается вашего второго вопроса в комментарии, нет смысла использовать координаты вершин в качестве координат текстуры. Координаты текстуры определяют, какие пиксели (или тексели) в текстуре должны использоваться. Значения нормированы так, что (0,0) соответствует нижнему левому краю вашего изображения, а (1,1) соответствует верхнему праву вашего изображения. Является ли ваш объект в (0,0) или в (42,35) в вашем мире, не меняет, какие пиксели в текстуре вы хотите использовать.

Если вы хотите сопоставить всю текстуру с квадратом, то вы должны передать (0,0), (0,1), (1,1) и (1,0) в качестве координат текстуры для каждой из ваших четырех вершин. Возможно, вам придется играть с порядком координат, если текстура будет повернута.

+0

Спасибо за объяснение! Это действительно спасло мой день! Я боюсь, потому что я только начал работать над этим! – Vector

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