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