# 2.2 Rotations and transformations

maspack.matrix contains a number classes that implement rotation matrices, rigid transforms, and affine transforms.

Rotations (Section A.1) are commonly described using a RotationMatrix3d, which implements a rotation matrix and contains numerous methods for setting rotation values and transforming other quantities. Some of the more commonly used methods are:

RotationMatrix3d();         // create and set to the identity
RotationMatrix3d(u, angle); // create and set using an axis-angle
setAxisAngle (u, ang);      // set using an axis-angle
setRpy (roll, pitch, yaw);  // set using roll-pitch-yaw angles
setEuler (phi, theta, psi); // set using Euler angles
invert ();                  // invert this rotation
mul (R)                     // post multiply this rotation by R
mul (R1, R2);               // set this rotation to R1*R2
mul (vr, v1);               // vr = R*v1, where R is this rotation

Rotations can also be described by AxisAngle, which characterizes a rotation as a single rotation about a specific axis.

Rigid transforms (Section A.2) are used by ArtiSynth to describe a rigid body’s pose, as well as its relative position and orientation with respect to other bodies and coordinate frames. They are implemented by RigidTransform3d, which exposes its rotational and translational components directly through the fields R (a RotationMatrix3d) and p (a Vector3d). Rotational and translational values can be set and accessed directly through these fields. In addition, RigidTransform3d provides numerous methods, some of the more commonly used of which include:

RigidTransform3d();         // create and set to the identity
RigidTransform3d(x, y, z);  // create and set translation to x, y, z
// create and set translation to x, y, z and rotation to roll-pitch-yaw
RigidTransform3d(x, y, z, roll, pitch, yaw);
invert ();                  // invert this transform
mul (T)                     // post multiply this transform by T
mul (T1, T2);               // set this transform to T1*T2
mulLeftInverse (T1, T2);    // set this transform to inv(T1)*T2

Affine transforms (Section A.3) are used by ArtiSynth to effect scaling and shearing transformations on components. They are implemented by AffineTransform3d.

Rigid transformations are actually a specialized form of affine transformation in which the basic transform matrix equals a rotation. RigidTransform3d and AffineTransform3d hence both derive from the same base class AffineTransform3dBase.