Set the sage up vector to point in the z direction.
Respect sage's mesh option for sage 3d graphics.
Take the transpose of transformation matrices from sage.

It still doesn't seem to be transforming arrow3d((0,0,0),(0,0,1)) correctly, though.
Scale text canvas to be square
Render text in the middle of the canvas