import numpy as np from itertools import repeat from chroma.transform import rotate def from_film(position, axis1=(0,0,1), axis2=(1,0,0), size=(800,600), width=0.035, focal_length=0.018): height = width*(size[1]/float(size[0])) x = np.linspace(width/2, -width/2, size[0]) z = np.linspace(-height/2, height/2, size[1]) zz, xx = np.meshgrid(z,x) grid = np.array(zip(xx.flatten(),repeat(0),zz.flatten())) axis1 = np.asarray(axis1)/np.linalg.norm(axis1) axis2 = np.asarray(axis2)/np.linalg.norm(axis2) assert axis1.dot(axis2) == 0.0 if (axis1 != (0,0,1)).any(): grid = rotate(grid, np.arccos(axis1.dot((0,0,1))), np.cross(axis1,(0,0,1))) if (axis2 != (1,0,0)).any(): grid = rotate(grid, np.arccos(axis2.dot((1,0,0))), np.cross(axis2,(1,0,0))) grid -= np.cross(axis1,axis2)*focal_length return grid+position, -grid/np.apply_along_axis(np.linalg.norm,1,grid)[:,np.newaxis]