Страницы (2): [1] 2 » Показать все 17 сообщений этой темы на одной странице |
HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- OpenGL (https://hlfx.ru/forum/forumdisplay.php?forumid=7)
-- Матричные преобразования (https://hlfx.ru/forum/showthread.php?threadid=3990)
Матричные преобразования
Я много читал про матричные преобразования в 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 матрицы хранятся в транспонированном виде, так что в математической записи это будет верно только если представить, что все матрицы уже транспонированы, а вектор-строка стоит слева, и здесь уже совсем непонятно, что имеется в виду под записью.
В общем, подскажите где можно про всё это почитать и чтоб не возникало никакой путаницы.
__________________
XaeroX, при умножении транспонированных матриц результат остается транспонированным (относительно математической записи), т.е. умножать вектор на такую матрицу было бы неправильно. Если M - результат перемножения транспонированных матриц, то запись M*v = v' некорректна. Меня это и смущает, матчасть то ясна, неясна запись, ибо непонятно когда что имеется в виду.
__________________
Я имею в виду, M2*M1 != transpose(M1)*transpose(M2), соответственно и вектор будет на разные матрицы умножаться при таком раскладе.
Однако M2*M1 == transpose(transpose(M1)*transpose(M2)).
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
__________________
Дядя Миша, я имел в виду, что вместо того, чтобы удалять/создавать "объекты", мы просто решаем, что рисовать, а что нет. Есть фреймворки, где, например, можно добавить на сцену прямоугольник - он там и останется, пока его не удалишь, а в opengl мы напрямую даём команды для рисования прямоугольника. Разные подходы к описанию сцены, как-то так. В общем, лучше б было, если бы писали что-нибудь вроде "двигает координаты" вместо "двигает объект".
Таки вроде разобрался, надо было не в сторону транспонирования смотреть, а в сторону ассоциативности умножения, тогда всё ясно становится.
Xaerox, ну вот например во freemat http://codepad.org/N3krRg5G
FreeSlave
Ага, точно. А я всегда думал, что равно. Что с дурака взять.
Добавлено 30-06-2013 в 21:33:
По правде говоря, все эти матрицы совершенно не нужны. Задача сделать матрицу вида или матрицу трансформации возникает пару-тройку раз за весь движок. Я обычно просто генерирую функцию для этих целей.
Добавлено 30-06-2013 в 21:34:
__________________
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
__________________
XaeroX, даже если используется пару раз, всё равно ведь понять надо, ибо эти разы одни из самых важных
Вот, кстати, всё-таки нашёл книгу Addison Wesley - OpenGL Programming Guide, где нормально объяснено и оба подхода к пониманию указаны (двигаем точки, оставляя систему координат фиксированной / двигаем систему координат, располагая точки относительно неё).
pRoxxx, 2009. На русском ни одного издания не видел.
Тю, я тоже матрицы напрямую строю из оригинов и углов Эйлера. В попу все эти Translatef, Rotatef и прочее УГ...
Временная зона GMT. Текущее время 08:32. | Страницы (2): [1] 2 » Показать все 17 сообщений этой темы на одной странице |
На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024