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
Download

05-OgreT