code: def _gl_look_at(self, pos, target, up):
          
          z = vector.normalise(pos - target)
          x = vector.normalise(vector3.cross(vector.normalise(up), z))
          y = vector3.cross(z, x)
  
          translate = matrix44.create_identity()
          translate[3][0] = -pos.x
          translate[3][1] = -pos.y
          translate[3][2] = -pos.z
  
          rotate = matrix44.create_identity()
          rotate[0][0] = x[0]  # -- X
          rotate[1][0] = x[1]
          rotate[2][0] = x[2]
          rotate[0][1] = y[0]  # -- Y
          rotate[1][1] = y[1]
          rotate[2][1] = y[2]
          rotate[0][2] = z[0]  # -- Z
          rotate[1][2] = z[1]
          rotate[2][2] = z[2]
  
          return matrix44.multiply(translate, rotate)
docs: The standard lookAt method
  
          :param pos: current position
          :param target: target position to look at
          :param up: direction up