Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Как повернуть текстуру чтоб она оставалась на месте [Delphi, Windows]


Ordan   (31.10.14 06:07

в общем, мне надо поворачивать текстуру, а она смещается при повороте и не могу понять почему и как это исправить. Помогите кто может, очень нужно.

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]

Удалено модератором


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо