02 - Quatérnios¶
Quatérnios possuem vários usos, porém aqui vamos nos concentrar nos recursos de realizar rotações no espaço 3D. A construção matemática do quatérnio é em geral expressa da seguinte forma:
$$ q = q_r + q_i \mathbf{i} + q_j \mathbf{j} + q_k \mathbf{k} $$
Podemos calcular o comprimento de um quatérnio com a seguinte fórmula:
$$ |q| = \sqrt{q\bar{q}} = \sqrt{q_i^2 + q_j^2 + q_k^2 + q_r^2} $$
A multiplicação de quatérnios é um recurso que permite fazer as operações de rotação. Uma das formas de fazer essa opção é por um processo distributivo:
$$ pq = (p_r + p_i i + p_j j + p_k k)(q_r + q_i i + q_j j + q_k k) \\ = (p_r q_r - p_i q_i - p_j q_j - p_k q_k) + (...)i + (...)j + (...)k $$
Outra forma é usando os recursos de multiplicação escalar e vetorial:
$$ pq = p_r q_r - \mathbf{p} \cdot \mathbf{q} + p_r \mathbf{q} - q_r \mathbf{p} + \mathbf{p} \times \mathbf{q} $$
Não se esqueça que a ordem da multiplicação é importante, e o cuidado que você deve ter é na multiplicação dos imaginários. Assim siga sempre a seguinte regra:
$$ \mathbf{i}^2 = \mathbf{j}^2 = \mathbf{k}^2 = -1, \mathbf{ijk} = -1 \\ \mathbf{ij} = \mathbf{k}, \quad \mathbf{jk} = \mathbf{i}, \quad \mathbf{ki} = \mathbf{j} \\ \mathbf{ji} = -\mathbf{k}, \quad \mathbf{kj} = -\mathbf{i}, \quad \mathbf{ik} = -\mathbf{j} $$
Rotações podem ser calculadas no espaço 3D pelas matrizes de rotação, que usam coordenadas de Euler diretamente. Como visto em aula, essas matrizes têm suas limitações:
$$ \mathbf{R}_{x,\theta} = \begin{bmatrix} 1 & 0 & 0 \\ 0 & \cos\theta & -\sin\theta \\ 0 & \sin\theta & \cos\theta \end{bmatrix} \quad \mathbf{R}_{y,\theta} = \begin{bmatrix} \cos\theta & 0 & \sin\theta \\ 0 & 1 & 0 \\ -\sin\theta & 0 & \cos\theta \end{bmatrix} \quad \mathbf{R}_{z,\theta} = \begin{bmatrix} \cos\theta & -\sin\theta & 0 \\ \sin\theta & \cos\theta & 0 \\ 0 & 0 & 1 \end{bmatrix} $$
Uma alternativa é através de quatérnios. Para isso se pode criar o quatérnio de rotação com a seguinte fórmula:
$$ q = \cos \left(\frac{\theta}{2}\right) + \sin \left(\frac{\theta}{2}\right) u_x \mathbf{i} + \sin \left(\frac{\theta}{2}\right) u_y \mathbf{j} + \sin \left(\frac{\theta}{2}\right) u_z \mathbf{k} $$
Existem duas formas de aplicar a rotação por quatérnios, uma é multiplicando o vetor que se deseja rotacionar pelo quatérnio e depois pelo seu conjugado:
$$ rot(\mathbf{v}) = q \cdot \mathbf{v} \cdot q^{-1} $$
A outra forma é colocar os valores do quatérnio em uma matriz e então multiplicar o vetor. A matriz de rotação usando quatérnios usa a seguinte construção:
$$ R = \begin{bmatrix} 1 - 2(q_y^2 + q_z^2) & 2(q_x q_y - q_z q_r) & 2(q_x q_z + q_y q_r) & 0 \\ 2(q_x q_y + q_z q_r) & 1 - 2(q_x^2 + q_z^2) & 2(q_y q_z - q_x q_r) & 0 \\ 2(q_x q_z - q_y q_r) & 2(q_y q_z + q_x q_r) & 1 - 2(q_x^2 + q_y^2) & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} $$
Vamos verificar se os quatérnios funcionam mesmo.
a) Assuma um ponto (0, 1, 0), faça uma rotação por Z de 45° usando a matriz de rotação por coordenadas de Euler e depois por quatérnios, verifique se os resultados coincidem.
b) Continue a rotação do ponto acima, porém agora além da rotação em Z, faça também uma rotação de 45° em X.
c) Continue mais uma vez a rotação do ponto, agora com mais uma rotação em Y de 45°.