【发布时间】:2013-11-18 05:05:12
【问题描述】:
我有一个 PolygonShape 物理体。问题是当我在其上应用纹理时,它会显示倒置图像!我无法弄清楚为什么?我想我给出了正确的像素坐标,但它仍然不起作用。 这是opengl的渲染:
void drawSquare2(b2Vec2* points,b2Vec2 center,float angle)
{
glColor3f(1,1,1);
glPushMatrix();
pix.readBMPFile("marioStanding.bmp",1);
pix.setChromaKey(255, 255, 255);
pix.setTexture(11);
glTranslatef(center.x*M2P,center.y*M2P,0);
glRotatef(angle*180.0/3.141,0,0,1);
glEnable (GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,11);
glBegin(GL_POLYGON);
int i=0;
glVertex2f(points[i].x*M2P,points[i].y*M2P);
glTexCoord2f(0,0);
i++;
glVertex2f(points[i].x*M2P,points[i].y*M2P);
glTexCoord2f(0,1);
i++;
glVertex2f(points[i].x*M2P,points[i].y*M2P);
glTexCoord2f(1,1);
i++;
glVertex2f(points[i].x*M2P,points[i].y*M2P);
glTexCoord2f(1,0);
glEnd();
glDisable(GL_TEXTURE_2D);
glPopMatrix();
}
这就是我从 Display 函数中调用它的方式
for(int i=0;i<4;i++)
points[i]=((b2PolygonShape*)tom_char->GetFixtureList()->GetShape())->GetVertex(i);
drawSquare2(points,tom_char->GetWorldCenter(),tom_char->GetAngle());
addRect逻辑:
b2Body* addRect2(int x,int y,int w,int h,bool dyn=true)
{
b2BodyDef bodydef;
bodydef.position.Set(x*P2M,y*P2M); //Setting body position
if(dyn)
{
bodydef.type=b2_dynamicBody; // dynamic body means body will move
}
b2Body* body=world->CreateBody(&bodydef); //Creating box2D body
b2PolygonShape shape; //Creating shape object
shape.SetAsBox(P2M*w,P2M*h);
////////////// Adding Fixtures(mass, density etc) //////////////
b2FixtureDef fixturedef;
fixturedef.shape=&shape;
fixturedef.density=0.0;
fixturedef.restitution = 0.7;
body->CreateFixture(&fixturedef);
return body;
}
这些是给addRect的参数:
tom_char=addRect(500,460,50,70,true);
无法发现我哪里出错了!
【问题讨论】:
-
鉴于您提供的信息很少,这是不可能的。但我怀疑你不知道标准化纹理坐标中的点 (0,0) 对应于纹理图像的左下角。 (0,1) 是左上角,(1,1) 是右上角,(1,0) 是右下角。
-
而多边形和四边形的顺序是(0,0),(0,1),(1,1),(1,0)来贴图纹理。
-
您还需要什么信息??
-
对于初学者来说,
points [0]-points [3]的值。如果多边形从顶部开始并逆时针缠绕,那么您的 T 坐标是错误的。 -
就像我说的,如果不知道你的多边形是如何缠绕的,就不可能说出来。但是如果它像我之前描述的那样缠绕,那么你应该交换每个坐标的第二个分量。 (例如 1 变成 0,0 变成 1)。
标签: opengl box2d glut texture-mapping texture2d