Fundamentos de Computação Gráfica Prof. Marcelo Gattass Guilherme Schirmer de Souza Introdução O objetivo dessa apresentação é fazer uma breve descrição teórica do terceiro trabalho da disciplina de Fundamentos de Computação Gráfica. O trabalho consistia em rotacionar um objeto em torno de um eixo qualquer através da utilização de um Arcball. Arcball Arcball é uma técnica de computação gráfica que utiliza o mouse como entrada para ajustar a orientação espacial de um objeto. Para isso é utilizada uma esfera ao redor desse objeto e através do clique e arraste de um determinado ponto da esfera através do mouse tal objeto é rotacionado. Figura 1 Técnicas de Rotação Existem diversas técnicas de rotação para girar objetos no espaço tridimensional. Nesse trabalho foram utilizadas duas técnicas de rotação: matriz de rotação e quatérnios. Os diagramas abaixo mostram um esquemático de cada técnica: Matriz Quatérnio Pontos xyz (base da câmera) Pontos xyz (base da câmera) Conversão do xyz para a base do arcball Conversão de xyz para a base do arcball Obtenção da matriz de rotação Obtenção do quatérnio de rotação Correção dos eixos do arcball Correção dos eixos do arcball Pontos xyz – base da câmera Para que a rotação de um arcball possa ser realizada, é necessário obter um arco de rotação. Tal arco é obtido quando o usuário clica na esfera e arrasta o mouse, tendo assim dois pontos dessa esfera em relação a base da câmera. Tais pontos são obtidos através do seguinte processo: pt.x = (screen.x – center.x)/radius; pt.y = (screen.y – center.y)/radius; r = pt.x*pt.x + pt.y*pt.y; IF r > 1.0 THEN s = 1.0/Sqrt[r]; pt.x = s*pt.x; pt.y = s*pt.y; pt.z = 0.0; ELSE pt.z =Sqrt[1.0 - r]; onde pt é o ponto da esfera, screen é o ponto da imagem (ponto bidimensional) e center é o centro da esfera na imagem. Conversão de pontos entre bases Suponhamos duas bases {e1,e2,e3} e {f1,f2,f3}. Para convertermos da primeira base para a segunda temos o seguinte conjunto de equações: R ( e1 ) f 1 a11 e1 a 21 e 2 a 31 e 3 R ( e 2 ) f 2 a12 e1 a 22 e 2 a 32 e3 R ( e 3 ) f 3 a13 e1 a 23 e 2 a 33 e 3 Logo, para transformamos os pontos da base da câmera {(1,0,0), (0,1,0),(0,0,1)} para a base do arcball {(arc->ex.x, arc>ey.x, arc->ez.x),(arc->ex.y, arc->ey.y, arc->ez.y),(arc->ex.z, arc->ey.z, arc>ez.z)} basta multiplicar tais pontos pela matriz: arc- ex.x arc- ex.y arc- ex.z arc- ey.x arc- ey.y arc- ey.z arc- ez.x arc- ez.y arc- ez.z Matriz de Rotação A seguinte matriz realiza a rotação de um objeto em torno de um eixo (ex, ey,ez) qualquer: cos (1 cos ) e x2 e x e y (1 cos ) e z sin M e e (1 cos ) e sin x z y 0 e y e x (1 cos ) e z sin e z e x (1 cos ) e y sin cos (1 cos ) e y e z e y (1 cos ) e x sin e y e z (1 cos ) e x sin cos (1 cos ) e z 0 0 2 2 0 0 0 1 onde θ é o ângulo de rotação dos pontos ao redor do eixo e. O eixo e é obtido através da normal do plano formado pelo dois pontos do arco de rotação. Tal normal é calculada através do produto vetorial dos dois pontos: e pt 0 Xpt 1 Já o cosθ é obtido através do produto interno entre os mesmos dois pontos: cos ( pt 0 . pt 1 ) O senθ é naturalmente obtido através da relação trigonométrica sen x cos 2 2 x 1 Correção dos eixos do arcball Após ser feita a rotação do arcball, é necessário fazer a atualização dos eixos desse arcball. Essa atualização é feita através da multiplicação de cada eixo do arcball pela matriz inversa de rotação. Quatérnio de Rotação Quatérnio é uma ramificação da matemática que generaliza o cálculo vetorial e os números complexos. Em computação gráfica são muito úteis para realizar rotações de objetos. Um quatérnio de rotação é determinado pelo cosseno do ângulo de rotação (parte real) e o eixo de rotação (parte imaginária): q (cos , ( e x , e y , e z )) Finalmente, para finalizar a técnica por quatérnio, basta converter esse para uma matriz de rotação para após isso ser feito o ajuste dos eixos. Tal matriz é calculada pela seguinte forma: Matrix m; m.m[0] = 1 - 2*(q.y*q.y + q.z*q.z); m.m[1] = 2*(q.x*q.y + q.z*q.w); m.m[2] = 2*(q.x*q.z - q.y*q.w); m.m[3] = 0; m.m[4] = 2*(q.x*q.y - q.z*q.w); m.m[5] = 1 - 2*(q.x*q.x + q.z*q.z); m.m[6] = 2*(q.y*q.z + q.x*q.w); m.m[7] = 0; m.m[8] = 2*(q.x*q.z + q.y*q.w); m.m[9] = 2*(q.y*q.z - q.x*q.w); m.m[10] = 1 - 2*(q.x*q.x + q.y*q.y); m.m[11] = 0; m.m[12] = 0; m.m[13] = 0; m.m[14] = 0; m.m[15] = 1; Software Referências Notas de Aula. http://pt.wikipedia.org/wiki/Teoria_de_qu aternions http://www.cs.wisc.edu/graphics/Course s/559f2001/Examples/Gl3D/MyArcBall.cpp http://www.java-tips.org/other-apitips/jogl/arcball-rotation-nehe-tutorialjogl-port.html http://rainwarrior.thenoos.net/dragon/arc ball.html http://www.tecgraf.pucrio.br/~mgattass/Quaternios.pdf http://www.tecgraf.pucrio.br/~mgattass/fcg/material/shoemake 92.pdf