Equipe: Carlos Maciel Elias Colleto Gustavo Hagenbeck Ítalo Macedo Telmo Filho Thyago Cassimiro Vinícius de Oliveira Introdução OGRE • Motor gráfico orientado a objeto (orientado à cena); • Facilitar o desenvolvimento de aplicações gráficas; • Licença GPL; • Qualidade e eficiência; Introdução Orientado à cena Grafo da cena: “The scenegraph is an object-oriented structure that arranges the logical and often (but not necessarily) spatial representation of a graphical scene.” (1) • Organizar objetos em cenas; – – – – Transformações; Hierarquia; Otimização; Preparação; Introdução Questões Técnicas Implementação: • C++ Abstração • Biblioteca utilizada (OpenGL, Direct3D) Simplicidade • Não suporta física, áudio, porém é de simples uso; Introdução Facilidade • Tratamento de classes de vetores e matrizes • Gerenciamento de memória • Adicionar plugins – Toolkits variados • Áudio • Física • Gerenciador de componentes – Scripting Language • Gerenciamento de cenas (grafo de cenas); Introdução Flexibilidade • Compatível com a maioria dos Sistemas Operacionais (SO); Portabilidade • Facilmente exportável (3D Studio Max, Maya, Blender, LightWave, Milkshape, Sketchup…); Introdução Comunidade • Amplamente difundida; – Muitos frameworks disponíveis; • Alta produtividade; Características Características de produtividade • Interface simples e fácil de usar orientada a objetos feita para minimizar o esforço necessário para renderizar cenas em 3D, e ser independente de implementações de 3D, exemplo: Direct3D/OpenGL. • Framework de exemplo extensiva permite você colocar seu aplicativo para rodar rápido e fácil. • Requisitos comuns como manejo de render states, spatial culling, mexendo com transparências são feitas para você automaticamente, te poupando tempo precioso. • Design limpo e organizado com documentação completa de todas as classes da engine. • Comprovado, engine estável usada em vários produtos comerciais. Características Suporte a plataformas e 3D APIs • Suporte a Direct3D e OpenGL. • Suporte a Windows (todas as principais versões), Linux e Mac OSX. • Compila no Visual C++ e Code::Blocks no Windows. • Compila no GCC 3+ no Linux / Mac OSX (usando XCode). Características Suporte a Material / Shader • Poderosa linguagem de declaração de materiais te permite manter os materiais fora de seu código. • Suporta Vertex e Fragment programs (shaders), tanto programas em baixo-nível escritos em assembler, e programas em alto-nível escritos em Cg, DirectX9 HLSL, ou GLSL e provê suporte automático para várias constantes comuns como matrizes de worldview, informações de estado de luz e object space eye position, etc. • Suporta todos os operadores de função fixa como multitexture e multipass blending, geração de coordenada de texturas e modificação, operações de alpha e cores independentes para hardware não-programável ou para materiais de baixo custo. • Suporta efeitos com vários "passes", com interação se necessário. • Suporte para múltiplas técnicas de materiais significa que você pode fazer efeitos alternativos para uma grande variedade de placas e o OGRE automaticamente usa o que é melhor suportado. Características Suporte a Material / Shader • Suporte a Material LOD (Level of Detail, ou Nível de Detalhe), permite que seus materiais possam reduzir o custo de acordo com o quão distantes eles ficam. • Carregar texturas de arquivos PNG, JPEG, TGA, BMP ou DDS, incluindo formatos incomuns como texturas 1D, texturas volumétricas, cubemaps e texturas comprimidas (DXT/S3TC). • Texturas podem ser providas em tempo real por plugins, por exemplo uma alimentação de vídeo. • Suporte a texturas projetivas fácil de usar. Características Meshes (Malhas) • Formatos de malhas flexíveis são aceitos, separação dos conceitos de vertex buffers, index buffers, vertex declarations e buffer mappings. • Biquadric Bezier patches para superfícies curvadas. • Malhas progressivas (LOD), geradas manualmente ou automaticamente. • Agrupamento de geometria estática. Características Animação • Suporte sofisticado de animação por esqueletos. o Combinação de várias animações com pesos variáveis. o Skinning com peso de "bones" multiplos/variáveis. o Pipelines de skinning em software ou hardware com compartilhamento de buffer inteligente. o Controle de bones manual. o Modos de interpolação configurável, troca de precisão por velocidade. • Suporte de animação de formas flexiveis. o Morph animation para aplicativos onde você deseja fazer simples combinações lineares entre formatos. o Pose animation para animação de superfícies modernas, permitindo combinar várias poses com pesos variáveis ao longo de uma timeline, por exemplo expressão / formas da boca para fazer animações faciais. o Ambas as técnicas podem ser implementadas em hardware ou software dependendo do suporte de hardware. Características Animação • Animação de SceneNodes para caminho de câmeras e técnicas similares, usando interpolação de spline quando necessário. • Trilhas de animação genéricas podem aceitar objetos plugáveis para te possibilitar animar qualquer parâmetro de qualquer objeto ao longo do tempo. Características Características de Cena • Administração flexível de cenas, altamente customizável, vinculada a nenhum tipo de cena. Use classes pre-definidas para organização das cenas se elas servem ou então coloque sua próprias subclasse para ganhar total controle sobre a organização das cenas. • Vários plugins exemplo demonstram várias formas de manipulação da cena específica para um particular tipo de layout (ex: BSP, Octree). • Gráfico de cena hierárquico; nodes permitem objetos serem anexados uns aos outros e seguir o movimento movimento dos outros, estruturas articuladas e etc. • Várias técnicas de renderização de sombras, tanto técnicas modulativas como aditivas, stencil e texturizadas, cada uma altamente configuável e tomando total vantagem de qualquer aceleração de hardware disponível. • Características de consulta de cena. Características Efeitos Especiais • Sistema de "Compositor", permitindo efeitos de postprocessing em tela-cheia serem definidos fácilmente, via scripts se desejado. • Sistema de Partículas, incluindo emissores extensíveis, affectors e renderizadores (customizável através de plugins). Sistemas podem ser definidos em scripts de texto para fácil modificação. Uso automático de "particle pooling" para máxima performance. • Suporte á Skyboxes, Skyplanes e Skydomes, muito fácil de usar. • Billboarding para sprites. • Ribbon trails (rastro) • Objetos transparentes administrados automaticamente (ordem de renderização e depth buffer todos já configurados para você). Características Outras Características • Infraestrutura comum de resources para administração de memória e carregar de arquivos comprimidos (ZIP, PK3). • Arquitetura de plugins flexível permite a engine ser estendida sem precisar recompilar. • 'Controllers" te permitem organizar valores derivados entre objetos de forma fácil, ex: mudar a cor de uma nave baseado nos escudo restante. • Debugging memory manager para identificar vazamento de memória (memory leak). • ReferenceAppLayer provê um exemplo de como combinar o OGRE com outras libraries, por exemplo ODE para colisão e física. • XMLConverter para converter formatos eficientes em binário para/de arquivos XML. Arquitetura Arquitetura Root • É o primeiro objeto a ser criado e o último a ser destruído. É o ponto de entrada do sistema OGRE. • Através dele pode-se configurar e acessar todo o sistema. • Objetos importantes do sistema tais como SceneManager e RenderSystem são referenciados a partir de Root. Arquitetura SceneManager • É responsável por organizar o conteúdo da cena. • É o SceneManager que cria e gerencia todas as câmeras, objetos móveis, luzes e materiais (propriedades da superfícies de objetos). • Envia a imagem a ser processada para o RenderSystem. • Através dele nós e objetos móveis podem ser criados e acessados: • SceneManager::createLight() / getLight(); • SceneManager::createSceneNode() / getSceneNode(); SceneManager::createCamera() / getCamera(); Arquitetura RenderSystem • Classe abstrata que define a interface OGRE e a API 3D. • Responsável pela execução de comandos de renderização e configura opções da API gráfica utilizada. • Não deve ser acessada diretamente. • Exceto quando se necessita criar múltiplas janelas de renderização, ou quando se deseja acessar dados presentes apenas no RenderSystem. Arquitetura Entity • É uma instância de um objeto móvel na cena. • Possui uma malha geométrica associada (mesh). Pode-se utilizar várias entities referenciando um mesmo mesh. • São criadas através do método SceneManager::createEntity(), passando como parâmetro um nome para a entidade e o nome do arquivo .mesh. • Cada Entity tem um Material que pode ser modificado através do método subEntity::setMaterialName(), proporcionando uma aparência diferente ao Mesh que originou. Arquitetura SceneNode • Tem como função agrupar entidades, luzes, câmeras e objetos associados e armazenar informações relativas a posição, orientação e escala destes dentro da cena. • Toda entidade deve estar associada a um SceneNode para se tornar visível. • Existe uma hierarquia de SceneNode, cuja raiz pode ser acessada através do método SceneManager::getRootSceneNode(). Para criar nós filhos utiliza-se o método SceneNode::CreateChildSceneNode(). • Pode-se aplicar transformações espaciais às entidades associadas a cada SceneNode e seus filhos. • Pode-se realizar uma busca por SceneNode através do método: sceneManager->getSceneNode(“nomeDoSceneNode”). Arquitetura Camera • Representa um ponto de vista da cena. • É simbolicamente representado como um nó com propriedade de Frustum. • Essa propriedade representa uma área restrita de visualização, com atributos como campo de vista (ângulo de abertura), relação entre altura e largura, planos que delimitam o volume de visualização (near plane e far plane). • Possui também orientação e posição, podem ser alteradas dinamicamente. • Câmeras são criadas através do SceneManager associando a um nome. Geometria • • • • Vérticies e materiais Meshes e sub-meshes Entities e sub-entities Hardware buffers Vértices e Materiais • Dados 3d são representados através de “indexed face sets”, que é feito por um array de vértices e um array de índices. Isso permite que os vértices sejam processados apenas uma vez • Para renderizar é preciso descrever como utilizar esses dados, é aí que entram os materiais (eg relacionar textura e com coordenadas de textura) • Materiais podem ser vistos como “programas” que recebem dados de vértices e índices Materiais • Definem grande parte da renderização • Precisa ser bem trabalhado quando se quer portabilidade. É preciso fornecer diferentes maneiras de se obter um mesmo efeito, a fim de que uma delas seja compatível com a plataforma/placa de vídeo • São uma lista de técnicas. Uma técnica consiste em um ou mais passos. OGRE faz otimizações para reduzir a troca de contexto e garantir a ordem correta para, por exemplo, efeitos de transparência Meshes e sub-meshes • Meshes: são unidades lógicas que representam objetos, ex: carro, personagem, robô. Facilitam a manipulação e renderização de objetos. São compostos por diferentes partes cada uma com diferentes materiais • Sub-Meshes: Essas partes são os Sub-Meshes, que são atômicos, contém apenas dados de vértice/índice e têm um único material. • Meshes armazenam outras informações como métodos para renderização de sombras, grupo de recursos, status, etc. Entities • Materiais mudam com frequencia, mantendo os dados de vertice/indice (ex: vários carros numa corrida) • Entities são ponteiros para Meshes, mas podem sobrepor os materias das Sub-Meshes, através das Sub-Entities que existem para cada Sub-Mesh • Entities guardam informaçoes de como o mesh aparece na cena. Como: flags (ex: se é visível ou não), bounding box, fila (ray query) Entities Sub-Entities • Sub-entity estão relacionadas com sub-mesh. • Possuem seu próprio material • Ao terem seu material alterado apenas uma Entity sofrerá mudança, ao passo em que uma sub-mesh é alterada, várias Entitys sofrerão mudanças. Hardware Buffers • Dados de vértice e índice são representados através de uma das formas mais eficientes, chamada de “mecanismo de estado da arte”. No caso, significa utilizar Hardware Buffers. • È uma área de memória RAM fora do núcleo do sistema, geralmente é a vídeo RAM. São eficientes porque limitam a transferência entre a CPU e a GPU, e fazem com que os dados estejam mais próximos do local de uso. São muito menos flexíveis e que memória do sistema, e em alguns casos geram duplicação de dados (eg colisão) • São muito menos flexíveis que a memória RAM Exemplo • Ninja é um Mesh • Corpo é um sub-mesh • Espada é um sub-mesh Scripts Definição: Arquivos de texto que servem como meio alternativo ao código fonte para a criação de recursos pelo engine. Initialization Scripts • Faz o carregamento dos plugins, auto-preenchimento das opções de configuração e definição de caminhos para os recursos utilizados pela aplicação. “plugins.cfg”, “ogre.cfg” e “resources.cfg” – Plugins.cfg => Localiza a pasta onde estarão localizados os plugins listados desse arquivo. – Ogre.cfg => Localiza pastas e arquivos compactados que possuem mais arquivos de scripts. – Resources.cfg => Contém os valores configurados mais recentemente pelo usuário. Scripts • Particle Scripts Scripts de partículas permitem que sejam definidos sistemas de partículas para serem instanciados no código, sem ser necessário codificar as próprias configurações no código-fonte, permitindo mudanças rápidas. Sistemas de partículas definidos em scripts são usados como modelos e muitos sistemas podem ser criados a partir deles em tempo de execução. Scripts • Particle Scripts – Scripts de sistemas de partículas são carregados em tempo de inicialização pelo sistema: por default ele procura em todos os locais de recursos comuns por arquivos com a extensão “.particle” e os processa. – Uma vez processados, o código pode instanciar sistemas baseados nos scripts. Scripts • Particle Scripts – Exemplo de script de partículas: // A sparkly purple fountain Examples/PurpleFountain { material Examples/Flare2 particle_width 20 particle_height 20 cull_each false quota 10000 billboard_type oriented_self Scripts // Area emitter emitter Point { angle 15 emission_rate 75 time_to_live 3 direction 0 1 0 velocity_min 250 velocity_max 300 colour_range_start 1 0 0 colour_range_end 0 0 1 } // Gravity affector LinearForce { force_vector 0 -100 0 force_application add } // Fader affector ColourFader { red -0.2 green -0.25 blue -0.25 } } Scripts • Overlay Scripts – Scripts de superposição oferecem a habilidade de definir superposições em um script que pode ser reusado facilmente. Eles também são carregados e processados em tempo de inicialização, quando o sistema procura por arquivos de extensão “.overlay”. Scripts • Overlay Scripts – Exemplo de Overlay Scripts // The name of the overlay comes first MyOverlays/ANewOverlay { zorder 200 container Panel(MyOverlayElements/TestPanel) { // Center it horizontally, put it at the top left 0.25 top 0 width 0.5 height 0.1 material MyMaterials/APanelMaterial // Another panel nested in this one container Panel(MyOverlayElements/AnotherPanel) { left 0 top 0 width 0.1 height 0.1 material MyMaterials/NestedPanel } } } Scripts • Font Definition Scripts – OGRE usa fontes baseadas em texturas. A forma final de uma fonte é um objeto Material gerado pela fonte e um conjunto de informações de coordenadas de texturas de “glyph”(caracter). Scripts • Font Definition Scripts – Existem duas formas de usar fontes em OGRE: • Criar uma textura de fonte usando um pacote de arte ou uma ferramenta de criação de fontes. • Fazer o OGRE gerar uma textura de fonte baseada em uma fonte truetype. Scripts • Font Definition Scripts – Os arquivos de definições de fontes “.fontdef” são buscados, carregados e processados em tempo de inicialização e seu formato básico é: <font_name> { type <image | truetype> source <image file | truetype font file> ... ... custom attributes depending on type } Ambientes de desenvolvimento • Eclipse • NetBeans • Code::Blocks • DevC++ • Visual C++ Ambientes de desenvolvimento Eclipse • Requisitos • Ogre4J ou Ogre4Eclipse Ambientes de desenvolvimento NetBeans • Requisitos • Ogre4J Ambientes de desenvolvimento Eclipse + CDT • Requisitos • Eclipse C/C++ Development Tools • MinGW • MSYS • OgreSDK Ambientes de desenvolvimento Code::Blocks • Requisitos • MinGW • OgreSDK para Code::Blocks Ambientes de desenvolvimento DevC++ • Requisitos • Versão 4.9.9.1 • Ogre DevPak Ambientes de desenvolvimento Visual Studio • Requisitos •Microsoft Platform SDK(PSDK) •OgreSDK Ambientes de desenvolvimento Conclusões • Linguagens •Perl •PureBasic •Python •Ruby •Java •C++ Facilidades • Geração de Sombras; • Render-to-Texture; • Mouse Picking; Geração de Sombras • Stencil Additive; • Stencil Modulative; • Texture Modulative; Render-to-Texture Renderiza cenas em texturas que são utilizadas em materiais para torná-los reflexivos. Mouse Picking • Seleção de objetos da cena utilizando o mouse; • O Picking padrão implementado no OGRE detecta os objetos com base no AxisAlignedBox dos objetos. Exemplos de uso Por ter... • Maior qualidade no resultado da renderização; • Ferramenta gratuita sobre GPL e Ogre unrestricted use; • Boa taxa de quadros na renderização; • Flexibilidade; • Escalabilidade; Amplo campo de atuação Publicações • Simulação de ambientes de trabalho através de RV Publicações • Desenvolvimento de aplicações de realidade aumentada para Pocket PC Publicações • Ah sim... E jogos, claro! Referências • [1] [Anon], [no date]. Scene-graphs [online]. Disponível em: http://en.wikipedia.org/wiki/Scene_graph Acessado em: Maio de 2008