% Projeção de pontos, usando coordenadas cartesianas
%
% Universidade Federal de Minas Gerais -- UFMG
% Instituto de Ciências Exatas -- ICEx
% Departamento de Ciência da Computação -- DCC
%
% Disciplina: Visão Computacional
% Professor:  Mario Fernando Montenegro Campos
% Monitor:    Vilar Fiuza da Camara Neto


% Seqüência de transformações para projetar pontos 3D em pontos 2D:
% - translação 3D (posição da câmera)
M1 = [eye(3), -T; 0, 0, 0, 1]
% - rotação 3D (orientação da câmera)
M2 = [inv(R), [0, 0, 0]'; 0, 0, 0, 1]
% - projeção (3D -> 2D)
M3 = [1, 0, 0, 0; 0, 1, 0, 0; 0, 0, 1 / f, 0]
% - escala (tamanho dos pixels)
M4 = diag([1 ./ s; 1])
% - translação 2D (coordenadas do centro da imagem)
M5 = [eye(2), o; 0, 0, 1]

% Matriz de transformação equivalente à aplicação de todas as transformações
% anteriores, em seqüência
M = M5 * M4 * M3 * M2 * M1

% Teste: pontos da cena em coordenadas homogêneas...
[Pc; ones(1, np)]
% ... sofrendo a transformação M...
Pih = M * [Pc; ones(1, np)]
% ... resultam em pontos de imagem, que podem ser convertidos novamente em
% coordenadas cartesianas
Pih = Pih(1:2, :) ./ repmat(Pih(3, :), 2, 1)
