HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > OpenGL > Матричные преобразования
Страницы (2): [1] 2 »   Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
FreeSlave
Житель форума

Дата регистрации: Nov 2007
Проживает: Тула
Сообщений: 1077

Рейтинг



Матричные преобразования

Я много читал про матричные преобразования в openGL и у меня накопились тонны негодования по тому, как они описываются.

Во-первых, почти везде сказано, что мы двигаем/вращаем объект. Но в OpenGL нет геометрических объектов, он процедурный, мы просто указываем что рисовать, и он рисует это снова и снова, не сохраняя у себя.

Во-вторых, порядок умножения, возникает много путаницы между нотацией opengl и математической и никогда непонятно, какая именно используется. Допустим такой код (старый API для простоты):
glRotatef(30, 0.0, 0.0, 1.0); //M1
glTranslatef(0.5, 0.0, 0.0); //M2
glRotatef(90, 0.0, 0.0, 1.0); //M3
Математически, я так понимаю, будет так - v' = M1*M2*M3*v, где v - точка, которую мы передвигаем, v' - её новое положение. Эти преобразования верны, если мы выполняем их относительно начальной системы координат. Но тут же пишут про реверсивный порядок, будто бы должно быть M3*M2*M1*v. Возможно кому-то удобнее так представлять - можно двигать систему координат в таком порядке и потом рисовать точку в новой системе координат вместо того, чтобы двигать точку, но математическая сторона здесь становится неясна. В OpenGL матрицы хранятся в транспонированном виде, так что в математической записи это будет верно только если представить, что все матрицы уже транспонированы, а вектор-строка стоит слева, и здесь уже совсем непонятно, что имеется в виду под записью.

В общем, подскажите где можно про всё это почитать и чтоб не возникало никакой путаницы.

Сообщить модератору | | IP: Записан
Сообщение: 122235

Старое сообщение 30-06-2013 10:08
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34498
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Цитата:
FreeSlave писал:
Математически, я так понимаю, будет так - v' = M1*M2*M3*v

Правильно, всё так и будет. Просто надо привыкнуть к тому, что в опенгле матрицы колумн-мажор, и (M1*M2)обычное = (M2*M1)OpenGL.
Цитата:
FreeSlave писал:
если представить, что все матрицы уже транспонированы, а вектор-строка стоит слева, и здесь уже совсем непонятно, что имеется в виду под записью.

Вектор-столбец стоит справа, а матрицы перемножаются в обратном порядке, т.к. транспонированы, что ж тут непонятнова?
Если это вызывает у тебя путаницу, то почитай про glClipPlane и glLightfv(GL_POSITION), это должно гарантированно взорвать твой мозг.

__________________
Правдой дорожить, лжи не потакать,
Дальних не судить, ближним помогать,
С тишиной сойтись на исходе дня
Научи меня, Родина моя!

Сообщить модератору | | IP: Записан
Сообщение: 122239

Старое сообщение 30-06-2013 10:39
-
FreeSlave
Житель форума

Дата регистрации: Nov 2007
Проживает: Тула
Сообщений: 1077

Рейтинг



XaeroX, при умножении транспонированных матриц результат остается транспонированным (относительно математической записи), т.е. умножать вектор на такую матрицу было бы неправильно. Если M - результат перемножения транспонированных матриц, то запись M*v = v' некорректна. Меня это и смущает, матчасть то ясна, неясна запись, ибо непонятно когда что имеется в виду.

Сообщить модератору | | IP: Записан
Сообщение: 122247

Старое сообщение 30-06-2013 11:33
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34498
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Цитата:
FreeSlave писал:
при умножении транспонированных матриц результат остается транспонированным

Кажется, у нас с тобой разное представление о том, как перемножаются матрицы.

__________________
Правдой дорожить, лжи не потакать,
Дальних не судить, ближним помогать,
С тишиной сойтись на исходе дня
Научи меня, Родина моя!

Сообщить модератору | | IP: Записан
Сообщение: 122248

Старое сообщение 30-06-2013 12:06
-
FreeSlave
Житель форума

Дата регистрации: Nov 2007
Проживает: Тула
Сообщений: 1077

Рейтинг



Я имею в виду, M2*M1 != transpose(M1)*transpose(M2), соответственно и вектор будет на разные матрицы умножаться при таком раскладе.

Однако M2*M1 == transpose(transpose(M1)*transpose(M2)).

Сообщить модератору | | IP: Записан
Сообщение: 122249

Старое сообщение 30-06-2013 12:28
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32188
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
FreeSlave писал:
Но в OpenGL нет геометрических объектов, он процедурный

Чо?
Цитата:
FreeSlave писал:
он рисует это снова и снова, не сохраняя у себя.

Чтоб "сохранял у себя" используй VBO.
Цитата:
FreeSlave писал:
много путаницы между нотацией opengl и математической

Нет никакой "нотации опенгл". Есть row-major и column-major организация матриц.

Я к слову, никогда в жизни не читал документации по OpenGL.
Но почему-то не имею проблем ни с клипплейнами ни с матрицами.
Наверное если бы прочитал - тоже запутался.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 122252

Старое сообщение 30-06-2013 13:30
-
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34498
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Цитата:
FreeSlave писал:
M2*M1 != transpose(M1)*transpose(M2)

Уверен?

__________________
Правдой дорожить, лжи не потакать,
Дальних не судить, ближним помогать,
С тишиной сойтись на исходе дня
Научи меня, Родина моя!

