2013-11-15 182 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

'points'正在积累碰撞多边形的顶点,假定它们是正方形。然后将这些顶点传递给绘图函数,以便对OpenGL进行渲染处理。 – Trillian

+0

Got it!我还有一个问题!对于纹理,我们给每个顶点的textCords。我尝试在drawSquare()中的glVertex2f()命令后添加以下命令,但没有得到所需的结果。我认为这不是纹理映射的正确方法。你可以发现什么是错的,或者建议我在我的多边形上映射纹理的正确方法 'glTexCoord2f(points [i] .x * M2P,points [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