-
в общем, мне надо поворачивать текстуру, а она смещается при повороте и не могу понять почему и как это исправить. Помогите кто может, очень нужно.
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;
-
>поворачивать текстуру Относительно какой точки? Чтобы повернуть, например, относительно центра (cx, cy) Перенос на (-cx, -cy) Поворот на нужный угол Обратный перенос на (cx, cy)
-
относительно центра размер объекта 32 на 32 сх и су это координаты персонажа? тобишь сх=Перс[i].x ?
-
>сх и су это координаты персонажа? Это координаты точки, относительно которой производится вращение. Например, если нужно вращать прямоугольник R относительно его центра, то cx = R.Left + (R.Width div 2)
-
Не помогает, прямоугольник улетает вообще не известно куда и не вращается как надо.
сх:=Перс[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;
-
Прописал вручную смещение по нескольким промежуткам углов(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
То он нормально вращается вокруг своей точки.....
-
Решение гениально размер спрайта 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;
И вауля спрайт вращается вокруг своего центра)
-
Чисто из спортивного интереса: а почему в конце 2014 года Вы всё ещё пользуетесь glBegin() / glEnd() ? Хрен уж там с ними, с программируемыми конвейерами — но хоть VBO-то можно использовать, приличия ради.
-
Удалено модератором
-
Я OpenGL не занимался, только прочёл пару самоучителей, для общего развития. И всюду на glBegin() / glEnd(). =) Если не сложно, подскажите как называется то что вы советуете на замену этому? Вдруг соберусь заняться вплотную. А кроме glBegin() / glEnd() и не слышал.
А к автору топа вопрос, просто не въеду никак, любопытно очень - "повернуть текстуру чтоб она оставалась на месте" - это кккак вообще? 0__о Вылить воду из стакана, чтоб вода осталась на месте? Повернуть - это уже будет не на месте. %)))
-
Удалено модератором
|