perspective = function(p){
    camera.transform() // recalculate the transform
    // `ip` is the vector of the poin in "camera space" aka, as if the camera
    // was at (0, 0, 0)
    var ip = i.multiVector(p) /*copy `p`*/, target = [0, 0, -f]
      , Az = ip[2], Bz = target[2], scale
    if(Az === 0) Az = 0.00001
    scale = Bz / Az
    if(scale < 0) scale = 0
    // return [ x, y, distance-to-the-camera, scale ]
    return [ip[0] * scale, ip[1] * scale, (ip[2] - f), scale]
  }
of the form:
[ [1, 0, 0, tx]
, [0, 1, 0, ty]
, [0, 0, 1, tz]
, [0, 0, 0, 1]]