# OpenSceneGraph

OpenSceneGraph (conhecida também por OSG) é uma biblioteca com código aberto, independente da plataforma utilizada, que disponibiliza um conjunto de ferramentas para o desenvolvimento de aplicações gráficas de elevado desempenho tais como simuladores de voo, jogos, a realidade virtual e simulações 3D de alta performance. A sua utilização pode ser efetuada nas diversas plataformas existentes, como Linux, Microsoft Windows, FreeBSD, MAC OS X, a Solaris, a HP-UX, a AIX. Não possui suporte funcional para aglomerados. De modo a suportar um ambiente do tipo de um aglomerado pode-se recorrer ao auxílio do Chromium ou VRJuggler.
Baseado em torno do conceito de um grafo de cena, fornece um objeto/estrutura orientada ao nível alto do OpenGL, evitando que o utilizador execute a implementação e otimização recorrendo aos gráficos de nível baixo, e fornecendo muitas utilidades adicionais para o desenvolvimento rápido de aplicações gráficas.

## Características

Um grafo de cena é uma estrutura de dados que permite a organização hierárquica de objetos que constituem uma cena. Por exemplo, quando se representa um veículo com quatro rodas, é desejável que a alteração da posição ou da orientação do carro seja transmitida para as rodas. Outra relação explorada no grafo de cena é a hierarquia de volumes envolventes, onde objetos próximos são agrupados para que, durante a etapa de remoção, sejam eliminados com apenas um teste feito no topo da hierarquia, evitando a necessidade de aceder a cada um dos seus constituintes.
O OpenSceneGraph é um grafo de cena C++ para diversas plataformas que tenta utilizar os conceitos de padrões de desenho e aproveitar as funcionalidades da STL do ANSI C++ e do DesignPatterns, funcionando desta forma como uma alavanca no desenvolvimento de código aberto da fonte para fornecer uma biblioteca de desenvolvimento que seja legalmente livre e focalizada nas necessidades dos utilizadores finais.
Este grafo de cena possui um suporte avançado para o carregamento de diversos tipos de modelos (3D Studio, Lightwave, Wavefront OBJ, COLLADA, VRML, etc.) bem como imagens (PNG, JPEG, TGA, TIFF, GIF, BMP, etc.) através de um sistema de plugins. Possui suporte base para hierarquias de volumes envolventes, remoção de objetos fora do volume de visualização, LOD, paginação, e portais.
É fácil de personalizar o desenho de objetos através da redefinição do método de desenho. O processamento no OpenSceneGraph possui três fases(Figura 1):
* Update;
* Cull;
* Draw.
Na fase de Update é atualizada a cena. Nesta fase podem, por exemplo, ser executadas simulações de física ou efetuados movimentos de objetos dinâmicos. Na fase de Cull é efetuada a remoção de primitivas que estão fora do volume de visualização ou são muito pequenas (de dimensão inferior a um pixel). Por fim é efetuada a fase de Draw e a cena é desenhada, formando-se uma lista de objetos renderizáveis.
A lista de objetos renderizáveis pode ser ordenada da maneira que o utilizador definir. O OSG pré define duas maneiras de ordenar essa lista. Quando os objetos são opacos, eles são ordenados por estado e colocados na frente da lista. Dessa forma, minimiza-se a troca de estado do OpenGL, já que objetos com o mesmo estado serão renderizados em sequência. Quando os objetos são transparentes, os mesmos são ordenados de trás para frente e colocados no final da lista de renderização. Assim, todos os objetos opacos são renderizados primeiro, seguidos dos objetos transparentes, evitando que o teste de Z-Buffer feito pela placa gráfica descarte objetos que estejam atrás dos objetos transparentes. O OSG fornece ainda um sistema de callbacks para o utilizador implementar o seu próprio algoritmo de ordenação.
O OSG possui, ainda, uma classe que percorre o grafo de cena removendo os nós vazios, pré calculando as transformações realizadas em objetos estáticos e agregando estados semelhantes, aumentando o desempenho da aplicação em termos de quadros por segundo.

