2013-11-17 4 views
0

У меня есть физическое тело, которое является 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) в нормализованных координатах текстуры соответствует нижнему левому углу текстурного изображения. (0,1) - верхний левый, (1,1) - верхний правый, а (1,0) - нижний правый. –

+0

И для полигонов и квадроциклов (0,0), (0,1), (1,1), (1,0) для отображения текстуры. – Vector

+0

Какая еще информация вам нужна? – Vector

ответ

0

[Проблема решена]

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

1

Невозможно определить место, где я ошибаюсь!

Вы ничего не делаете. OpenGL с использованием обычных преобразований просто ставит начало изображений в левом нижнем углу, а в верхнем левом углу. Файлы BTW, DIB/.bmp поддерживают либо упорядочивание. Если поле height в заголовке является отрицательным значением, происхождение изображения находится в левом нижнем углу.

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

Вполне возможно изменить способ обращений к изображениям в OpenGL, поставив начало в левом верхнем углу.