realidade virtual aula 4 remis balaniuk. exercício de montagem de um objeto 3d –escreva um...
TRANSCRIPT
Realidade VirtualAula 4
Remis Balaniuk
Exercício de Montagem de um objeto 3D
– Escreva um projeto no Chai que crie um cubo, centrado na origem do sistema de coordenadas (0,0,0), com lados tendo tamanho 1.
– Programe uma tecla que dê uma volta com a câmera ao redor do cubo.
– Programe uma tecla que dê uma volta com a luz ao redor do cubo.
Transformações
• Os modelos (topologias) dos objetos de uma cena virtual normalmente não mudam durante uma simulação, e quando precisam mudar por exigência da aplicação isso requer algoritmos e interfaces que podem ser bastante complexos.
• Já a representação dos objetos mudam constantemente e isso pode ser feito por uma série de operações matemáticas razoavelmente simples chamadas de transformações.
Transformações
• As transformações de Translação, Escala e Rotação que serão apresentadas neste módulo são o “coração” de todas as aplicações em Computação Gráfica.
• Veremos que as transformações podem ser expressas de forma simples, através da Multiplicação Matricial e que as Coordenadas Homogêneas permitem um tratamento uniforme para as transformações.
• Começaremos estudando as transformações em 2D para depois extende-las a 3D.
Princípios das Transformações 2D
• Transformações são usadas para gerar um novo ponto (x’, y’) a partir das coordenadas (x,y) de um ponto que descreve o objeto original.
• Se o objeto original é uma linha, é suficiente aplicar as transformações aos pontos extremos e então desenhar a linha entre os dois pontos transformados para obter a transformação da linha.
• O mesmo é verdade para polígonos e objetos.• Ou seja, se temos que, por exemplo, rotacionar
um objeto tridimensional complexo, basta aplicar a mesma operação de rotação a todos os seus pontos e este terá sido rotacionado.
Princípios das Transformações 2D
• As transformações ditas “rígidas” são aquelas que não mudam a topologia ou a forma do objeto, só a sua representação.
• As tranformações rígidas básicas são a translação, rotação e a mudança de escala.
• Qualquer movimentos complexo em 3D pode ser decomposto nessas 3 transformações básicas.
• Por exemplo, um objeto que cai está ao mesmo tempo se transladando e rodando (rotacionando em torno de sí mesmo) ao mesmo tempo.
Princípios das Transformações 2D
• Como as transformações são aplicadas vértice a vértice do objeto, a aplicação uma a uma de cada transformação básica para compor um movimento complexo causaria movimentos não realistas e seria muito custoso em termos de performance.
• Por isso é importante que múltiplas transformações possam ser “concatenadas”, ou combinadas de forma a definir um movimento mais complexo numa única operação a ser aplicada sobre os vértices.
• Duas transformações combinadas então devem produzir uma única transformação que tem o mesmo efeito que a aplicação seqüencial das duas transformações originais.
• Assim, se T é uma transformação de translação e R uma transformação de rotação, pela propriedade da concatenação C = TR é uma transformação que produz o efeito combinado das duas transformações originais – translação e rotação.
Dica
• Se você não conhece ou não lembra os conceitos básicos de matrizes (soma, multiplicação, transposição, matriz identidade, etc) procure estuda-los para aproveitar melhor esse capítulo do curso.
Transformação de Translação (Translation)
• Pontos do Plano XY podem ser deslocados (transladados) para novas posições através da adição de um deslocamento às coordenadas desses pontos.
• Considerando um vetor de deslocamento d=(dx,dy), consideramos que dx representa um deslocamento paralelo ao eixo X e dy um deslocamento paralelo ao eixo Y.
• Assim, para um ponto p=(x,y), a translação definirá uma nova posição p’=(x’,y’)=(x,y) + (dx,dy) = (x+dx,y+dy).
• Em notação matricial: P=(x y), T=(dx dy) e P’=P+T
Exemplo de translação dx=150,dy=50
Transformação de Escala (Scale)
• Pontos podem ser submetidos a transformação de escala segundo os valores sx e sy (fatores de escala) que significam compressão (se 0<s<1) ou estiramento (se s>1) segundo as direções dos eixos X e Y respectivamente.
• Para o ponto p=(x,y) sua nova posição pode ser obtida pela multiplicação de seus valores, segundo as seguintes equações:– x’=x*sx e y’=y* sy
Transformação de Escala (Scale)
• Vamos considerar um ponto P(x y) como sendo uma Matriz [1x2]. Se multiplicarmos por uma Matriz [2x2], obteremos uma outra Matriz, também [1x2], que podemos interpretar como sendo um outro ponto:
• Se então P’=P.S e (x’,y’)=(x.Sx, y.Sy)
y
x
s
syxyx0
0.''
y
x
s
sS
0
0
Transformação de Escala (Scale)• exemplos de escala para o polígono do exemplo anterior:
•a esquerda: (sx=1 sy=0.5), a direita: (sx=1, sy=2)
Transformação de Escala (Scale)
• Note-se que a operação de escala é relativa à origem do sistema de coordenadas.
• O polígono torna-se menor e mais próximo dos eixos quando o fator de escala é menor que 1.0.
• Se os fatores de escala forem maiores que 1.0, o polígono será maior e mais afastado dos eixos.
• Para evitar esse efeito de afastamento/aproximação deve-se primeiro fazer uma translação do objeto para a origem do sistema de coordenada, seguida da escala, seguida da translação oposta para que volte à posição original.
• Note que as proporções do polígono também mudaram devido às escalas diferenciadas.
• Temos uma escala diferenciada quando sx sy e uma escala uniforme quando sx = sy.
• Numa escala uniforme as proporções não são afetadas pela transformação.
Transformação de Rotação (Rotation)
• Pontos podem sofrer rotação de um ângulo (phi) relativa à origem.
• A rotação 2D, no sentido anti-horário, é definida matematicamente como:
• Na forma matricial:
• Se então P’=P.R
)cos(.)sin(.'
)sin(.)cos(.'
yxy
yxx
)cos()sin(
)sin()cos().()''(
yxyx
)cos()sin(
)sin()cos(
R
Transformação de Rotação (Rotation)
• Ângulos positivos são medidos no sentido anti-horário, de X para Y e sentido horário para ângulos negativos.
• As equações que definem matematicamente a rotação são melhor entendidas se aplicarmos os princípios da Trigonometria a partir da ilustração da fig. abaixo:
x’=L.cos(+) = L.cos()cos()-L.sin()sin() = x. cos()-y. sin()
X=L.cos() e y= L.sin()
y’=L.sin(+) = L.sin()cos()+L.cos()sin() = x. sin()+y. cos()
Transformação de Rotação (Rotation)
• Exemplo de rotação do polígono anterior com =30°:
Transformação de Rotação (Rotation)
• Note-se novamente que a rotação ocorre relativa à origem do sistema de coordenadas e não em torno de sí mesmo
• Para obter uma rotação em torno de sí mesmo deve-se primeiro fazer uma translação do objeto para a origem do sistema de coordenada, seguida da rotação, seguida da translação oposta para que volte à posição original.
Coordenadas Homogêneas
• A representação matricial para translação, escala e rotação é, respectivamente:– P’=P+T, P’=P.S e P’=P.R
• Infelizmente, segundo essas equações, a translação é tratada diferentemente (como uma adição) em comparação com a escala e a rotação (multiplicações).
• Seria importante podermos tratar todas as três transformações de forma uniforme ou homogênea e assim poder facilmente combiná-las (concatená-las). Veremos agora como fazer isso.
Coordenadas Homogêneas
• Se expressarmos os pontos em Coordenadas Homogêneas, as três transformações poderão ser tratadas como multiplicações matriciais.
• Coordenadas homogêneas foram desenvolvidas na Geometria e posteriormente aplicadas na Computação Gráfica.
• Em coordenadas homogêneas, um ponto P (x, y) é representado como P (w.x, w.y, w) para qualquer fator de escala w 0.
• Assim, dado um Ponto P (x, y, w) em Coordenadas Homogêneas podemos obter sua representação em coordenadas cartesianas 2D efetuando o seguinte cálculo: x=x/w e y=y/w
Coordenadas Homogêneas
• No espaço Bi-Dimensional , w será adotado como igual a 1 e portanto não executaremos as divisões.
• Neste caso, o uso das coordenadas homogêneas tem somente o objetivo de permitir a combinação das três transformações geométricas básicas.
• Em coordenadas homogêneas a representação matricial da transformação de Translação é:
– A matriz da direita é chamada de “matriz de transformação”
1
010
001
).1()1''(
yx dd
yxyx
Coordenadas Homogêneas
• De forma semelhante, a representação matricial da transformação de Escala é:
• Finalmente, a representação matricial da transformação de Rotação é:
100
00
00
).1()1''( y
x
S
S
yxyx
100
0)cos()sin(
0)sin()cos(
).1()1''(
yxyx
Coordenadas Homogêneas• Como exemplo do uso de coordenadas homogêneas, vamos imaginar
o que acontece se um ponto P é transladado por T1 com deslocamento (dx1 , dy1) para P’ e então transladado por T2 com deslocamento (dx2 , dy2) para P’’.
• Intuitivamente podemos esperar que o resultado seja uma translação composta e igual a (dx1 + dx2, dy1 + dy2).
• Então vejamos: P’=P. T1 e P’’=P’. T2 , logo P’’=(P. T1). T2 , ou seja P’’=P. T1. T2 , ou:
• A matriz resultante de T1.T2 é chamado de composição ou concatenação das duas translações.
1
010
001
).1(
1
010
001
.
1
010
001
).1()1''''(
21212211 yyxxyxyx dddd
yx
dddd
yxyx
Combinação das Transformações 2D
• A idéia básica da composição de transformações reside no fato de que é mais eficiente aplicar uma única transformação composta a um ponto do que uma série de transformações simples, uma após a outra.
• Consideremos o problema da rotação de um objeto em torno de um ponto arbitrário P1.
• Como somente conhecemos a rotação em torno da origem, vamos converter nosso problema original (desconhecido) em três diferentes problemas (já conhecidos).
• Assim, para rotacionar em torno de P1, uma seqüência de três Transformações Fundamentais serão necessárias. – (1) – Transladar todo o objeto de forma de forma que P1 seja a nova
origem;– (2) – Rotacionar todo o objeto e– (3) – Transladar o objeto todo de volta de forma que a origem volte a
ser a inicial.
Combinação das Transformações 2D
• Considerando que P1 = (x1,y1), a primeira translação é de (-x1 , -y1) e a última translação é o inverso (x1 , y1).
Combinação das Transformações 2D
Combinação das Transformações 2D
• Um processo semelhante é usado na transformação de Escala de um Objeto relativa a um Ponto arbitrário P1 (para que esse ponto não se mova após a operação terminada).
• A sequência é a mesma do exemplo anterior: translação do objeto de forma que P1 esteja na origem, escala, translação do objeto para que P1 volte à sua posição original.
• A Composição dessas Transformações é:
Combinação das Transformações 2D
• Esta Composição de transformações, aqui demonstrada, será continuamente utilizada em nossas operações de visualização 2D e 3D.
• Devemos observar que normalmente a escolha de P1 - centro de rotação e de escala - não é arbitrária, mas convenientemente adotada como sendo o centro geométrico (ou de gravidade) do objeto.
• Desta forma, garantimos que as operações relacionadas com a origem do sistema de coordenadas (rotação e escala) não produzirão deslocamentos ou distorções indesejáveis nas imagens transformadas.
Exercício
• Para a figura abaixo, calcule a posição dos vértices após uma rotação de 90 em torno do ponto p2.
x
y
p1=(2,3) p2=(5,3)
p3=(3.5,1)
p4=(3.5,5)
Transformações em 3D
• A extensão de 2D para 3D é imediata nos casos de translação e escala:– Translação:
– Escala
1
0100
0010
0001
.''''
dzdydx
wzyxwzyx
1000
000
000
000
.''''Sz
Sy
Sx
wzyxwzyx
Transformações em 3D
• No caso da rotação é um pouco mais complicado.
• Um rotação 2D ocorre sempre em torno do eixo que “sai” do plano (z).
• Já uma rotação 3D pode ocorrer em torno de qualquer eixo.
• As rotações básicas, em torno dos eixos x,y e z do sistema de coordenadas do objeto, são chamadas de roll (em torno de x), pitch (em torno de z) e yaw (em torno de y)
Transformações em 3D
• A notação mais usada para definir uma rotação, usada pelo OpenGL e pelo Chai, é definida por um vetor 3D representando o eixo de rotação e um escalar representando o ângulo de rotação:– glRotate*(a,x,y,z)
Transformações em 3D
• A matriz de transformação no caso das rotações básicas seriam então definidas por:
1000
0cossin0
0sincos0
0001
:0,0,1,*aa
aaaglRotate
1000
0cos0sin
0010
0sin0cos
:0,1,0,*aa
aa
aglRotate
1000
0100
00cossin
00sincos
:1,0,0,*aa
aa
aglRotate
Transformações em 3D
• Para uma rotação em torno de um eixo qualquer (x,y,z) para um ângulo a a matriz de rotação é definida da seguinte forma:– v=(x,y,z)T – u=v/||v||=(x’,y’,z’)T ( ||v|| = )
–
– e M=uuT + (cos a)(I-uuT)+(sin a) S (I é a matriz identidade)
0''
'0'
''0
xy
xz
yz
S
222 zyx
Transformações em 3D
• A matriz de transformação será definida por:
• onde m representa os elementos da matriz de rotação M
1000
0
0
0
mmm
mmm
mmm
Transformações no SAI• Na classe cGenericObject as transformações são obtidas usando
os seguintes métodos: //! Translate this object by a specified offsetvoid translate(const cVector3d& a_translation);
//! Translate this object by a specified offset void translate(const double a_x, const double a_y,
const double a_z);
//! Rotate this object by multiplying with a specified rotation matrix
void rotate(const cMatrix3d& a_rotation);
//! Rotate this object around axis a_axis by angle a_angle (radians)
void rotate(const cVector3d& a_axis, const double a_angle);
Transformações no SAI
• Note que a rotação pode ser definida pela matriz de rotação ou pelo formato OpenGL com um eixo de rotação e um ângulo.
• As transformações no Chai ocorrem com relação à origem e orientação do sistema de coordenadas local.
• Não é possível concatenar transformações no Chai. Cada transformação pedida é realizada isoladamente, o que impede a mudança do centro da rotação por exemplo.
• Mudança de escala ainda não foi implementada no Chai.
Transformações no SAI
• A hierarquia de objetos tem um papel importante no resultado das transformações pois a origem e a orientação do sistema de coordenadas local de um objeto é definido pelo objeto pai (se for o objeto raiz será com relação à origem da cena).
• Veremos isso em detalhe na aula 5.
Exercícios
1) Adicione teclas aos projeto anterior do cubo de forma que seja possível mover e rotacionar o cubo em torno dos eixos principais usando as transformações nativas do Chai.
2) Adapte o cubo gerado de forma que ele não esteja definido em torno da origem e sim a uma distância de 0.5 da origem. Teste as teclas de rotação nessa configuração.
3) Reimplemente as operações de movimento do objeto calculando a matriz de transformação. Nessa implementação faça com que a rotação do objeto seja em torno de um ponto arbitrário definido como parâmetro.
4) Implemente um cubo que orbita continuamente em torno do centro e em torno de sí mesmo ao mesmo tempo.
Implementando rotações e translações diretamente
• No projeto aula3.bpr são propostas 4 rotinas que implementam rotações e translações manipulando matrizes de transformação (ao invés de simplesmente chamar os métodos translate e rotate do Chai).
• Essas rotinas ilustram os conceitos apresentados nessa aula e dão mais flexibilidade às transformações rígidas.
Implementando rotações e translações diretamente
• A rotina “roda” implementa a rotação de um objeto passado como parâmetro.
• A rotação é feita em torno de um centro de rotação (centroRot) seguindo um eixo de rotação (eixo) e com um certo ângulo (ângulo).
• O centro de rotação pode ser uma posição absoluta (nesse caso deve-se usar recalCentro=false) ou uma posição definida no sistema de coordenadas do próprio objeto (nesse caso deve-se usar recalCentro=true para que a posição global do centro seja recalculada).
void roda(cMesh *obj,cVector3d centroRot, cVector3d eixo, double angulo, bool recalCentro);
Implementando rotações e translações diretamente
• As rotinas “rotacao”, “translacao” e “multiplica” são subrotinas usadas para implementar “roda”.
• Note que “roda” lê a matriz de transformação atual do objeto através de obj->getPos() e obj->getRot() que fornecem respectivamente os dados de translação e rotação.
• Em seguida essa matriz é manipulada através dos métodos da classe cMatrixGL.
• No final de “roda” a matriz de transformação recalculada é colocada de volta no objeto usando:
obj->setRot(matriz.getRot()); obj->setPos(matriz.getPos());