32
Realidade Virtual Aula 3 Remis Balaniuk

Realidade Virtual Aula 3 Remis Balaniuk. Conteúdo Nessa aula serão apresentados os conceitos básicos de geometria 3D ao mesmo tempo em que será apresentada

Embed Size (px)

Citation preview

Page 1: Realidade Virtual Aula 3 Remis Balaniuk. Conteúdo Nessa aula serão apresentados os conceitos básicos de geometria 3D ao mesmo tempo em que será apresentada

Realidade VirtualAula 3

Remis Balaniuk

Page 2: Realidade Virtual Aula 3 Remis Balaniuk. Conteúdo Nessa aula serão apresentados os conceitos básicos de geometria 3D ao mesmo tempo em que será apresentada

Conteúdo

• Nessa aula serão apresentados os conceitos básicos de geometria 3D ao mesmo tempo em que será apresentada a biblioteca Chai3D no Borland Builder.

• Os conceitos de geometria são genéricos e independem do Chai

• O Chai será apresentado paralelamente aos conceitos para facilitar a sua compreensão.

Page 3: Realidade Virtual Aula 3 Remis Balaniuk. Conteúdo Nessa aula serão apresentados os conceitos básicos de geometria 3D ao mesmo tempo em que será apresentada

Chai• A biblioteca Chai pode ser obtida no endereço:

http://www.chai3d.org• Após o download do arquivo zip o seu conteúdo

deve ser extraído, gerando uma árvore de diretórios contendo fontes, executáveis e exemplos do Chai no Borland Builder e no MS Visual.

• Nós usaremos o Borland Builder 6.0• Crie um diretório ‘Aulas RV’ abaixo de

