1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
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]
|