1. Implemente um trecho de pseudocódigo para configurar uma câmera com uma função LookAt (observador, alvo).

Passo 1

O enunciado pede um pseudocódigo para configurar uma câmera usando a função LookAt(observador, alvo). O conteúdo é de computação gráfica, mais especificamente a construção da view matrix a partir da posição da câmera ( eye), do ponto que ela observa ( target) e de um vetor “para cima” ( up). Vamos usar operações vetoriais básicas: subtração, normalização, produto vetorial (cross) e produto escalar (dot).

Passo 2

Definimos as entradas da função:
  • \text{eye}: vetor posição da câmera.
  • \text{target}: vetor do ponto observado.
  • \text{up}: vetor que indica a direção “para cima” do mundo (por exemplo (0,1,0)).
    Esses três vetores nos permitem estabelecer um sistema de eixos ortonormais da câmera.

Passo 3

Calculamos o eixo “forward” (a direção para onde a câmera olha), normalizado:
f = \frac{\text{target} - \text{eye}}{\|\text{target} - \text{eye}\|}.

Passo 4

Obtemos o eixo “right” (horizontal da câmera) como o produto vetorial entre f e up, e normalizamos:
s = \frac{f \times up}{\|f \times up\|}.

Passo 5

Recalculamos o eixo “true up” (vertical da câmera) garantindo ortogonalidade completa:
u = s \times f.

Passo 6

Com os três eixos ortonormais s, u e f e a posição \text{eye}, montamos a view matrix. Uma forma direta é:
\text{View} = \begin{pmatrix} s_x & u_x & -f_x & 0\\\ s_y & u_y & -f_y & 0\\\ s_z & u_z & -f_z & 0\\\\ -\,s\cdot\text{eye} & -\,u\cdot\text{eye} & f\cdot\text{eye} & 1 \end{pmatrix}.
Essa matriz move o mundo de modo que a câmera fique na origem olhando para o eixo -z.

Resposta

function LookAt(eye, target, up):
    // \(1\). forward
    f \(=\) normalize(target - eye)
    // \(2\). right
    s \(=\) normalize(cross(f, up))
    // \(3\). true up
    u \(=\) cross(s, f)

    // \(4\). monta a view matrix
    view \(=\) Matrix\(4\).identity()
    view[\(0\)][\(0\)] \(=\) s.x;    view[\(0\)][\(1\)] \(=\) u.x;    view[\(0\)][\(2\)] \(=\) -f.x
    view[\(1\)][\(0\)] \(=\) s.y;    view[\(1\)][\(1\)] \(=\) u.y;    view[\(1\)][\(2\)] \(=\) -f.y
    view[\(2\)][\(0\)] \(=\) s.z;    view[\(2\)][\(1\)] \(=\) u.z;    view[\(2\)][\(2\)] \(=\) -f.z
    view[\(3\)][\(0\)] \(=\) -dot(s, eye)
    view[\(3\)][\(1\)] \(=\) -dot(u, eye)
    view[\(3\)][\(2\)] \(=\)  dot(f, eye)
    return view

Exercícios relacionados