summaryrefslogtreecommitdiff
path: root/project.py
blob: 801a4de513653ed341c4e82c11d70d368fad3024 (plain)
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]