Hello Llama,
in fact both
camera.transform.mulv(Metashape.Vector([0,0,1])).normalized()
and
(camera.transform.mulp(camera.sensor.calibration.unproject(Metashape.Vector([camera.sensor.width/2 + camera.sensor.calibration.cx, camera.sensor.height/2 + camera.sensor.calibration.cy]))) - camera.center).normalized()
are equal because
camera.sensor.calibration.unproject(Metashape.Vector([camera.sensor.width/2 + camera.sensor.calibration.cx, camera.sensor.height/2 + camera.sensor.calibration.cy])) = Metashape.Vector([0,0,1])
see following code looping over 3 selected cameras in Chunk:
In [5]: chunk = Metashape.app.document.chunk
In [6]: for camera in [camera for camera in chunk.cameras if camera.selected]:
...: if not camera.transform:
...: continue #skip NA cameras
...: v1 = camera.transform.mulv(Metashape.Vector([0,0,1])).normalized()
...: v2 = (camera.transform.mulp(camera.sensor.calibration.unproject(Metashape.Vector([camera.sensor.width/2 + camera.sensor.calibration.cx, camera.sensor.height/2 + camera.sensor.calibration.cy]))) - camera.center).normalized()
...: print(v1,v2)
...:
2019-11-08 23:29:52 Vector([-0.1033289536400215, -0.08265002582222386, -0.9912073953372443]) Vector([-0.10332895364002148, -0.08265002582222358, -0.9912073953372443])
2019-11-08 23:29:52 Vector([0.13798561502657053, -0.021950523948559043, -0.9901909636752514]) Vector([0.13798561502657047, -0.02195052394855912, -0.9901909636752514])
2019-11-08 23:29:52 Vector([-0.08735553645833521, -0.2356092436143632, -0.9679138879949727]) Vector([-0.08735553645833517, -0.23560924361436314, -0.9679138879949727])