Это вопрос знаний о матрице, я говорю о 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}