Realidade Virtual Aula 2 Remis Balaniuk Enxergando grande, começando pequeno • Quem começa a aprender RV normalmente sofre um primeiro impacto negativo ao constatar o grande número de tópicos que devem ser estudados: – linguagem de programação: C, C++, Java(?) – Biblioteca gráfica: OpenGL, VRML :-(( – Geometria tridimensional: vetores, transformadas, coordenadas homogêneas, etc – Física: equações do movimento (força, velocidade, aceleração, gravidade, etc), propriedades dos objetos (massa, densidade, elasticidade, etc), energia, etc. – Estratégias de simulação: multi-threads, sincronização, frequências de simulação. – Drivers e dispositivos. Enxergando grande, começando pequeno • A implementação de aplicações, quando feita do zero, exige bastante esforço de programação. • Difíceis de depurar (multi-thread). • Modelos são difíceis de serem construídos (definição do mesh de triângulos, definição das propriedades do objeto, etc). Enxergando grande, começando pequeno • Por isso, essa disciplina vai adotar as seguintes estratégias para otimizar o aprendizado: – não reinventar a roda: • usaremos um ambiente de programação adequado, que tenha recursos que facilitem a programação e o debug : o Borland C++ • ao invés de usar o OpenGL diretamente adotaremos uma biblioteca de classes pronta que já traga implementadas as estruturas básicas (vetor, matrizes, operações sobre vetores e matrizes, apresentação, definição de atributos, etc). Usaremos o Chai3d. Enxergando grande, começando pequeno – defina de forma bem estruturada suas classes, de forma que essas possam ser reutilizadas de uma aplicação para outra. – programe de forma limpa e bem documentada. – aprenda implementando: • ataque problemas começando pelos mais simples, e aumente gradualmente sua complexidade. • dê ênfase ao estudo das transformações geométricas, que são o ponto crucial de uma aplicação em RV. • explore os recursos da biblioteca gráfica para entender bem seu funcionamento. Passos • Passo 1: escolher a plataforma de implementação – VRML ou OpenGL? • VRML – é uma linguagem descritiva de objetos tridimensionais. – necessita de um browser para visualização – o browser, por ser uma caixa preta, não permite adicionar recursos de vizualização ou alteração no modelo durante a simulação (deformação, dinâmica, etc) – é mais simples a ser usado mas limitado quanto ao uso • OpenGL – é uma linguagem procedural, que envia instruções à placa gráfica – é bem primária, baseada em primitivas gráficas como linhas, pontos, polígonos simples, cor do fundo, orientação da camera virtual, etc – código difícil de depurar pois não dá mensagens de erro – instruções dependem do contexto (matriz de transformação) e o programador é que deve entender esse contexto (camera virtual) Passos • Passo 1: escolher a plataforma de implementação (cont.) – escolha da linguagem – escolha do ambiente de programação • glut: biblioteca que adiciona recursos básicos ao OpenGL, tais como abrir janelas, adicionar menus, etc. É multi-plataforma (Windows, Unix) • MS -Visual, Borland Builder: já trazem recursos de gerenciamento de janelas (mais sofisticados que os do glut) mas são restritos ao Windows. – escolha de uma biblioteca • deve conter estruturas de dados e classes abrangentes Passos • Passo 2: definir (ou entender) as estruturas de dados que descrevem o mundo – o mundo virtual é composto de objetos tridimensionais, cuja superfície é descrita normalmente através de meshes de polígonos (normalmente triângulos). – um mesh é um conjunto de vértices, conectados pelos polígonos. – Um vértice é uma localização no espaço descrita por um vetor de coordenadas [x,y,z] – um polígono é uma lista de vértices e um vetor normal (orientação para refletir a luz) – cor, textura e tipo de material são ainda propriedades dos polígonos – um objeto é uma lista de polígonos Passos • Passo 3: entender os sistemas de coordenadas – a posição de um objeto no espaço (definida pela posição dos seus vértices) assume que existe um sistema de coordenadas conhecido, em função do qual essas posições são definidas – antes de mostrar na janela o mundo virtual é preciso definir de qual ângulo e posição se deseja ver esse mundo – para isso de usa a metáfora da câmera virtual – a câmera define uma outro sistema de coordenadas, que muda constantemente, enquanto o sistema onde os objetos são definidos permanece fixo. – Para mostrar o mundo pela perspectiva da câmera virtual é feita uma transformação de coordenadas de um sistema a outro (o OpenGL faz isso) Passos • Passo 4: estudar os conceitos de transformações geométricas – movimentos do objeto como um todo (movimentos rígidos) e as mudanças na câmera virtual são definidos por uma composição de translações, rotações e mudanças de escala – essas transformações geométricas são implementadas usando matrizes especiais chamadas de “coordenadas homogêneas” – o domínio dessas transformações e de sua implementação é o ponto crítico da aprendizagem em Computação Gráfica e Realidade Virtual. – deformações definem movimentos específicos a cada vértice que são calculados e aplicados um a um. Passos • Passo 5: entender o estrutura de controle da simulação – uma simulação é composta por loops simultâneos (threads paralelas), cada um cuidando de um aspecto da simulação – aliás o loop é a forma de “fatiar” o tempo (discretizar) de forma a tratar um processo continuo em passos discretos. – os loops devem ser repetidos diversas vezes por segundo para criar a ilusão de continuidade – a placa gráfica está sempre em loop exibindo a tela e suas janelas Passos • Passo 5: entender o estrutura de controle da simulação (cont.) – uma simulação está ligada a uma janela (o mundo virtual) – o loop gráfico (ou refresh) da aplicação executa os comandos OpenGL que definem as primitivas gráficas que aparecem na janela. – se esse loop parar a placa gráfica vai continuar a mostrar a ultima imagem gerada. – se o mundo muda continuamente o loop gráfico precisa rodar a pelo menos ~30Hz (como um filme) para dar a sensação de continuidade dos movimentos. – mudanças na câmera virtual são simuladas nesse loop Passos • Passo 5: entender o estrutura de controle da simulação (cont.) – no loop de atualização do mundo (ou update) é simulada as mudanças ocorridas no mundo, ou seja, as mudanças de posição e orientação dos objetos, as deformações, etc. – se houver simulação física, a cada passo desse loop serão recalculadas forças, acelerações, velocidades e posições dos objetos. – colisões também são tratadas nesse loop. – para cada mudança num objeto a posição de todos os seus vértices deve ser recalculada. – esse loop pode funcionar mais devagar ou mais rápido que o loop gráfico dependendo da aplicação. – se eles funcionam sempre na mesma velocidade podem ser juntados. Passos • Passo 5: entender o estrutura de controle da simulação (cont.) – o loop háptico calcula forças da interação entre o usuário e os objetos virtuais – devido à nossa alta sensibilidade tátil o refresh háptico precisa ser muito mais rápido (~1000Hz). – devido a essa alta velocidade, o loop háptico precisa ser bastante otimizado e não pode realizar cálculos e testes longos. Passos • Passo 6: estudar animações – uma animação pode ser baseada numa simulação física ou não – se não for física a implementação depende das características da aplicação – se for física é preciso estudar os conceitos básicos de integração de equações diferenciais. – o estado de um sistema físico é definido pela velocidade e posição dos objetos. – para recalcular o estado é preciso integrar (somar) as acelerações, que podem ser causadas pela gravidade ou forças externas – como cada passo da integração depende do intervalo de tempo considerado, é preciso ficar atento ao controle do loop de update para que o intervalo de tempo real coincida com o virtual. Passos • Passo 7: tópicos específicos – algoritmos de detecção e tratamento de colisões – algoritmos de cálculo da interação háptica – Texturas, materiais, luzes