Pinhole Camera

De Codepixel

[editar] General

Es el modelo de cámara más simple, con una proyección de perspectiva.

Una cámara pinhole tiene una lente infinítamente pequeña, por lo que no tiene efectos como Depth of Field ni posibilidad de enfocar.

Se define por un ángulo de visión, denominado comúnmente fov (Field Of Vision) del que se genera una matriz de proyección, y una matriz de vista, que coloca los rayos en coordenadas de mundo.

[editar] Transformar coordenada de pixel en rayo

(u,v)\,\! = coordenadas del pixel en espacio de pantalla

M0 = V_{ pixels \to normalized } (Matriz de Viewport) , para pasar coordenadas de píxel, a coordenadas normalizadas de imagen.

M1 = Persp_{image space \to world space} ( Proyección de Perspectiva ), para pasar coordenadas de imagen, a coordenadas de cámara en 3D.

M2 = Coordenadas de cámara, a coordenadas de mundo (cambio de base usando, por ejemplo, Origen, Target, Up)

Transformación pantalla a mundo = M2 * M1 * M0

Punto pantalla en coordenadas de mundo = Transformación pantalla a mundo * ( u, v )

Origen del rayo = posicion de la camara

Direccion del rayo = || Punto pantalla coordenadas de mundo - origen ||

[editar] Transformar de rayo a coordenada de pixel

T\,\! = matriz que transforma un punto en pantalla a coordenadas de mundo

P_w\,\! = coordenadas del pixel en espacio de mundo

C_w\,\! = origen de los rayos

d_w\,\! = dirección del rayo

O_w\,\! = punto origen del plano de visión en coordenadas de mundo ( P_w\,\! cuando u,v = 0\,\!)

Igualdades

P_w = T * (u,v)\,\!

P_w = C_w + t d_w\,\!

N_w  \cdot P_w = d

Centramos el plano:

N_w  \cdot (P_w - O_w ) = 0

Substituimos:

N_w  \cdot ( (C_w + t d_w) - O_w ) = 0

Reducimos:

N_w  \cdot C_w + N_w \cdot (t d_w) = N_w \cdot O_w

Despejamos t :

t = \frac{N_w \cdot ( O_w - C_w )}{N_w \cdot d_w}

Calculamos coordenadas:

(u,v)= \frac{( C_w + t d_w )}{T}

Herramientas personales