Довольно распространенная задача в компьютерной анимации требует «смешивания» двух или более аффинных преобразований вместе или, более точно, сформулированных, вычисления средневзвешенного значения преобразований. Аффинное преобразование состоит из сдвига, вращения, сдвига и масштаба. Каждый компонент имеет уникальные характеристики, поэтому его необходимо рассматривать независимо. (Ради этого очень краткого обсуждения я не буду беспокоиться о весах и пропущу компонент сдвига.)

Перевод

Усреднение компонентов перевода очень просто. Поскольку перевод в измерениях разделяется по отдельным осям, понятно, что для получения среднего перевода мы можем просто использовать среднее арифметическое, с которым почти все знакомы.

Масштаб

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

К сожалению, в такой форме среднее геометрическое не так легко понять с первого взгляда. В идеале было бы лучше продолжать работать со сложением и делением, а не с умножением и квадратными корнями. Так получилось, что одним из наиболее полезных свойств логарифма является превращение умножения в сложение, логарифмическое тождество утверждает, что log (ab) = log (a) + log (b). Таким образом, среднее геометрическое можно выразить как экспоненту среднего арифметического логарифмов.

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

Вращение

Несомненно, самый сложный компонент - это вращение. Обычно считается, что лучший способ интерполировать между двумя вращениями - это использовать алгоритм кватернионного слерпа Shoemake. Однако из-за некоммутативного свойства умножения вращения его нельзя распространить на вычисление среднего значения вращения.

Поскольку масштаб и вращение комбинируются посредством умножения, возникает справедливый вопрос, можно ли использовать логарифмическое преобразование для вычисления среднего геометрического для вращения? К счастью, можно определить показатель степени и логарифм кватерниона, и, к счастью, класс Maya MQuaternion реализует оба метода.

Обратите внимание, что полученное вращение является только приближением, для более точного решения я предлагаю взглянуть на Сферическое взвешенное среднее или этот алгоритм QUEST от НАСА!

Удачного смешивания!