Конференция "Игры" » Как повернуть текстуру чтоб она оставалась на месте [Delphi, Windows]
 
  • Ordan (31.10.14 06:07) [0]
    в общем, мне надо поворачивать текстуру, а она смещается при повороте и не могу понять почему и как это исправить. Помогите кто может, очень нужно.

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity;
    glOrtho(0, Glavnaya.ClientWidth, Glavnaya.Clientheight, 0, 0, 1);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity;
    glPushMatrix;

    glTranslatef(Перс[i].x,Перс[i].y,0);
    glRotatef(Рот, 0, 0, 1);
    OtryadTexture.Bind;
    glBegin(GL_QUADS);
    glTexCoord2f( (0   +(1-1)*32)/600, 1-(32+(1-1)*32)/400); glVertex2f(0,0);
    glTexCoord2f( (32+(1-1)*32)/600, 1-(32+(1-1)*32)/400); glVertex2f(32,0);
    glTexCoord2f( (32+(1-1)*32)/600, 1-(0+(1-1)*32)/400);glVertex2f(32,32);
    glTexCoord2f( (0   +(1-1)*32)/600, 1-(0+(1-1)*32)/400);glVertex2f(0,32);
    glEnd;
    glPopMatrix;
  • MBo © (02.11.14 05:54) [1]
    >поворачивать текстуру
    Относительно какой точки?
    Чтобы повернуть, например, относительно центра (cx, cy)
    Перенос на (-cx, -cy)
    Поворот на нужный угол
    Обратный перенос на (cx, cy)
  • Ordan (05.11.14 03:50) [2]
    относительно центра размер объекта 32 на 32
    сх и су это координаты персонажа? тобишь сх=Перс[i].x ?
  • MBo © (05.11.14 07:22) [3]
    >сх и су это координаты персонажа?
    Это координаты точки, относительно которой производится вращение.
    Например, если нужно вращать прямоугольник R относительно его центра, то
    cx = R.Left + (R.Width div 2)
  • Ordan (05.11.14 08:18) [4]
    Не помогает, прямоугольник улетает вообще не известно куда и не вращается как надо.

     сх:=Перс[i].x*64+(32 div 2);
     су:=Перс[i].y*64+(32 div 2);

     glMatrixMode(GL_PROJECTION);
     glLoadIdentity;
     glOrtho(0, Glavnaya.ClientWidth, Glavnaya.Clientheight, 0, 0, 1);
     glMatrixMode(GL_MODELVIEW);
     glLoadIdentity;

     glPushMatrix;

     glTranslatef(-сх,-су,0);
     glRotatef(Рот, 0, 0, 1);
     glTranslatef(сх,су,0);
     OtryadTexture.Bind;
     glBegin(GL_QUADS);
     glTexCoord2f( (0   +(1-1)*32)/600, 1-(32+(1-1)*32)/400); glVertex2f(0,0);
     glTexCoord2f( (32+(1-1)*32)/600, 1-(32+(1-1)*32)/400); glVertex2f(32,0);
     glTexCoord2f( (32+(1-1)*32)/600, 1-(0+(1-1)*32)/400);glVertex2f(32,32);
     glTexCoord2f( (0   +(1-1)*32)/600, 1-(0+(1-1)*32)/400);glVertex2f(0,32);
     glEnd;
     glPopMatrix;
  • Ordan (06.11.14 09:55) [5]
    Прописал вручную смещение по нескольким промежуткам углов(0-90,91-180 и тд) порнуха конечно но работает, правда немного дергается при вращении, что немного некрасиво.
    И все же хотелось бы сделать по нормальному.

    Если я рисую треугольник

    glBegin(GL_TRIANGLES);
    glColor3f(0,1,0);glVertex3f(50,0.0,0.0);
    glColor3f(0,1,0);glVertex3f(-50,-50,0.0);
    glColor3f(0,1,0);glVertex3f(-50,50,0.0);
    glEnd

    То он нормально вращается вокруг своей точки.....
  • Ordan (06.11.14 10:52) [6]
    Решение гениально
    размер спрайта 32 на 32

    glBegin(GL_QUADS);
    glTexCoord2f( (0   +(1-1)*32)/600, 1-(32+(1-1)*32)/400); glVertex2f(0,0);
    glTexCoord2f( (32+(1-1)*32)/600, 1-(32+(1-1)*32)/400); glVertex2f(32,0);
    glTexCoord2f( (32+(1-1)*32)/600, 1-(0+(1-1)*32)/400);glVertex2f(32,32);
    glTexCoord2f( (0   +(1-1)*32)/600, 1-(0+(1-1)*32)/400);glVertex2f(0,32);
    glEnd;

    при рисовке спрайта сдвигаем его на половину

    тобишь

    glBegin(GL_QUADS);
    glTexCoord2f( (0   +(1-1)*32)/600, 1-(32+(1-1)*32)/400); glVertex2f(-16,-16);
    glTexCoord2f( (32+(1-1)*32)/600, 1-(32+(1-1)*32)/400); glVertex2f(32-16,-16);
    glTexCoord2f( (32+(1-1)*32)/600, 1-(0+(1-1)*32)/400);glVertex2f(32-16,32-16);
    glTexCoord2f( (0   +(1-1)*32)/600, 1-(0+(1-1)*32)/400);glVertex2f(-16,32-16);
    glEnd;

    И вауля спрайт вращается вокруг своего центра)
  • полвторого © (13.11.14 20:41) [7]
    Чисто из спортивного интереса: а почему в конце 2014 года Вы всё ещё пользуетесь glBegin() / glEnd() ?
    Хрен уж там с ними, с программируемыми конвейерами — но хоть VBO-то можно использовать, приличия ради.
  • имя (30.11.14 19:50) [8]
    Удалено модератором
  • Endy (02.12.14 15:47) [9]
    Я OpenGL не занимался, только прочёл пару самоучителей, для общего развития. И всюду на glBegin() / glEnd(). =)
    Если не сложно, подскажите как называется то что вы советуете на замену этому? Вдруг соберусь заняться вплотную. А кроме glBegin() / glEnd() и не слышал.

    А к автору топа вопрос, просто не въеду никак, любопытно очень - "повернуть текстуру чтоб она оставалась на месте" - это кккак вообще? 0__о
    Вылить воду из стакана, чтоб вода осталась на месте? Повернуть - это уже будет не на месте. %)))
  • имя (20.10.15 19:45) [10]
    Удалено модератором
 
Конференция "Игры" » Как повернуть текстуру чтоб она оставалась на месте [Delphi, Windows]
Есть новые Нет новых   [118642   +47][b:0][p:0]