Как повернуть множество объектов, представленных кватернионом? - PullRequest
1 голос
/ 15 февраля 2012

Скажите, что ориентация объекта представлена ​​кватернионом. Если я хочу повернуть этот объект, я просто умножу кватернион на вращательный кватернион.

object.q = q_rotation*(object.q)

Затем для объекта, состоящего из набора меньших объектов. Как мне повернуть его?

class Object
{
 public:
    std::vector<Object> part;
    Point centre; //Point is basically double x, y, z
    Quaternion q;

    void RotateBy(Quaternion q_rotation);

};

Просто скажите, что этот объект состоит из двух частей. И каждая часть может иметь свой собственный центр и q, и они относятся ко всему пространству (не относительно центра основного объекта).

Тогда теперь я хочу повернуть объект, и все его части также должны повернуться и обновиться до своих новых центров и q. Части будут повернуты относительно центра основного объекта.

Как мне это сделать ??? Я нашел много ссылок, которые показывают, как это сделать с помощью трансформационной матрицы. Но есть ли способ сделать это напрямую с кватернионом?

Возможно, другими словами, как повернуть кватернион со смещенным началом координат?

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 21 февраля 2012

Это на самом деле проще, чем я думал.Я думаю, что эти классы линейной алгебры были действительно полезны.

В этом случае я предполагаю, что у вас есть некоторая трехмерная геометрия, определенная как класс с именем «GeomType».«Объект» состоит из множества «GeomType».Здесь «Объект» - это просто вектор «GeomType».Каждый «GeomType» в «Объекте» определяется его местоположением центральной точки относительно центральной точки «Объекта» и кватернионом, который представляет поворот из нейтральной позиции по умолчанию.Вот пример кода.

Есть также PointType, который в основном (x, y, z) в двойном, и QuaternionType, который также (w, x, y, z) в двойном.

//suppose you have this Object
std::vector <GeomType> Object; //and it is already initialized
//you were given the rotation quaternion and the point to rotate about.
PointType origin;
QuaternionType Q2;

//rotate the GeomTypes
unsigned int numGeom = Object.size();
for (unsigned int i = 0; i <numGeom; i++)
{
    //1. translate the individual GeomType
    const PointType geomCentre= Object[i].GetCentrePosition();

    //Rotate vector representing the direction and distance from origin to geom
    //note that the origin of rotation does not need to be the centre
    const PointType newPos = 
          RotateAbout(PointType(geomCentre[0], geomCentre[1], dGeomPos[2]),
                                                         Q2, origin);
    //move the GeomType to the new position
    Object[i].SetCentrePosition(newPos.GetX(), newPos.GetY(), newPos.GetZ());

    //2. Rotate the GeomType
    QuaternionType Qo = Object[i].GetQuaternion(); //current quaternion of the geom
    QuaternionType Qr; //resultant quaternion of the geom

    Qr = Q2*Qo; //rotating by multiplication 
    //(please check other sites on how to multiply quaternions)

    Object[i].SetQuaternion(Qr); //set the new quaternion
}

Это функция RotateAbout, которая использовалась для поворота вектора вокруг точки

PointType RotateAbout(const PointType &InitPos, const QuaternionType &Qr, const PointType& Origin)
{
     //the vector from the origin
     PointType newVec = InitPos-Origin;
     //extract the magnitude
     const double vecLength = newVec.Length();

     //normalize the vector and rotate that vector
     //then translate the geom to the new position
     newVec = Origin + Qr*(newVec.GetUnitVector())*vecLength;

     return newVec;
}

Здесь представлена ​​общая программа для поворота набора трехмерных объектов относительно точки.Он должен быть применим к любому языку программирования, хотя он написан на основе C ++.

...