Try   HackMD

CAMA : ma03 Matrice Camera

Cours du 30 / 03

Calculons l'image que genere une camera :

  • positionnee en
    (cx,cy,cz)
  • regardant dans la direction
    (vx,vy,vz)
  • avec un angle de rotation
    cθ
    (que l'on prend = 0 pour commencer)
  • avec une focale
    f

On a pour tout point

X de l'espace sa position
x
sur l'image donnée par

x=PX

  • P
    : matrice qui représente l'action de la caméra.

Le but est de trouver

P.

Dimensions

  • X
    : point en 3D
    • on rajoute une dimension pour les translations (cf ma02) :
      X=(Xx,Xy,Xz,1)
  • x
    : point en 2D
    • pour les translation :
      x=(xx,xy,1)
  • P
    matrice de dimensions
    34

Repères

3 reperes :

  • celui du monde en en 3D
  • celui de l'image en 2D
  • celui de la camera en 3D

Focale

On représente la focale comme la distance entre l'origine est la position virtuelle de l'image 2D.

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

Dans le repere de la camera :

x=fXzX=fXXz.

Si on bouge uniquement la focale, et que le repere de la camera est le meme que celui du monde alors :

si P=[f0000f000010] on a PX=[fXxfXyXz]

C'est presque le resultat recherche, on a

x a un facteur
Xz
pret.

Pour garantir

xz=1 on ajoute une normalisation :

f = 0.5 # focale F = lambda f: np.array([[f, 0, 0, 0], [0, f, 0, 0], [0, 0, 1, 0]])
F = array([[0.5, 0. , 0. , 0. ],
       [0. , 0.5, 0. , 0. ],
       [0. , 0. , 1. , 0. ]])
def normalize(x): x[0,:] /= x[2,:] x[1,:] /= x[2,:] return x[:2,:]

Changement de repère

L'axe principal de la camera est

z, soit
x
dans le repere du monde 3D. On choisit comme repère inital de la caméra :
(x,y,z)cam=(y,z,x)3D
.

La matrice de passage est:

Xcam=[010001100]X3D

Pour respecter la notation

(x,y,z,1) :
P=[f0000f000010][0100001010000001]

Translation de la caméra

Si la camera est en

(cx,cy,cz) et non en
(0,0,0)
, c'est une translation :

T=[100cx010cy001cz0001]

Axe principal de la caméra

On change la direction de la camera et son axe principal n'est plus

x du monde 3D.

Pour pointer un vecteur 3D dans une direction, il faut 2 rotations autour de 2 axes orthogonaux a notre vecteur. En 2D il suffit d'une rotation autour de

z.

Pour diriger la camera dans une direction

v, les rotations se font autour des axes
z
et
y
du monde:

  • la rotation horizontale
    ψ
    tourne autour de
    z
  • la rotation verticale
    ϕ
    tourne autour de
    y

D=[cos(ϕ)0sin(ϕ)00100sin(ϕ)0cos(ϕ)00001][cos(ψ)sin(ψ)00sin(ψ)cos(ψ)0000100001]

def D(ah, av): if type(ah) == int: ah = ah * 2 * np.pi / 360 av = av * 2 * np.pi / 360 rh = np.array([[np.cos(ah), -np.sin(ah), 0, 0], [np.sin(ah), np.cos(ah), 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) rv = np.array([[np.cos(av), 0, np.sin(av), 0], [0, 1, 0, 0], [-np.sin(av), 0, np.cos(av), 0], [0, 0, 0, 1]]) return rv @ rh