Ответ от @ggael совершенно правильный, я просто хотел бы предоставить некоторую предысторию.
В этой статье Википедии они объясняют умножение кватернионных векторов v '= qvq -1 .Сокращение Eigen с operator*
, которое мы используем, по-видимому, также содержится в библиотеках Unity .
В текущей версии Eigen вы бы выбрали this overload operator*
, который вызывает _transformVector
template<typename RotationDerived,typename OtherVectorType>
struct rotation_base_generic_product_selector<RotationDerived,OtherVectorType,true>
{
...
EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE ReturnType run(const RotationDerived& r, const OtherVectorType& v)
{
return r._transformVector(v);
}
};
См. Замечания на _transformVector
здесь :
Есликватернион используется для поворота нескольких точек (> 1), тогда гораздо эффективнее сначала преобразовать его в матрицу 3х3.Сравнение стоимости операции для n преобразований:
- Quaternion2: 30n
- Через матрицу 3: 24 + 15n
Ггаэль попросил васизменить способ решения проблемы по этим причинам эффективности.