chai3d/examples• Copie do site da disciplina o diretorio `aula1’ em

baixo de ‘Aulas RV’• Clique em aula1.bpr no diretório aula1 para abrir o

projeto aula1

Page 4: Realidade Virtual Aula 3 Remis Balaniuk. Conteúdo Nessa aula serão apresentados os conceitos básicos de geometria 3D ao mesmo tempo em que será apresentada

Elementos do BBC++

• Note no main.cpp as seguintes características:– A aplicação é toda construída em torno de um

formulário (Form1) que contém um painel (Panel1) que corresponde à área preta do formulário e onde aparecerão as imagens gráficas.

– A classe TForm1 é uma especialização de TForm, que é uma classe do BBC++

– O método FormCreate é chamado assim que a aplicação é executada, e nesse método as estruturas do Chai são definidas.

Page 5: Realidade Virtual Aula 3 Remis Balaniuk. Conteúdo Nessa aula serão apresentados os conceitos básicos de geometria 3D ao mesmo tempo em que será apresentada

Elementos do BBC++

• Note também:– O Timer adicionado à aplicação é um recurso do BBC++ e

define um objeto que quando ativo (Enabled=true) executa repetidamente o método Timer1Timer a um intervalo definido de tempo (configurado para 20ms nessa aplicação).

– Nessa aplicação o timer é usado só para dar um ‘refresh’ na tela, ou seja, atualizar o seu conteúdo.

– O grupo TGroupBox *GroupBox7 e e o botão TButton *Button2 também são recursos do BBC++ e o método ToggleGirarButtonClick é chamado quando se clica no botão.

– Esses recursos de botão e outros são configurados no BBC++ na base do ‘drag-and-drop’ e configurados ao se clicar no ícone correspondente.

Page 6: Realidade Virtual Aula 3 Remis Balaniuk. Conteúdo Nessa aula serão apresentados os conceitos básicos de geometria 3D ao mesmo tempo em que será apresentada

Elementos do Chai

• As demais estruturas da aplicação são do Chai e correspondem à definição da cena gráfica.

• Junto com a explicação de cada estrutura vamos conhecer os conceitos geométricos básicos que essas estruturas implementam.

Page 7: Realidade Virtual Aula 3 Remis Balaniuk. Conteúdo Nessa aula serão apresentados os conceitos básicos de geometria 3D ao mesmo tempo em que será apresentada

Introdução

• Em Computação Gráfica é importante distinguir o modelo de sua representação

• O modelo, também chamado de topologia, é a composição de pontos, que são ligados por segmentos de reta, que delimitam polígonos, que por sua vez formam as superfícies dos objetos.

• Ainda como parte do modelo, uma série de propriedades são atribuídas a essas entidades, tais como cor, material, textura, etc.

• A posição de um objeto é definida pela posição de seus pontos no espaço, e essa posição é parte da representação daquele objeto.

• O mesmo objeto pode ser representado em diferentes posições, orientações e tamanho sempre com a mesma topologia.

Page 8: Realidade Virtual Aula 3 Remis Balaniuk. Conteúdo Nessa aula serão apresentados os conceitos básicos de geometria 3D ao mesmo tempo em que será apresentada

Exemplo do mesmo modelo em representações diferentes

Page 9: Realidade Virtual Aula 3 Remis Balaniuk. Conteúdo Nessa aula serão apresentados os conceitos básicos de geometria 3D ao mesmo tempo em que será apresentada

Introdução

• A representação de uma cena virtual pode conter diversos modelos.

• A definição de uma cena virtual começa pela definição de um mundo (cWorld no Chai):

// cria uma nova cena

world = new cWorld();

Page 10: Realidade Virtual Aula 3 Remis Balaniuk. Conteúdo Nessa aula serão apresentados os conceitos básicos de geometria 3D ao mesmo tempo em que será apresentada

Introdução

• Esse mundo é a raiz de uma estrutura hierárquica sob a qual todos os componentes da cena virtual serão conectados.

• Uma das propriedades da cena é a cor de fundo

// define cor de fundo world->setBackgroundColor(0.0f,0.0f,0.0f);

Page 11: Realidade Virtual Aula 3 Remis Balaniuk. Conteúdo Nessa aula serão apresentados os conceitos básicos de geometria 3D ao mesmo tempo em que será apresentada

Cores

• Note que a definição de cores se faz seguindo o padrão RGB (Red Green Blue).

• Nesse padrão os 3 números definem a proporção entre vermelho, verde e azul que compõem a cor desejada

• Exemplo:– (0.0,0.0,0.0) = preto– (1.0,1.0,1.0) = branco– (0.0,0.0,1.0) = azul– (0.5,0.0,0.5) = vermelho + azul em iguais proporções

que dá uma cor próxima do lilas.

Page 12: Realidade Virtual Aula 3 Remis Balaniuk. Conteúdo Nessa aula serão apresentados os conceitos básicos de geometria 3D ao mesmo tempo em que será apresentada

Câmeras e viewports• Para que esse mundo possa ser observado, uma ou mais câmeras devem ser

criadas: // cria uma camera camera = new cCamera(world); world->addChild(camera);• Note que toda estrutura criada daqui para frente deve ser adicionada à cena

(addChild)• A câmera permite a observação da cena.• Para que a imagem ‘vista’ pela câmera possa ser mostrada é preciso ligar a

câmera a uma janela de exibição (chamada de viewport no Chai)• janelas (viewports no Chai) são criadas assim: // cria um display para apresentar a cena viewport = new cViewport(Panel1->Handle, camera,

true);• Note que a viewport esta associada a um painel da aplicação Borland e a uma

câmera.• Várias viewports e várias câmeras podem ser criadas para a mesma cena,

permitindo visualiza-la de diferentes ângulos simultanemente.

Page 13: Realidade Virtual Aula 3 Remis Balaniuk. Conteúdo Nessa aula serão apresentados os conceitos básicos de geometria 3D ao mesmo tempo em que será apresentada

cVector3d

• Em geometria 3D usamos com frequência vetores tridimensional, ou seja, uma estrutura numérica com 3 reais.

• Esse tipo de vetor é utilizado para representar posições, direções e outras informações.

• A classe cVector3d é definida por 3 valores: x,y e z, e um conjunto de métodos que permitem efetuar as principais operações vetoriais, tais como adição, produtos, normalização, cálculo do comprimento, etc.

Page 14: Realidade Virtual Aula 3 Remis Balaniuk. Conteúdo Nessa aula serão apresentados os conceitos básicos de geometria 3D ao mesmo tempo em que será apresentada

Posições 2D e 3D• Posições no espaço são descritas por meio de vetores representando um deslocamento com relação à origem de um sistema de coordenadas.•A figura abaixo a direita representa o chamado “sistema de coordenadas da mão direita” para espaços 3D

Page 15: Realidade Virtual Aula 3 Remis Balaniuk. Conteúdo Nessa aula serão apresentados os conceitos básicos de geometria 3D ao mesmo tempo em que será apresentada

Sistema de coordenadas do Chai

• Exemplo de posição no Chai

x+x-

y+

y-

z-

z+

2

1.5

2.5

(2.5,2.0,1.5)

Page 16: Realidade Virtual Aula 3 Remis Balaniuk. Conteúdo Nessa aula serão apresentados os conceitos básicos de geometria 3D ao mesmo tempo em que será apresentada

Direções

• Um vetor 3D pode também ser usado para indicar uma direção:

x+x-

y+

y-

z-

z+

(-0.7, 0.0, 0.7)

Page 17: Realidade Virtual Aula 3 Remis Balaniuk. Conteúdo Nessa aula serão apresentados os conceitos básicos de geometria 3D ao mesmo tempo em que será apresentada

Direções

• Um vetor 3D usado para indicar direção é normalmente unitário, ou seja, seu comprimento é igual a 1.

x+x-

y+

y-

z-

z+

(-0.7, 0.0, 0.7)

Page 18: Realidade Virtual Aula 3 Remis Balaniuk. Conteúdo Nessa aula serão apresentados os conceitos básicos de geometria 3D ao mesmo tempo em que será apresentada

Direções

• O comprimento l de um vetor 3D (x, y z) é calculado como:– . 222 zyxl

x+x-

y+

y-

z-

z+

(-0.7, 0.0, 0.7)

Page 19: Realidade Virtual Aula 3 Remis Balaniuk. Conteúdo Nessa aula serão apresentados os conceitos básicos de geometria 3D ao mesmo tempo em que será apresentada

Direções

• Um vetor 3D (x, y z) não unitário pode ser ‘normalizado’, ou seja, transformado em unitário fazendo-se:– (x/l, y/l. z/l)

x+x-

y+

y-

z-

z+

(-0.7, 0.0, 0.7)

Page 20: Realidade Virtual Aula 3 Remis Balaniuk. Conteúdo Nessa aula serão apresentados os conceitos básicos de geometria 3D ao mesmo tempo em que será apresentada

Câmeras

• Uma câmera é definida por 3 informações (todas as 3 codificadas em vetores 3D):– Sua posição no espaço

– O ponto para onde está ‘olhando’ (lookat)

– E a postura da camera, ou seja, se esta em pé, de lado, de cabeça para baixo, etc (up)

Page 21: Realidade Virtual Aula 3 Remis Balaniuk. Conteúdo Nessa aula serão apresentados os conceitos básicos de geometria 3D ao mesmo tempo em que será apresentada

Câmeras• Exemplo:

// posicao da camera

cVector3d pos = cVector3d(0,0,3.0);

// para onde a camera esta olhando

cVector3d lookat = cVector3d(0,0,0);

// define postura

cVector3d up(0.0, 1.0, 0.0);

// define posicao da camera

camera->set(pos, lookat, up);

x+x-

y+

y-

z-

z+

Page 22: Realidade Virtual Aula 3 Remis Balaniuk. Conteúdo Nessa aula serão apresentados os conceitos básicos de geometria 3D ao mesmo tempo em que será apresentada

Luzes• Para ser visível a cena precisa conter pelo menos uma

fonte de luz.• Luzes são definidas pela sua posição e tipo: // cria uma fonte de luz e liga ao mundo light = new cLight(world); light->setEnabled(true); light->setPos(cVector3d(2,1,1));• Por default uma luz é difusa, ou seja, emite em todas as

direções.• É possível definir luzes direcionais (spotlights):

– light->setDirectionalLight(true);• Nesse caso é preciso definir também a direção do foco.• Diversas outras propriedades das luzes podem também ser

definidas.

Page 23: Realidade Virtual Aula 3 Remis Balaniuk. Conteúdo Nessa aula serão apresentados os conceitos básicos de geometria 3D ao mesmo tempo em que será apresentada

Elementos gráficos• Os objetos de uma cena tridimensional são normalmente definidos por

‘meshes’.• Um mesh é uma rede de vértices conectados por arestas definindo

polígonos.• Um mesh define uma superfície tridimensional.• Quando totalmente fechada essa superfície pode representar um objeto

volumétrico

object = new cMesh(world); world->addChild(object);

Page 24: Realidade Virtual Aula 3 Remis Balaniuk. Conteúdo Nessa aula serão apresentados os conceitos básicos de geometria 3D ao mesmo tempo em que será apresentada

Elementos gráficos• Vértices são implementados no Chai pela classe

cVertex.• Além da posição 3D, um objeto da classe cVertex

possui uma série de propriedades, como cor, posição na textura, além de uma série de métodos.

• Exemplo: int p1 = object->newVertex(-0.5, 0.0, 0.0); object->getVertex(p1)->setColor(1.0,0,0,1);

– Note que o método newVertex da classe cMesh cria um novo vértice e retorna um sequencial correspondente à posição do novo vértice na lista de vértices do mesh.

– getVertex retorna o ponteiro para o vértice na posição indicada pelo parâmetro.

– setColor é um método da classe cVertex que permite configurar a sua cor.

Page 25: Realidade Virtual Aula 3 Remis Balaniuk. Conteúdo Nessa aula serão apresentados os conceitos básicos de geometria 3D ao mesmo tempo em que será apresentada

Elementos gráficos

• Com os vértices se pode definir polígonos.

• O polígono mais utilizado para compor os meshes é o triângulo, por esse ter a propriedade de ter necessariamente seus vértices coplanares.

• No Chai os triângulos são implementados pela classe cTriangle.

Page 26: Realidade Virtual Aula 3 Remis Balaniuk. Conteúdo Nessa aula serão apresentados os conceitos básicos de geometria 3D ao mesmo tempo em que será apresentada

Elementos gráficos

• Uma forma mais prática de adicionar triângulos a um mesh é usando o método abaixo:

int p1 = object->newVertex(-0.5, 0.0, 0.0); int p2 = object->newVertex( 0.5, 0.0, 0.0); int p3 = object->newVertex( 0.0, 0.0, 0.5); //cria o triangulo no mesh object->newTriangle(p1, p3, p2);

• Note que primeiro foram criados os vértices para depois criar o triângulo passando como parâmetro os sequenciais dos vértices.

Page 27: Realidade Virtual Aula 3 Remis Balaniuk. Conteúdo Nessa aula serão apresentados os conceitos básicos de geometria 3D ao mesmo tempo em que será apresentada

Elementos gráficos• Um polígono tem direção, que é chamada de ‘normal’.• A normal de um polígono indica para onde esse está

voltado. • Essa informação define como a luz incidirá em cada

polígono do mesh.• No exemplo abaixo o triângulo da esquerda será iluminado

pela luz e ficará visível na cena, enquanto o da direita vai ficar sem cor (com a cor de fundo da cena).

Luz

Page 28: Realidade Virtual Aula 3 Remis Balaniuk. Conteúdo Nessa aula serão apresentados os conceitos básicos de geometria 3D ao mesmo tempo em que será apresentada

Elementos gráficos

• Para que as normais de todos os triângulos de um mesh sejam atualizadas use o seguinte método:

// compute normals object->computeAllNormals(true);

• As normais do mesh precisam ser recalculadas sempre que esse se movimentar na cena, pois isso muda a orientação dos triângulos com relação às fontes de luz.

Page 29: Realidade Virtual Aula 3 Remis Balaniuk. Conteúdo Nessa aula serão apresentados os conceitos básicos de geometria 3D ao mesmo tempo em que será apresentada

Elementos gráficos

• O cálculo da normal de um triângulo é influenciado pela ordem dos vértices na criação do triângulo.

• A normal estará ‘saindo’ do triângulo (apontando em sua direção) se ao você olhá-lo de frente ver os vértices no sentido anti-horário.

Page 30: Realidade Virtual Aula 3 Remis Balaniuk. Conteúdo Nessa aula serão apresentados os conceitos básicos de geometria 3D ao mesmo tempo em que será apresentada

Elementos gráficos

• Exemplo: considere o código abaixocVector3d p1(-0.5, 0, 0);

cVector3d p2( 0.5, 0, 0);

cVector3d p3( 0, 0.5, 0);

//caso 1 - esse triangulo ficara voltado para y+

object->newTriangle(p1, p2, p3);

//caso 2 - esse triangulo ficara voltado para y-

object->newTriangle(p1, p3, p2);

x+x-

y+

y-

z-

z+

p1 p2

p3

Caso 1

x+x-

y+

z-

p1 p2

p3

Caso 2

normal

Page 31: Realidade Virtual Aula 3 Remis Balaniuk. Conteúdo Nessa aula serão apresentados os conceitos básicos de geometria 3D ao mesmo tempo em que será apresentada

Projeto aula1

• O projeto aula1 implementa uma aplicação simples no qual um triângulo é visualizado por uma câmera que pode rodar em torno dele ao clicar num botão.

• Note os seguintes detalhes:– a posição da câmera é recalculada cada vez que o botão é

acionado. O ângulo de rotação é incrementado a cada clique.

– quando a câmera passa para o lado de trás do triângulo esse desaparece da cena pois seu fundo não recebe incidência de luz.

– a cor do triângulo é uma combinação das 3 cores básicas definidas em cada um vértices

– o refresh periódico da janela controlado pelo timer.

Page 32: Realidade Virtual Aula 3 Remis Balaniuk. Conteúdo Nessa aula serão apresentados os conceitos básicos de geometria 3D ao mesmo tempo em que será apresentada

Exercícios

• Adapte o projeto aula1 de forma a:– Mostrar um quadrado na tela no lugar do

triângulo.– Tornar o quadrado visível dos dois lados.– Adicionar um botão que suba e desça a câmera

e outro que a afaste e aproxime.– Adicionar um botão que inicie um movimento

contínuo de rotação da câmera ao redor do objeto.