quaternion class