Конференция "Игры" » Как вращать спрайт в OpenGL [Delphi, Windows]
 
  • gamez (20.04.08 23:52) [0]
    Как вращать спрайт в OpenGL
    Нужно чтобы спрайт вращался вокруг своего центра.
    Сначала сделал и спрайт вращался вокруг центра своего размещения.
    Потом переделал и спрайт вращается вокруг своего центра.
    Но его координаты сместились и координаты других спрайтов тоже сместилися. Почему? Как это исправить?


    procedure TSprite.Draw(x: Single; y: Single; w: Integer; h: Integer; angle: Single; TexID: Cardinal);
    begin
     glBindTexture(GL_TEXTURE_2D,TexID);
     glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );

     glPushMatrix;
     glTranslatef(x,y,0);
     glrotatef(angle,0,0,1);
     glBegin(GL_QUADS);
    {    glTexCoord2f(0.0, 0.0); glVertex2f( 0, 0);
       glTexCoord2f(1.0, 0.0); glVertex2f( w, 0);
       glTexCoord2f(1.0, 1.0); glVertex2f( w, h);
       glTexCoord2f(0.0, 1.0); glVertex2f( 0, h);
    }

       glTexCoord2f(0.0, 0.0);glVertex2f(-w/2, -h/2);
       glTexCoord2f(1.0, 0.0);glVertex2f(w/2, -h/2);
       glTexCoord2f(1.0, 1.0);glVertex2f(w/2, h/2);
       glTexCoord2f(0.0, 1.0);glVertex2f(-w/2, h/2);
     glEnd();

     glPopMatrix;

    end;

    ----------------------------------------------------------------

    procedure ShowMenu;
    begin
    {=2D===}
     glClearColor(1,1,1,0);
     glLoadIdentity();                 // Очистить стек
     glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT or GL_STENCIL_BUFFER_BIT);
     glMatrixMode(GL_PROJECTION);
     glLoadIdentity;
     glOrtho(0, 0 + ew, 0 , 0 + eh, 0, 100);
     glMatrixMode(GL_MODELVIEW);
     glLoadIdentity;
     gldisable(GL_DEPTH_TEST);
    {======}

     glcolor3ub(255,255,255);
     fge.spt.Draw(0,0,800,600,0,MainMenuImage);

     glcolor3ub(255,255,255);
     fge.spt.Draw(180,100,469,261,0,ButtonBarsImage);

     glcolor3ub(255,255,255);
     fge.spt.Draw(180,100,160,120,Angle,CrossImage);

     glcolor3ub(255,255,255);
     fge.spt.Draw(fge.inp.X,-fge.inp.Y+600,45,44,0,MouseImage);

    end;

  • XProger © (21.04.08 06:04) [1]
    glTranslate / glRotate
  • Sergio666 © (01.05.08 20:12) [2]

    > XProger ©   (21.04.08 06:04) [1]
    > glTranslate / glRotate

    Ни в коем случае! Начнуться вопросы типа "а почему у меня крутиться не так, как надо и куда-то смещается" :)

    Делай для каждого спрайта центр и задавай координаты как
    центр.х + cos(угол_поворота) * размер_по_х
    центр.y + cos(угол_поворота) * размер_по_у
  • @!!ex © (01.05.08 20:15) [3]
    > центр.х + cos(угол_поворота) * размер_по_х
    > центр.y + cos(угол_поворота) * размер_по_у

    убийа скорости. :)
  • Sergio666 © (01.05.08 20:25) [4]
    убийа скорости. :)

    Зато правильно и надежно! :)
    А скорость cos и sin на современных CPU не так важно. И на крайняк можно переложить вычисления на GPU
 
Конференция "Игры" » Как вращать спрайт в OpenGL [Delphi, Windows]
Есть новые Нет новых   [134430   +3][b:0][p:0.002]