Realidade VirtualAula 5
Remis Balaniuk
Objetivo
• Nessa aula vamos aprender como criar hierarquias de objetos tridimensionais.
Recapitulando • Como visto na aula passada, as transformações rígidas
dos objetos tridimensionais (translações e rotações) são controladas por matrizes de transformação homogêneas.
• Tipicamente, numa aplicação em RV, cada objeto tem associado a ele uma matriz de transformação, que é inicializada com a matriz identidade.
• É como se essa matriz configurasse um sistema de coordenadas específico para o objeto.
• Uma transformação rígida ao manipular a matriz de transformação do objeto manipula na verdade o sistema de coordenadas do objeto com relação ao mundo, fazendo com que o objeto mude de posição no mundo sem ter de mudar de posição dentro do seu sistema de coordenadas.
• Sucessivas transformações rígidas podem ser aplicadas ao objeto como um todo manipulando só a matriz de transformação do objeto.
Exemplo
cubo=criaCubo(0.5,world,cVector3d(0,0,0)); braco1->setShowFrame(true); world->addChild(braco1); braco1->translate(cVector3d(0.5,0.5,0.5)); braco1->rotate(cVector3d(0.5,0.5,0.5),0.5);
Recapitulando• Um vértice ao ser criado tem uma posição no espaço
definida.• Ao ser adicionado a um objeto (mesh), a posição do
vértice passa a ser considerada no sistema de coordenadas desse objeto, e não mais no do mundo.
• Uma transformação rígida do objeto, ao transformar o sistema de coordenadas do objeto com relação ao do mundo, faz com que a posição de todos os vértices do objeto mudem de posição com relação ao mundo, mesmo que as posições desses vértices continuem as mesmas dentro do sistema de coordenadas do objeto.
• Um sequência de transformações concatenadas pode ser obtida multiplicando sucessivamente a matriz de transformação do objeto pelas matrizes de cada transformação .
• O cálculo da posição final de um vértice no mundo é feita só no momento do render, ou seja, no momento de apresentar o objeto na tela.
Hierarquias
• Um modelo em RV é tipicamente construído como uma hierarquia.
Mundo 3D
Objeto 1 Objeto 2 Objeto n ...
Objeto 1.1 Objeto 1.n...
Objeto 1.n.1 Objeto 1.n.m...
Hierarquias• Na prática, a hierarquia significa que o sistema de
coordenadas local a um objeto é preso a uma posição e orientação no sistema de coordenadas do seu pai.
• Uma transformação no sistemas de coordenadas do pai (sua matriz de transformação) leva junto todos os filhos.
• Uma transformação no filho só afeta o filho e os filhos desse filho.
• Um objeto pode ser filho do mundo ou de outro objeto.• Exemplo:
– O objeto1 é filho do mundo• world->addChild(objeto1);
– O objeto2 é filho do objeto1• objeto1->addChild(objeto2);
Hierarquias
• Na prática o que acontece é um empilhamento de matrizes de transformação.
• O algoritmo de render percorre a árvore da hierarquia e a cada descida para tratar um filho ele acrescenta sua matriz de transformação à pilha (glPushMatrix()).
• Cada vértice do objeto nm (um neto do mundo) do exemplo abaixo ao ser apresentado pelo render terá sua posição calculada como:– (px’,py’,pz’) = (px,py,pz).M.Mn.Mnm
Matriz do mundo (M)
Matriz do objeto n (Mn)
Matriz do objeto nm (Mnm)
Estratégias de modelagem
• Para fazer uso das hierarquias na composição de objetos complexos é preciso levar em consideração a “semântica” das ligações das partes de um objeto entre sí.
• A seguir veremos dois exemplos práticos:
Exemplo 1
• Objetos articulados:– O projeto ‘aula4.bpr’
implementa um braço articulado com dois segmentos.
– Cada segmento é um objeto (cMesh).
– O primeiro segmento é filho do mundo, o segundo é filho do primeiro.
Exemplo 1// cMesh* criaParalelepipedo(float largura, float altura, float
profundidade, cWorld *world, cVector3d centro);
braco1=criaParalelepipedo(1.0,0.2,0.2,world,cVector3d(0.5,0,0));braco1->setShowFrame(true);world->addChild(braco1);braco2=criaParalelepipedo(0.8,0.1,0.1,world,cVector3d(0.4,0,0));braco1->addChild(braco2);braco2->translate(cVector3d(1.0,0,0));braco2->setShowFrame(true);
• note que são criados dois paralelepípedos, o primeiro mais grosso ligado à origem do mundo e o segundo mais fino conectado à extremidade do primeiro. •duas configurações são importantes nesse exemplo:
• o ponto de pivoteamento da articulação (em torno de que ponto o segmento gira)• em que ponto do segmento anterior o segmento seguinte se liga
Exemplo 1• ambos os segmentos têm como pivô o centro da face esquerda• essa definição se faz coincidindo o ponto de pivô com a origem (0,0,0) e calculando a posição dos demais vértices em função desse ponto.• a ligação do segundo segmento com o primeiro (articulação) é na extremidadedireita do primeiro segmento.• essa definição foi feita deslocando o segundo segmento (seu sistema de coordenadas) de forma a fazer coincidir o ponto de pivô do segundo segmentocom o ponto de articulação no primeiro segmento:
braco2->translate(cVector3d(1.0,0,0));
Exemplo 2
• Sistema planetário:– o projeto “aula5.bpr” implementa um sistema
composto de 4 esferas que orbitam em diferentes trajetórias
– o objetivo desse projeto é mostrar como implementar movimentos compostos baseados em hierarquias.
Exemplo 2• O problema consiste em definir para cada esfera um
movimento desejado.• A esfera lilás deve rodar em torno de sí mesma a uma
velocidade de uma volta a cada 2 segundos, e está posicionada na origem do sistema planetário (sol).
• O planeta verde deve rodar em torno de sí mesmo a uma velocidade de uma volta a cada 3 segundos e em torno da origem a uma velocidade de uma volta a cada 4 segundos.
• O planeta azul deve rodar em torno de sí mesmo a uma velocidade de uma volta a cada 4 segundos e em torno da origem a uma velocidade de uma volta a cada 6 segundos.
• As rotações do sol e dos planetas são em torno do eixo Y.• A esfera azul tem uma lua estacionária que gira somente
em torno de sí mesma ao redor do eixo X a uma velocidade de 1 volta a cada 2 segundos.
Exemplo 2
• A solução do problema exige uma organização de sistemas de coordenadas para permitir compor todos os movimentos desejados.
• O movimento do “sol” é uma simples rotação em torno do eixo Y.
• Como os planetas não rodam na mesma velocidade do sol, e tem cada um uma velocidade diferente de rotação em torno do centro, não é possível colocá-los como filhos do sol.
• Eles também não podem ser filhos do mundo pois o método cShapeSphere define uma esfera centrada na origem do sistema de coordenadas. Sendo filhos do mundo eles poderiam só rodar em torno de sí mesmos.
Exemplo 2
• A solução proposta foi criar um sistema de coordenadas intermediário para cada planeta por meio de um cGenericObject vazio.
• Esses sistemas são filhos do mundo, sendo os planetas filhos desses sistemas.
• Para fazer o planeta girar em torno do sol basta posiciona-lo na sua órbita e então rotacionar o sistema ao qual esse está ligado.
• A rotação do planeta em torno de sí mesmo é obtido através de um rotate básico.
Exemplo 2
• A lua do planeta azul foi colocada como sua filha pois sendo essa estacionária vai girar junto com a rotação do planeta azul em torno de sí mesmo.
• (observação: as explicações sobre as classes cMaterial e cShapeSphere serão feitas em outra aula).
Câmeras
• Note que a implementação das câmeras também se faz através de transformações, chamadas de “transformações de visualização”
• Os comandos de posicionamento da câmera são usados para definir a matriz de transformação de visualização dessa câmera.
Câmeras
• Na prática é como se na base da pilha de matrizes de transformação estivesse a matriz relativa à transformação de visualização, que define onde cada vértice do mundo aparece na tela.
Matriz do mundo (M)
Matriz do objeto n (Mn)
Matriz do objeto nm (Mnm)
Matriz da câmera
Exercícios
1) Altere o projeto “aula4.bpr” de forma a estender o braço ajuntando uma pinça que pode girar (como um pulso) e abrir e fechar.
Exercícios
2) Estender o projeto “aula5.bpr” de forma que a lua do planeta azul possa também rodar em torno do planeta ao redor do eixo z a uma velocidade de uma volta a cada 5 segundos.
Exercícios
3) Implemente o objeto abaixo. Ele é composto por uma base quadrada giratória, dois pilares presos à base, uma viga presa aos pilares, uma haste presa a viga e uma esfera presa à haste. O conjunto viga, haste e esfera gira em torno do eixo da viga.
Top Related