code: def vectors(self, pos, vel, roll=0.0, pitch=0.0, yaw=0.0):
          
          # TODO: yaw steering mode !
  
          # Fake nadir: This is the intersection point between the satellite
          # looking down at the centre of the ellipsoid and the surface of the
          # ellipsoid. Nadir on the other hand is the point which vertical goes
          # through the satellite...
          # nadir = -pos / vnorm(pos)
  
          nadir = subpoint(-pos)
          nadir /= vnorm(nadir)
  
          # x is along track (roll)
          x = vel / vnorm(vel)
  
          # y is cross track (pitch)
          y = np.cross(nadir, vel, 0, 0, 0)
          y /= vnorm(y)
  
          # rotate first around x
          x_rotated = qrotate(nadir, x, self.fovs[0] + roll)
          # then around y
          xy_rotated = qrotate(x_rotated, y, self.fovs[1] + pitch)
          # then around z
          return qrotate(xy_rotated, nadir, yaw)
docs: Get unit vectors pointing to the different pixels.
  
          *pos* and *vel* are column vectors, or matrices of column
          vectors. Returns vectors as stacked rows.