Сообщить модератору | | IP: Записан
Сообщение: 122255

Старое сообщение 30-06-2013 14:03
-
FreeSlave
Житель форума

Дата регистрации: Nov 2007
Проживает: Тула
Сообщений: 1077

Рейтинг



Дядя Миша, я имел в виду, что вместо того, чтобы удалять/создавать "объекты", мы просто решаем, что рисовать, а что нет. Есть фреймворки, где, например, можно добавить на сцену прямоугольник - он там и останется, пока его не удалишь, а в opengl мы напрямую даём команды для рисования прямоугольника. Разные подходы к описанию сцены, как-то так. В общем, лучше б было, если бы писали что-нибудь вроде "двигает координаты" вместо "двигает объект".

Таки вроде разобрался, надо было не в сторону транспонирования смотреть, а в сторону ассоциативности умножения, тогда всё ясно становится.

Xaerox, ну вот например во freemat http://codepad.org/N3krRg5G

Сообщить модератору | | IP: Записан
Сообщение: 122256

Старое сообщение 30-06-2013 14:16
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34498
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


FreeSlave
Ага, точно. А я всегда думал, что равно. Что с дурака взять.

Добавлено 30-06-2013 в 21:33:

По правде говоря, все эти матрицы совершенно не нужны. Задача сделать матрицу вида или матрицу трансформации возникает пару-тройку раз за весь движок. Я обычно просто генерирую функцию для этих целей.

Добавлено 30-06-2013 в 21:34:

Цитата:
Дядя Миша писал:
Но почему-то не имею проблем ни с клипплейнами ни с матрицами.

Потому что все проблемы с клипплейнами решил BUzer, когда мы пешком под стол ходили. И теорию объяснил, и пример кода дал.

__________________
Правдой дорожить, лжи не потакать,
Дальних не судить, ближним помогать,
С тишиной сойтись на исходе дня
Научи меня, Родина моя!

Сообщить модератору | | IP: Записан
Сообщение: 122257

Старое сообщение 30-06-2013 14:34
-
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32188
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
FreeSlave писал:
я имел в виду, что вместо того, чтобы удалять/создавать "объекты", мы просто решаем, что рисовать, а что нет

Это ты перепутал OpenGL с игровым движком.

Цитата:
XaeroX писал:
Потому что все проблемы с клипплейнами решил BUzer

Проблема с клипплейном ровно одна - если не работает, то инвертировать distance. Других у меня не было.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 122264

Старое сообщение 30-06-2013 16:42
-
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34498
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Цитата:
Дядя Миша писал:
Проблема с клипплейном ровно одна - если не работает, то инвертировать distance. Других у меня не было.

Проблема в том, что он умножается на какую-то там матрицу, и плоскость в итоге оказывается не той, что ты хотел. Там надо уравнение плоскости хитро преобразовывать.

__________________
Правдой дорожить, лжи не потакать,
Дальних не судить, ближним помогать,
С тишиной сойтись на исходе дня
Научи меня, Родина моя!

Сообщить модератору | | IP: Записан
Сообщение: 122266

Старое сообщение 30-06-2013 17:32
-
FreeSlave
Житель форума

Дата регистрации: Nov 2007
Проживает: Тула
Сообщений: 1077

Рейтинг



XaeroX, даже если используется пару раз, всё равно ведь понять надо, ибо эти разы одни из самых важных

Вот, кстати, всё-таки нашёл книгу Addison Wesley - OpenGL Programming Guide, где нормально объяснено и оба подхода к пониманию указаны (двигаем точки, оставляя систему координат фиксированной / двигаем систему координат, располагая точки относительно неё).

Сообщить модератору | | IP: Записан
Сообщение: 122267

Старое сообщение 30-06-2013 17:42
- За что?
pRoxxx
Житель форума

Дата регистрации: Jan 2011
Проживает: UA DP
Сообщений: 360
Возраст: 32

Рейтинг



Цитата:
FreeSlave писал:
Addison Wesley - OpenGL Programming Guide,

Какое издание? И если у тебя на русском то поделись позязя.

Отредактировано pRoxxx 30-06-2013 в 20:33

Сообщить модератору | | IP: Записан
Сообщение: 122273

Старое сообщение 30-06-2013 20:27
- За что?
FreeSlave
Житель форума

Дата регистрации: Nov 2007
Проживает: Тула
Сообщений: 1077

Рейтинг



pRoxxx, 2009. На русском ни одного издания не видел.

Сообщить модератору | | IP: Записан
Сообщение: 122275

Старое сообщение 30-06-2013 20:34
- За что?
Government-Man
Призрак

Дата регистрации: Apr 2006
Проживает: N/A
Сообщений: 3507

Рейтинг



Награды
 
[1 награда]


Тю, я тоже матрицы напрямую строю из оригинов и углов Эйлера. В попу все эти Translatef, Rotatef и прочее УГ...

Сообщить модератору | | IP: Записан
Сообщение: 122281

Старое сообщение 30-06-2013 23:01
- За что?
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 18:09. Новая тема    Ответить
Страницы (2): [1] 2 »   Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > OpenGL > Матричные преобразования
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

На основе vBulletin
Авторское право © 2000 - 2002, Jelsoft Enterprises Limited.
Дизайн и программирование: Crystice Softworks © 2005 - 2024