Собственный, повернуть vector3d с кватернионом? - PullRequest
0 голосов
/ 24 мая 2018

У меня есть массив точек 3d, как std::vector<Eigen::Vector3d>.

Мне нужно преобразовать эти точки с помощью позиции и кватерниона.

Мои вопросы:

Как я могу повернуть эти точки с кватернионом?И есть ли более быстрый способ, чем:

    Eigen::Vector3d Trans; // position to move by
    Eigen::Quaterniond quats;  // quat to rotate by

for (int p = 0; p < objectPoints.size(); p++)
        {
            Eigen::Vector3d pnt;
            //add pose
            pnt.x = objectPointsTri[p].x + -Trans.x();
            pnt.y = objectPointsTri[p].y + -Trans.y();
            pnt.z = objectPointsTri[p].z + -Trans.z();

            Eigen::Vector3d pntRot = // rotate pnt by the quaternion



        }

Ответы [ 2 ]

0 голосов
/ 09 сентября 2018

Ответ от @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

Ггаэль попросил васизменить способ решения проблемы по этим причинам эффективности.

0 голосов
/ 24 мая 2018

Оператор * выполнит работу, и вы, конечно, можете упростить свой код:

pnt = objectPointsTri[p] - Trans;
pntRot = quat * pnt;

или даже:

pnt = quat * (objectPointsTri[p] - Trans);

или, если вы храните свои баллы вa Matrix3Xd:

Matrix3Xd in_pts;
Matrix3Xd out_pts;
Affine3d T = quats * Translation3d(-Trans);
out_pts = T * in_pts;
...