Перекомпонованная матрица из разложенной матрицы не совпадает - PullRequest
1 голос
/ 10 марта 2012

Это вопрос знаний о матрице, я говорю о XNA, но только для справки

Я разложил матрицу на XNA и получил разложенные значения, затем просто попытался создать снова Матрица из этих значений и результирующая Матрица не совпадает с исходной

Я пытался нормализовать кватернион

Я пытался сгенерировать матрицу вращения из кватерниона

Я пытался поменять местами порядок трансформации SRT, STR, TRS, TSR, RST, RTS

Почему я это делаю? Я создаю свой собственный импортер моделей и сравниваю свои результаты с XNA, использующим ту же модель, поэтому я читаю почти (с некоторым десятичным различием) тот же источник SRT, что и разложенные значения XNA, но моя результирующая матрица не соответствует XNA, поэтому я вернулся к основам и попытался разложить / перекомпоновать Матрица XNA, но я обнаружил, что она не соответствует ни

Это исходные значения матрицы XNA

?this.XNAModel.Bones[0].Transform
{{M11:1.331581E-06 M12:-5.551115E-17 M13:1 M14:0} 
{M21:1 M22:-4.16881E-11 M23:-1.331581E-06 M24:0} 
{M31:4.16881E-11 M32:1 M33:8.15331E-23 M34:0}
{M41:0.03756338 M42:37.46099 M43:2.230549 M44:1} }

Разложение, lFlag верно

bool lFlag = this.XNAModel.Bones[0].Transform.Decompose(out lDecScale, out lDecRotation, out lDecTranslation);

//decomposed values
?lDecScale
{X:1 Y:1 Z:1}

?lDecRotation    //quat
{X:-0.5000003 Y:-0.4999996 Z:-0.4999996 W:0.5000004}

?lDecTranslation
{X:0.03756338 Y:37.46099 Z:2.230549}

Перекомпоновать матрицу из разложенных значений, я перепробовал все комбинации SRT

//lDecRotation.Normalize();

Matrix lRecompose = Matrix.CreateScale(lDecScale) * 
Matrix.CreateFromQuaternion(lDecRotation) * Matrix.CreateTranslation(lDecTranslation);

Quaternion не нормализовал результат с использованием SRT, не соответствует исходной матрице

?lRecompose
{{M11:1.430511E-06 M12:-5.960464E-08 M13:0.9999999 M14:0}
{M21:0.9999999 M22:1.192093E-07 M23:-1.370907E-06 M24:0}
{M31:-5.960464E-08 M32:0.9999999 M33:1.192093E-07 M34:0}
{M41:0.03756338 M42:37.46099 M43:2.230549 M44:1} }

нормализованный по кватерниону результат с использованием СТО, не соответствует исходной матрице

?lRecompose
{{M11:1.192093E-06 M12:-5.960464E-08 M13:1 M14:0}
{M21:1 M22:-1.192093E-07 M23:-1.370907E-06 M24:0}
{M31:-5.960464E-08 M32:1 M33:-1.192093E-07 M34:0}
{M41:0.03756338 M42:37.46099 M43:2.230549 M44:1} }

Вот что прочитал мой импортер моделей

?this.ModelNew.Bones[0].Scale 
{X:1 Y:1 Z:1}

?this.ModelNew.Bones[0].Rotation 
{X:-0.0002303041 Y:-8.604798E-05 Z:-5.438289}

Существует небольшая разница между этим результатом и Декомпозированным из XNA

//My importer, based on the above Rotation Vector,  converted to radians 
?lQuat    {X:-0.4999999 Y:-0.5 Z:-0.5 W:0.4999999}
//XNA  
{X:-0.5000003 Y:-0.4999996 Z:-0.4999996 W:0.5000004}

?this.ModelNew.Bones[0 ].Translation
{X:0.03756338 Y:37.46099 Z:2.230549}

1 Ответ

1 голос
/ 17 декабря 2014

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

Кстати, правильный порядок перекомпоновки - сначала перевести, затем повернуть, затем масштабировать.

...