### Bibliotecas

O OpenSceneGraph (OSG) é, portanto, uma biblioteca que implementa várias funções de um grafo de cena: remoção por campo de visão, plano de oclusão (utilizando o algoritmo de Shadow Frusta), remoção de pequenos objetos, suporte a níveis de detalhe discretos, ordenação por estado (Um estado define as características de um objeto: material, textura, iluminação, etc.), suporte a diversos tipos de arquivos, vertex arrays e display lists, sendo os dois últimos otimizações específicas do OpenGL. A plataforma base contém várias bibliotecas. Exemplos:
* osg - Biblioteca para o grafo de cena.
* osgUtil - Biblioteca utilitária com funcionalidades como triangulação de Delaunay, cálculo do ponto de intersecção de um raio com a cena, conversão de geometria para strips de triângulos, etc.
* osgDB - Biblioteca que permite a leitura e escrita de grafos de cena.
* osgParticle - Biblioteca que possui suporte base para partículas de fogo, chuva, explosões, etc.
A biblioteca osg do OpenSceneGraph possui várias classes auxiliares para gestão de memória (alocação de memória com contagem de referências e smart pointers) e operações matemáticas (operações de vetores a duas, três e quatro dimensões, quaterniões, operações para matrizes, conversão de ângulos em graus de e para radianos, etc).
No OSG existem exemplos para demonstrar toda a funcionalidade da biblioteca, o que compensa a falta de documentação adequada. Essa pequena falha, em conjunto com à necessidade de conhecimentos avançados de orientação a objetos, torna a aprendizagem demorada.

### Pontes Fortes

Os pontos chave e fortes do OpenSceneGraph são o desempenho, o estabilidade, a portabilidade e os ganhos da produtividade associados com o facto de usar uma imagem gráfica inteiramente caracterizada. O objetivo do OpenSceneGraph é fazer com que todos os interessados possam livremente representar graficamente, utilizando toda a tecnologia disponível, quer a um nível comercial ou não.

## Projeto

O OSG utiliza vários conceitos de orientação a objeto e padrões de projeto. Entre os diversos padrões de projeto que o OSG implementa estão a cadeia de responsabilidade (chain of responsability), a composição (composite) e o visitante (visitor). A cadeia de responsabilidade é empregada na criação de leitores dos arquivos de modelo e imagem que compõem a cena. Os leitores são criados como plug-ins dinâmicos.
No OSG, qualquer análise do grafo é feito através do padrão visitante. A figura 2 ilustra as classes abstratas que compõem este padrão. A classe Node é a classe raiz de todos os objetos que ser inseridos no grafo de cena. Dela herda a classe Group, empregando o padrão composição.
Um grupo contém uma lista de nós filhos. E cada nó mantém sua lista de pais. No OSG é permitido que um nó tenha vários pais a fim de haver compartilhamento de nós em locais diferente do grafo. A classe NodeVisitor é a classe mãe de todos os visitantes. Ela permite percorrer o grafo de cima para baixo, de baixo para cima ou em percurso redefinido pelo método virtual "traverse" das subclasses de Node. Alguns grafos de cena, como o Performer, somente permitem o percurso de cima para baixo ou vice-versa. Uma das vantagens do OSG é facilitar a redefinição do percurso que, apesar de não ser necessária para o algoritmo de célula/portal, facilita a sua implementação.

## História

O OpenSceneGraph, vulgo OSG, foi inicialmente criado por Don Burns em 1998 de modo a poder executar um simulador de asa delta, originalmente desenvolvido para o sistema operativo IRIX da SGI sobre o Performer, num PC com Linux. Eventualmente cresceu e atraiu uma comunidade de desenvolvimento. O aumento da procura e interesse nesta solução levou um dos autores, Robert Osfield, a criar uma empresa de suporte. Tem existido um esforço contínuo de melhoramento desta solução, sendo lançadas regularmente novas versões com mais funcionalidades, bem como suporte para as novas plataformas 64-bit para PCs da arquitetura X86-64.