Это на самом деле проще, чем я думал.Я думаю, что эти классы линейной алгебры были действительно полезны.
В этом случае я предполагаю, что у вас есть некоторая трехмерная геометрия, определенная как класс с именем «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 ++.