Realidade Virtual Aula 4 Remis Balaniuk Exerccio de
Realidade Virtual Aula 4 Remis Balaniuk
Exercício de Montagem de um objeto 3 D – 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 2 D para depois extende-las a 3 D.
Princípios das Transformações 2 D • 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 2 D • 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 3 D 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 2 D • 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 [1 x 2]. Se multiplicarmos por uma Matriz [2 x 2], obteremos uma outra Matriz, também [1 x 2], que podemos interpretar como sendo um outro ponto: • Se então P’=P. S e (x’, y’)=(x. Sx, y. Sy)
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 2 D, no sentido anti-horário, é definida matematicamente como: • Na forma matricial: • Se então P’=P. 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( ) e y= L. sin( ) x’=L. cos( + ) = L. cos( )-L. sin( ) = x. cos( )-y. 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 2 D 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”
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 é:
Coordenadas Homogêneas • Como exemplo do uso de coordenadas homogêneas, vamos imaginar o que acontece se um ponto P é transladado por T 1 com deslocamento (dx 1 , dy 1) para P’ e então transladado por T 2 com deslocamento (dx 2 , dy 2) para P’’. • Intuitivamente podemos esperar que o resultado seja uma translação composta e igual a (dx 1 + dx 2, dy 1 + dy 2). • Então vejamos: P’=P. T 1 e P’’=P’. T 2 , logo P’’=(P. T 1). T 2 , ou seja P’’=P. T 1. T 2 , ou: • A matriz resultante de T 1. T 2 é chamado de composição ou concatenação das duas translações.
Combinação das Transformações 2 D • 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 P 1. • 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 P 1, uma seqüência de três Transformações Fundamentais serão necessárias. – (1) – Transladar todo o objeto de forma que P 1 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 2 D • Considerando que P 1 = (x 1, y 1), a primeira translação é de (-x 1 , -y 1) e a última translação é o inverso (x 1 , y 1).
Combinação das Transformações 2 D
Combinação das Transformações 2 D • Um processo semelhante é usado na transformação de Escala de um Objeto relativa a um Ponto arbitrário P 1 (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 P 1 esteja na origem, escala, translação do objeto para que P 1 volte à sua posição original. • A Composição dessas Transformações é:
Combinação das Transformações 2 D • Esta Composição de transformações, aqui demonstrada, será continuamente utilizada em nossas operações de visualização 2 D e 3 D. • Devemos observar que normalmente a escolha de P 1 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 p 2. y p 4=(3. 5, 5) p 1=(2, 3) p 2=(5, 3) p 3=(3. 5, 1) x
Transformações em 3 D • A extensão de 2 D para 3 D é imediata nos casos de translação e escala: – Translação: – Escala
Transformações em 3 D • No caso da rotação é um pouco mais complicado. • Um rotação 2 D ocorre sempre em torno do eixo que “sai” do plano (z). • Já uma rotação 3 D 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 3 D • A notação mais usada para definir uma rotação, usada pelo Open. GL e pelo Chai, é definida por um vetor 3 D representando o eixo de rotação e um escalar representando o ângulo de rotação: – gl. Rotate*(a, x, y, z)
Transformações em 3 D • A matriz de transformação no caso das rotações básicas seriam então definidas por:
Transformações em 3 D • 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=uu. T + (cos a)(I-uu. T)+(sin a) S (I é a matriz identidade)
Transformações em 3 D • A matriz de transformação será definida por: • onde m representa os elementos da matriz de rotação M
Transformações no SAI • Na classe c. Generic. Object as transformações são obtidas usando os seguintes métodos: //! Translate this object by a specified offset void translate(const c. Vector 3 d& 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 c. Matrix 3 d& a_rotation); //! Rotate this object around axis a_axis by angle a_angle (radians) void rotate(const c. Vector 3 d& 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 Open. GL 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 aula 3. 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 (centro. Rot) 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 recal. Centro=false) ou uma posição definida no sistema de coordenadas do próprio objeto (nesse caso deve-se usar recal. Centro=true para que a posição global do centro seja recalculada). void roda(c. Mesh *obj, c. Vector 3 d centro. Rot, c. Vector 3 d eixo, double angulo, bool recal. Centro);
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->get. Pos() e obj->get. Rot() que fornecem respectivamente os dados de translação e rotação. • Em seguida essa matriz é manipulada através dos métodos da classe c. Matrix. GL. • No final de “roda” a matriz de transformação recalculada é colocada de volta no objeto usando: obj->set. Rot(matriz. get. Rot()); obj->set. Pos(matriz. get. Pos());
- Slides: 42