?

Log in

No account? Create an account
27 фев, 2009 @ 15:44 Матрицы в Direct3D и OpenGL
Настроение: 3D
Музыка: Rainbow . "Self Portrait"
Вызрел концептуальный вопрос.
Я начинал с Direct3D, и он меня достал. :) Как именно, расписывать не буду: все это и так знают.
Решил продолжить изыскания на OpenGL в силу его простоты, платформенной независимости и, главное, преемственности версий.
После долгих раздумий в качестве формата входных данных оставил нехороший .х из Директа (спасибо всем, кто давал мне по форматам советы), прежде всего потому, что иначе у меня не было бы под рукой работающей программы, с которой мог бы сверяться на каждом этапе.
Сделал парсер .х, создал набор базовых классов и, после долгих мучений, запустил таки анимацию.
Последнее мучение было особо суровым: при полном совпадении скелетных данных с моделью в Директе у меня на экран вместо дамочки вылезали сплющенные кракозябры. И вот, вспомнив совет мудрого человека, я транспонировал результирующую матрицу преобразования вершин, прикреплённых к данной кости. Получилось вот что:

for(unsigned i=0;i
[Error: Irreparable invalid markup ('<m_uinumbones;i++)>') in entry. Owner must fix manually. Raw contents below.]

Вызрел концептуальный вопрос.
Я начинал с Direct3D, и он меня достал. :) Как именно, расписывать не буду: все это и так знают.
Решил продолжить изыскания на OpenGL в силу его простоты, платформенной независимости и, главное, преемственности версий.
После долгих раздумий в качестве формата входных данных оставил нехороший .х из Директа (спасибо всем, кто давал мне по форматам советы), прежде всего потому, что иначе у меня не было бы под рукой работающей программы, с которой мог бы сверяться на каждом этапе.<lj-cut>
Сделал парсер .х, создал набор базовых классов и, после долгих мучений, запустил таки анимацию.
Последнее мучение было особо суровым: при полном совпадении скелетных данных с моделью в Директе у меня на экран вместо дамочки вылезали сплющенные кракозябры. И вот, вспомнив совет мудрого человека, я транспонировал результирующую матрицу преобразования вершин, прикреплённых к данной кости. Получилось вот что:

for(unsigned i=0;i<m_uiNumBones;i++)
{
pBone=m_pSkeleton->GetBone(i);
pmat=pBone->GetMatOffset();

m_pBoneMatrices[i]=(*pmat);
pmat=pBone->GetMatCombined();

m_pBoneMatrices[i]*=(*pmat);

m_pBoneMatrices[i].transpose();

}

Где MatOffset - обратная матрица преобразования вершин кости, а MatCombined - результирующее положение кости после применения к иерархии анимаций и перемещений модели.
Так вот вопрос: как я понял, матрицы в OpenGL и Direct3D при аналогичном использовании транспонированы по отношению друг к другу. На все ли матрицы это распространяется или только на некоторые? В таком случае в матрице преобразования вектор сдвига надо брать из столбца? Как обычно решают подобную проблему разработчики, пишущие игру сразу для двух API (на выбор пользователя и т.п.)?
</lj-cut>
gekisai:
[User Picture Icon]
From:brainslugs.blogspot.com
Date:Февраль, 27, 2009 15:55 (UTC)
(Ссылка)
Не знаю как там в .x, а в API да, и сдвиг в столбце.

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

Кроме того, при использовании glLoadMatrix* и подобных функций нужно помнить что в памяти в OpenGL матрицы хранятся по столбцам, а не по строкам, если об этом забыть, опять таки получишь транспонированную матрицу.
(Ответить) (Ветвь дискуссии)
From:gekisai
Date:Февраль, 28, 2009 05:41 (UTC)
(Ссылка)
Спасибо, парни! Чувствую, придется мне писать свою библиотеку векторов, кватернионов и матриц, дабы ни от кого не зависеть. :)
А вообще замечательное сообщество: ответили и по делу практически моментально.
(Ответить) (Ветвь дискуссии)
From:gekisai
Date:Март, 2, 2009 04:07 (UTC)
(Ссылка)
Т.е. если я комбинирую матричные преобразования А и В, то результирующая матрица будет В*А, а не А*В?
Так?
(Ответить) (Ветвь дискуссии)