【问题标题】:Texture showing Inverted Image显示倒置图像的纹理
【发布时间】: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


【解决方案1】:

无法发现我哪里出错了!

你没有做错任何事。 OpenGL 使用通常的转换只是将图像的原点放在左下角而不是左上角。顺便说一句,DIB/.bmp 文件支持任一排序。如果表头height字段为负值,则图片的原点在左下角。

基本上归结为知道图像文件的原点在哪里,以及图像的原点在 OpenGL 端的位置。

完全可以改变图像在 OpenGL 中的寻址方式,将原点放在左上角。

【讨论】:

    【解决方案2】:

    [问题已解决]

    是的,多边形的顶点是逆时针受伤的!并且交换坐标解决了问题,即顺序应该是 (0,1),(0,0),(1,0),(1,1)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-01
      • 1970-01-01
      • 2013-01-13
      • 1970-01-01
      • 2010-10-22
      • 2021-05-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多