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
29
30
31
32
33
34
35
36
37
|
import numpy as np
from itertools import repeat
from chroma.transform import rotate, normalize
def from_film(position=(0,0,0), axis1=(0,0,1), axis2=(1,0,0), size=(800,600),
width=0.035, focal_length=0.018):
"""Project rays from a piece of film located at whose focal point is
located at `position`. `axis1` and `axis2` specify the vectors pointing
along the length and height of the film respectively.
"""
height = width*(size[1]/float(size[0]))
axis1 = normalize(axis1)
axis2 = normalize(axis2)
dx0 = width/size[0]
dx1 = height/size[1]
# for i in range(size[0]):
# for j in range(size[1]):
# grid[i*size[1]+j] = axis1*dx1*j - axis2*dx0*i
x = np.arange(size[0])
y = np.arange(size[1])
yy, xx = np.meshgrid(y,x)
n = size[0]*size[1]
grid = -np.tile(axis2, (n,1))*xx.ravel()[:,np.newaxis]*dx0 + \
np.tile(axis1, (n,1))*yy.ravel()[:,np.newaxis]*dx1
grid += axis2*width/2 - axis1*height/2
grid -= np.cross(axis1,axis2)*focal_length
return grid+position, normalize(-grid)
|