OpenSceneGraph
Paulo Ivson
[email protected]
Exemplos
Exemplo: arquivo de modelo
int main( int argc, char** argv )
{
osgViewer::Viewer viewer;
viewer.setSceneData( osgDB::readNodeFile("cessna.osg") );
return viewer.run();
}
Exemplo: ShapeDrawable
int main( int argc, char** argv )
{
osg::Sphere* sphere = new osg::Sphere( osg::Vec3(0,0,0), 1.0);
osg::ShapeDrawable* drawable = new osg::ShapeDrawable(sphere);
osg::Geode* geode = new osg::Geode();
geode->addDrawable(drawable);
osgViewer::Viewer viewer;
viewer.setSceneData( geode );
return viewer.run();
}
Exemplo: Groups e Transforms
osg::Group* root = new osg::Group();
osg::Box* unitCube = new osg::Box( osg::Vec3(0,0,0), 1.0f);
osg::ShapeDrawable* unitCubeDrawable = new osg::ShapeDrawable(unitCube);
osg::Geode* basicShapesGeode = new osg::Geode();
basicShapesGeode->addDrawable(unitCubeDrawable);
root->addChild(basicShapesGeode);
osg::Sphere* unitSphere = new osg::Sphere( osg::Vec3(0,0,0), 1.0);
osg::ShapeDrawable* unitSphereDrawable = new osg::ShapeDrawable(unitSphere);
osg::Geode* unitSphereGeode = new osg::Geode();
unitSphereGeode->addDrawable(unitSphereDrawable);
osg::PositionAttitudeTransform* sphereXForm = new osg::PositionAttitudeTransform();
sphereXForm->setPosition(osg::Vec3(2.5,0,0));
sphereXForm->addChild(unitSphereGeode);
root->addChild(sphereXForm);
Exemplo: Textures
osg::Texture2D* faceTexture = new osg::Texture2D;
osg::Image* image = osgDB::readImageFile("KLN89FaceB.tga");
faceTexture->setImage(image);
osg::StateSet* ss = root->getOrCreateStateSet();
ss->setTextureAttributeAndModes(0, faceTexture ,osg::StateAttribute::ON);
Exemplo: StateSets
osg::StateSet* blendStateSet = new osg::StateSet();
osg::TexEnv* blendTexEnv = new osg::TexEnv();
blendTexEnv->setMode(osg::TexEnv::BLEND);
blendStateSet->setTextureAttributeAndModes(0,faceTexture,osg::StateAttribute::ON);
blendStateSet->setTextureAttribute(0,blendTexEnv);
osg::StateSet* decalStateSet = new osg::StateSet();
osg::TexEnv* decalTexEnv = new osg::TexEnv();
decalTexEnv->setMode(osg::TexEnv::DECAL);
decalStateSet->setTextureAttributeAndModes(0,faceTexture,osg::StateAttribute::ON);
decalStateSet->setTextureAttribute(0,decalTexEnv);
root->setStateSet(blendStateSet);
unitSphereGeode->setStateSet(decalStateSet);
Arquitetura
Arquitetura
Sua aplicação
Carregamento
de arquivos
Classes
principais da
biblioteca
Extensões do
grafo por
terceiros
Arquitetura

O core do OSG oferece:




Classes para montagem do grafos de cena
Métodos para operar sobre o grafo
Funcionalidades típicas em aplicações 3D
Acesso aos plugins de carregamento de arquivos de textura e modelos
Arquitetura

Os NodeKits do OSG:


Estendem as funcionalidades de Nós, objetos desenháveis e atributos de
renderização
Permitem a tradução dos novos objetos gerados para o arquivo nativo
do OSG (.osg ou .ive)
Arquitetura

Os Plugins do OSG oferecem:


Carregamento de diversos formatos existentes de imagem 2D, modelo
3D, fonte e vídeo
Busca automática pelo plugin correto para cada formato
Arquitetura

Formatos suportados pelos plugins do
OSG:

.md2 – Quake

.txp – Terrex TerraPage

.osg e .ive - Modelos nativos do OSG

.x – Modelos do DirectX

.3ds – 3dsmax

.mov – Vídeo Quicktime

.obj – Alias Wavefront


.geo – Carbon Graphics’ Geo
.bmp, .dds, .gif, .jpeg, .pic, .png, .rgb, .tga, e .tiff –
Texturas

.dae – COLLADA


.shp – ESRI Shapefile
.zip – Plugin de ZIP que permite a abertura de
modelos em arquivos ZIP

.lwo e .lws – NewTek LightWave (.lwo e.lws)

Plugin para carregamento destes modelos a
partir da internet

.flt – OpenFlight
Arquitetura
Sua Aplicação
API do OSG
API de introsp.
do OSG
OSG Core
OSG NodeKits
OSG Plugins
osg
osgFX
osgdb_osg
osgUtil
osgManipulator
osgdb_3ds
osgDB
osgParticle
osgdb_png
osgGA
osgSim
osgdb_jpg
osgViewer
osgText
osgdb_zip
osgTerrain
outros ...
osgShadow

A biblioteca osg oferece classes para:





Componentes do
OSG Core
Montagem de grafos de cena
Matemática com vetores e matrizes
Representação Geométrica
Estados OpenGL (aparência)
Animações
OSG Core
osg
osgUtil
osgDB
apartamento
osgGA
osgViewer
sala
quarto
varanda
parede chão
cama
cama
chão
parede
mesa de
jantar
planta
tampo cadeira
cadeira

A biblioteca osgUtil oferece classes para:


Realizar operações sobre o grafo de cena:

Coletar os nós do grafo para renderizá-los

Calcular interseção com nós do grafo

Reunir estatísticas

Otimizar o grafo de cena
Também oferece
Componentes do
OSG Core
OSG Core
osg
osgUtil

Triangulação de Delaunay

Geração de triangle strips
osgDB

Geração de coordenadas de textura
osgGA
osgViewer

A biblioteca osgUtil oferece classes para:


Realizar operações sobre o grafo de cena:

Coletar os nós do grafo para renderizá-los

Calcular interseção com nós do grafo

Reunir estatísticas

Otimizar o grafo de cena
Também oferece
Componentes do
OSG Core
OSG Core
osg
osgUtil

Triangulação de Delaunay

Geração de triangle strips
osgDB

Geração de coordenadas de textura
osgGA
osgViewer

A biblioteca osgDB oferece classes para:


Carregar e salvar modelos e imagens usando os
plugins do OSG
Permitir ao desenvolvedor criar plugins para carregar
e salvar modelos em outros formatos

Útil para formatos proprietários ou formatos que o
OSG não suporte
Componentes do
OSG Core
OSG Core
osg
osgUtil
osgDB
“c:/temp/imagem.png”
osgGA
osgViewer
osgDB::readImageFile()
osgdb_png.dll
OSG Plugins
osgdb_osg
osg::Image*
osgdb_3ds
osgdb_png
outros ...

A biblioteca osgGA oferece classes para:



Receber e processar eventos de mouse e teclado
Movimentar a câmera pelo modelo
Transformar esses eventos em alterações na cena
Componentes do
OSG Core
OSG Core
osg
osgUtil
osgDB
Event
MOUSE_PUSH
osgGA
Event
osgViewer
KEYDOWN
Viewer
osgGA::MatrixManipulator

A biblioteca osgViewer oferece classes para:





Integrar a visualização do OSG a diversas toolkits de
janela (AGL/CGL, Cocoa, FLTK, Fox, MFC, Qt, SDL,
Win32, WxWindows, W11, etc)
Visualizações em janela única
Visualizações com múltiplas vistas e superfícies de
desenho renderizadas usando múltiplos
processadores
Processamento de eventos
Carregar dados do disco em background
Componentes do
OSG Core
OSG Core
osg
osgUtil
osgDB
osgGA
osgViewer

O NodeKit osgFX oferece classes para a
renderização de efeitos especiais como:





Iluminação anisotropica
Bumb mapping
Cartoon Shading
Luzes especulares
Rendering com Outline
Componentes do
OSG Core
OSG NodeKits
osgFX
osgManipulator
osgParticle
osgSim
osgText
osgTerrain
osgShadow

O NodeKit osgManipulation oferece classes
para manipular objetos do grafo de cena:



Mover
Rotacionar
Modificar escala
Componentes do
OSG Core
OSG NodeKits
osgFX
osgManipulator
osgParticle
osgSim
osgText
osgTerrain
osgShadow

O NodeKit osgParticle permite a criação de
efeitos baseados em simulações de partículas
como explosões, fogo e fumaça
Componentes do
OSG Core
OSG NodeKits
osgFX
osgManipulator
osgParticle
osgSim
osgText
osgTerrain
osgShadow

O NodeKit osgSim atende a demandas
específicas de certos sistemas de simulação e
modelos OpenFlight:



Consultas a dados de elevação de terreno
Luzes pontuais
Transformações
Componentes do
OSG Core
OSG NodeKits
osgFX
osgManipulator
osgParticle
osgSim
osgText
osgTerrain
osgShadow

O NodeKit osgText oferece suporte completo ao
desenho fontes TrueType em 2D e 3D
Componentes do
OSG Core
OSG NodeKits
osgFX
osgManipulator
osgParticle
osgSim
osgText
osgTerrain
osgShadow

O NodeKit osgTerrain oferece suporte para a
renderização de dados de altimetria
Componentes do
OSG Core
OSG NodeKits
osgFX
osgManipulator
osgParticle
osgSim
osgText
osgTerrain
osgShadow

O NodeKit osgShadow oferece suporte para a
diversas técnicas de renderização de sombras
Componentes do
OSG Core
OSG NodeKits
osgFX
osgManipulator
osgParticle
osgSim
osgText
osgTerrain
osgShadow
Arquitetura (Fim)
Sua aplicação
Tipos de Nós
Contagem de Referências (1/2)
Group
Transform
Transform
Transform
1 ref
1 ref
Geode
3 refs




Objetos do OSG derivam indiretamente de osg::Referenced
Essa classe permite a liberação automática desses objetos quando ninguém
mais os está referenciando
Para que funcione, é necessário usar ponteiros do tipo osg::ref_ptr
Essa classe é responsável por atualizar a contagem de referências em cada
objeto
Contagem de Referências (2/2)


É necessário tomar cuidado para que um objeto não seja
deletado enquanto ainda está sendo usado
Por exemplo, uma função ingênua para remover um
objeto do grafo, seria:
está_no_grafo( objeto )?
N
Transform
Transform
S
Transform
1 ref
pai = objeto.pai;
pai.remover( objeto )
1 ref
Geode
3 refs
fim
Principais Nós do OSG
osg::Node
osg::Group
osg::LOD
osg::Switch
osg::Geode
osg::Transform
osg::Billboard
osg::AutoTransform
osg::MatrixTransform
osg::PositionAttitudeTransform
Montando um grafo
apartamento
sala
quarto
varanda
parede
cama
cama
chão
chão
parede
mesa de
jantar
planta
tampo
cadeira
cadeira
Tipos de nós do OSG (Group e Geode)
osg::Node
osg::Group
osg::LOD
quarto
osg::Geode
cama
cama
chão parede
(Quarto é formado por: camas, chão
e paredes)
osg::Transform
(Classes herdam funcionalidades
das classes de que derivam)
osg::Group
osg::Geode
osg::Geode
osg::Geode
osg::Geode
Tipos de nós do OSG (Transform)
osg::Node
osg::Group
quarto
osg::Geode
cama
osg::LOD
cama
osg::Transform
(Classes herdam funcionalidades
das classes de que derivam)
osg::Group
osg::Transform
osg::Transform
posição = (8, 3, 0)
posição = (8, 4, 0)
osg::Geode
Hierarquia de Movimentos/Transformações
Dedo
Base
Braço 1
Braço 2
Braço 3
Dedo
Hierarquia de
Movimentos/Transformações
Grupo
Base
Transformação
Transformação
Transformação
Transformação
Braço 1
Braço 2
Braço 3
Dedo
Dedo
Montando Hierarquia no OSG
osg::Group* group = new osg::Group();
group
(osg::Group)
osg::MatrixTransform* mt1 = new
osg::MatrixTransform();
mt1
base
(osg::MatrixTransform)
(osg::Geode)
mt1->setMatrix( matrix1 );
group->addChild( mt1 );
osg::MatrixTransform* mt2 = new
osg::MatrixTransform();
mt2->setMatrix( matrix2 );
mt2
(osg::MatrixTransform)
braco1
(osg::Geode)
mt1->addChild( mt2 );
mt3
osg::MatrixTransform* mt3 = new
osg::MatrixTransform();
mt3->setMatrix( matrix3 );
mt2->addChild( mt3 );
(osg::MatrixTransform)
braco2
(osg::Geode)
Tipos de nós do OSG (LOD)
osg::Node
quarto
osg::Group
osg::Geode
cama hi
osg::LOD
cama med
cama low
osg::Transform
(Classes herdam funcionalidades
das classes de que derivam)
osg::Group
5 a 10m
osg::LOD
osg::Geode
osg::Geode
osg::Geode
Geode – Geometry Node

Os Geodes contém uma lista de objetos desenháveis
(Drawables)
osg::Node
osg::Geode
1
0..N
osg::Drawable
osg::ShapeDrawable
osg::Geometry
Drawable

osg::Node
É possível reimplementar a classe
Drawable e fazer chamadas diretas
ao OpenGL
class MeuDrawable : public osg::Drawable
osg::Geode
1
0..N
{
virtual void drawImplementation( RenderInfo& renderInfo )
const
{
glBegin( GL_LINES );
osg::Drawable
glVertex3f( 0, 0, 0 );
glVertex3f( 0, 1, 0 );
glVertex3f( 1, 2, 0 );
glVertex3f( 3, 3, 0 );
osg::Geometry
glVertex3f( 3, 3, 0 );
glVertex3f( 3, 4, 0 );
osg::ShapeDrawable
glEnd();
}
}
Drawable

osg::Node
É possível atribuir formas
geométricas a uma instância dessa
classe:

osg::Geode


1
0..N
osg::Drawable




osg::Geometry
osg::ShapeDrawable

Esfera
Caixa
Cone
Cilindro
Cápsula
Plano Infinito
Fecho Convexo
Campo de Alturas
Drawable

osg::Node
osg::Geode
1
0..N
osg::Drawable
osg::Geometry
osg::ShapeDrawable
É possível atribuir vértices, normais
e faces a uma instância dessa classe
Mais Exemplos
Desenho com Normais em 3D (1/2)
osg::Geometry* geometry = new osg::Geometry();
osg::Vec3Array& vertexArray = *new osg::Vec3Array( 8 );
geometry->setVertexArray( &vertexArray );
vertexArray[0] = osg::Vec3( 0, 0, 0 );
vertexArray[1] = osg::Vec3( 1, 0, 0 );
vertexArray[2] = osg::Vec3( 1, 1, 0 );
vertexArray[3] = osg::Vec3( 0, 1, 0 );
vertexArray[4] = osg::Vec3( 0, 0, 0 );
vertexArray[5] = osg::Vec3( 1, 0, 0 );
vertexArray[6] = osg::Vec3( 1, 0, -1 );
vertexArray[7] = osg::Vec3( 0, 0, -1 );
geometry->addPrimitiveSet( new osg::DrawArrays( osg::PrimitiveSet::QUADS, 0, 8 ) );
geoNode->addDrawable( geometry );
Desenho com Normais em 3D (2/2)
osg::Geometry* geometry = new osg::Geometry();
osg::Vec3Array& vertexArray = *new osg::Vec3Array( 8 );
geometry->setVertexArray( &vertexArray );
osg::Vec3Array& normalArray = *new osg::Vec3Array( 8 );
geometry->setNormalArray( &normalArray );
geometry->setNormalBinding( osg::Geometry::BIND_PER_VERTEX );
vertexArray[0] = osg::Vec3( 0, 0, 0 );
normalArray[0] = osg::Vec3( 0, 0, 1 );
vertexArray[1] = osg::Vec3( 1, 0, 0 );
normalArray[1] = osg::Vec3( 0, 0, 1 );
vertexArray[2] = osg::Vec3( 1, 1, 0 );
normalArray[2] = osg::Vec3( 0, 0, 1 );
vertexArray[3] = osg::Vec3( 0, 1, 0 );
normalArray[3] = osg::Vec3( 0, 0, 1 );
vertexArray[4] = osg::Vec3( 0, 0, 0 );
normalArray[4] = osg::Vec3( 0, -1, 0 );
vertexArray[5] = osg::Vec3( 1, 0, 0 );
normalArray[5] = osg::Vec3( 0, -1, 0 );
vertexArray[6] = osg::Vec3( 1, 0, -1 );
normalArray[6] = osg::Vec3( 0, -1, 0 );
vertexArray[7] = osg::Vec3( 0, 0, -1 );
normalArray[7] = osg::Vec3( 0, -1, 0 );
geometry->addPrimitiveSet( new osg::DrawArrays( osg::PrimitiveSet::QUADS, 0, 8 ) );
geoNode->addDrawable( geometry );
Cores por Vértice


Cada vértice da geometria também pode ser associado a
uma cor diferente
Essa cor pode ser associada à cor final do objeto


material->setColorMode( osg::Material:: AMBIENT_AND_DIFFUSE );
O vetor de cores é associado ao Geometry com o
método setColorArray()
Usando Índices (1/2)

Na prática, mesmo com strips, boa parte dos objetos desenhados exige que um
vértice seja enviado à placa repetidas vezes

Se um grid 170x80 fosse enviado à GPU usando um DrawArrays de
TRIANGLE_STRIPS ou QUAD_STRIPS, usaria 2x171x80x12 = 348 kbytes

As placas gráficas aceitam que a ordem de criação das faces seja definida com
índices, que referenciam posições no vetor de vértices

Usando índices, esse mesmo grid poderia ser enviado à GPU usando 171x81x12 +
2x171x80x4 = 276 kbytes (20% menos)
Usando Índices (2/2)
osg::Geometry* geometry = new osg::Geometry();
unsigned int indices[6];
indices[0] = 0;
osg::Vec3Array& vertexArray = *new osg::Vec3Array( 9 );
indices[1] = 3;
vertexArray[0] = osg::Vec3( 0, 0, 0 );
indices[2] = 1;
vertexArray[1] = osg::Vec3( 1, 0, 0 );
indices[3] = 4;
vertexArray[2] = osg::Vec3( 2, 0, 0 );
indices[4] = 2;
vertexArray[3] = osg::Vec3( 0, 1, 0 );
indices[5] = 5;
vertexArray[4] = osg::Vec3( 1, 1, 0 );
geometry->addPrimitiveSet( new osg::DrawElementsUInt(
osg::PrimitiveSet::QUAD_STRIP, 6, indices ) );
vertexArray[5] = osg::Vec3( 2, 1, 0 );
vertexArray[6] = osg::Vec3( 0, 2, 0 );
vertexArray[7] = osg::Vec3( 1, 2, 0 );
vertexArray[8] = osg::Vec3( 2, 2, 0 );
geometry->setVertexArray( &vertexArray );
indices[0] = 3;
indices[1] = 6;
indices[2] = 4;
indices[3] = 7;
indices[4] = 5;
indices[5] = 8;
geometry->addPrimitiveSet( new osg::DrawElementsUInt(
osg::PrimitiveSet::QUAD_STRIP, 6, indices ) );
Estados de Rendering


A aparência da geometria renderizada no OpenGL pode
ser modificada através da manipulação dos estados de
rendering do OpenGL
Estados de rendering permitem controlar:







Iluminação
Texturas
Planos de recorte
Névoa
Combinação de texturas transparentes
Renderização com pontos, linhas ou preenchimento
etc...
Aplicando Neblina

No OSG:
void aplicarNeblina( osg::Node* node )
{
osg::StateSet* stateset = new osg::StateSet();
stateset->setMode( GL_FOG, osg::StateAttribute::ON );
node->setStateSet( stateset );
}

No OpenGL:
void desenharCenaComNeblina()
{
glEnable( GL_FOG );
desenhar_trechos_da_cena_com_fog();
glDisable( GL_FOG );
}
Aplicando Materiais
#include <osg/Material>
void aplicarMaterial( osg::Node* node )
{
osg::StateSet* stateset = new osg::StateSet();
node->setStateSet( stateset );
osg::Material* material = new osg::Material();
material->setAmbient( osg::Material::FRONT_AND_BACK, osg::Vec4( 0, 0.5, 0, 1 ) );
material->setDiffuse( osg::Material::FRONT_AND_BACK, osg::Vec4( 0, 1, 0, 1 ) );
material->setSpecular( osg::Material::FRONT_AND_BACK, osg::Vec4( 1, 1, 1, 1 ) );
stateset->setAttributeAndModes( material, osg::StateAttribute::ON );
}
Aplicando Texturas
osg::StateSet* stateset = new osg::StateSet();
node->setStateSet( stateset );
osg::Image* image = osgDB::readImageFile( "c:/temp/madeira.png" );
osg::Texture2D* texture = new osg::Texture2D( image );
texture->setFilter( osg::Texture::MAG_FILTER, osg::Texture::LINEAR );
texture->setFilter( osg::Texture::MIN_FILTER, osg::Texture::LINEAR );
texture->setWrap( osg::Texture::WRAP_S, osg::Texture::REPEAT );
texture->setWrap( osg::Texture::WRAP_T, osg::Texture::REPEAT );
stateset->setTextureAttributeAndModes( 0, texture, osg::StateAttribute::ON );
Textura



Uma textura pode ser uma imagem 1D, 2D ou 3D
Para que seja corretamente aplicada em um objeto, cada um de seus
vértices devem ter coordenadas de textura (Texture Coordinates)
Coordenadas de textura podem ser aplicadas para cada vértice ou usando
uma equação (ver osg::TexGen ou glTexGen())
0
0
1
2
2.2
1
2
(1;1)
(2;1)
3
(3;1)
3.8
Desenho com Textura
osg::Geode* geoNode = new osg::Geode();
osg::Vec3Array& vertexArray = *new osg::Vec3Array( 4 );
vertexArray[0] = osg::Vec3( 0, 0, 0 );
vertexArray[1] = osg::Vec3( 0, 1, 0 );
vertexArray[2] = osg::Vec3( 1, 0, 0 );
vertexArray[3] = osg::Vec3( 1, 1, 0 );
osg::Vec2Array& tex0Array = *new osg::Vec2Array( 4 );
tex0Array[0] = osg::Vec2( 0, 0 );
tex0Array[1] = osg::Vec2( 0, 1 );
tex0Array[2] = osg::Vec2( 1, 0 );
tex0Array[3] = osg::Vec2( 1, 1 );
osg::Image* image = osgDB::readImageFile( "C:/temp/brick
yellow.jpg" );
osg::Texture2D* texture = new osg::Texture2D( image );
texture->setWrap( osg::Texture::WRAP_S, osg::Texture::REPEAT
);
texture->setWrap( osg::Texture::WRAP_T, osg::Texture::REPEAT
);
osg::StateSet* stateset = new osg::StateSet();
stateset->setTextureAttributeAndModes( 0, texture );
osg::Geometry* geometry = new osg::Geometry();
geometry->setVertexArray( &vertexArray );
geometry->setTexCoordArray( 0, &tex0Array );
geometry->setStateSet( stateset );
geometry->addPrimitiveSet( new osg::DrawArrays(
osg::PrimitiveSet::QUAD_STRIP, 0, 4 ) );
geoNode->addDrawable( geometry );
Desenho com textura (Wrap) (1/3)


É necessário definir como a textura se comportará fora
do intervalo [0..1] de coordenadas de textura
Existem 5 modos:





CLAMP
CLAMP_TO_EDGE
CLAMP_TO_BORDER
REPEAT
MIRROR
Desenho com textura (Wrap) (2/3)
osg::Vec2Array& tex0Array = *new
osg::Vec2Array( 4 );
tex0Array[0] = osg::Vec2( 0, 0 );
tex0Array[1] = osg::Vec2( 0, 1 );
tex0Array[2] = osg::Vec2( 1, 0 );
tex0Array[3] = osg::Vec2( 1, 1 );
osg::Vec2Array& tex0Array = *new
osg::Vec2Array( 4 );
tex0Array[0] = osg::Vec2( 0, 0 );
tex0Array[1] = osg::Vec2( 0, 1 );
tex0Array[2] = osg::Vec2( 4, 0 );
tex0Array[3] = osg::Vec2( 4, 1 );
texture->setWrap( osg::Texture::WRAP_S,
osg::Texture::REPEAT );
Desenho com textura (Wrap) (3/3)
osg::Vec2Array& tex0Array = *new osg::Vec2Array( 4 );
tex0Array[0] = osg::Vec2( -0.5, -0.5 );
tex0Array[1] = osg::Vec2( -0.5, 1.5 );
tex0Array[2] = osg::Vec2( 1.5, -0.5 );
tex0Array[3] = osg::Vec2( 1.5, 1.5 );
texture->setWrap( osg::Texture::WRAP_S,
osg::Texture::CLAMP_TO_BORDER );
texture->setWrap( osg::Texture::WRAP_T,
osg::Texture::CLAMP_TO_BORDER );
texture->setBorderColor( osg::Vec4( 0, 0, 0, 1 ) );
osg::Vec2Array& tex0Array = *new osg::Vec2Array( 4 );
tex0Array[0] = osg::Vec2( -0.5, -0.5 );
tex0Array[1] = osg::Vec2( -0.5, 1.5 );
tex0Array[2] = osg::Vec2( 1.5, -0.5 );
tex0Array[3] = osg::Vec2( 1.5, 1.5 );
texture->setWrap( osg::Texture::WRAP_S,
osg::Texture::CLAMP_TO_EDGE );
texture->setWrap( osg::Texture::WRAP_T,
osg::Texture::CLAMP_TO_EDGE );
Câmera
Como configurar a câmera no OSG?

O posicionamento da câmera é feito pela matriz de View (que
no OpenGL, é unida à matriz ModelView)

Parâmetros:




Posição dos olhos
Direção de visualização
Direção de Up
A projeção da cena na tela é feita pela matriz de Projection

Parâmetros:



Abertura
Z-Near e Z-Far
Razão de Aspecto (Aspect Ratio)
Configurando a Matriz de View

No OSG:
osg::Matrix matrix = osg::Matrix::lookAt( osg::Vec3( -10, -10, 10 ),
osg::Vec3( 0, 0, 0 ), osg::Vec3( 0, 0, 1 ) );
viewer.getCamera()->setViewMatrix( matrix );

No OpenGL:
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
gluLookAt( -10, -10, -10,
0, 0, 0,
0, 0, 1 );
Configurando a Matriz de Projection

No OSG:
osg::Matrix matrix = osg::Matrix::perspective( 45, 1.3, 0.1, 1000 );
viewer.getCamera()->setProjectionMatrix( matrix );

No OpenGL:
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluPerspective( 45, 1.3, 0.1, 1000 );
Etapas de Desenho
Etapas de desenho do OSG

Event

Nesta etapa, os eventos gerados durante o quadro
anterior são processados
Tipos de eventos:
 Teclado
 Mouse
 Resize das janelas
Eventos de teclado
 Fechamento


Update

Cull

Draw
e mouse

GPU
Geram
atualizações no
estado da cena
Etapas de desenho do OSG

Event

Nesta etapa, o grafo de cena é atualizado
Durante as etapas seguintes, este estará sendo desenhado
e não poderá ser modificado


Update

Cull

Draw
Simulação
física
Animações
Atualizações no
estado da cena

GPU
Etapas de desenho do OSG

Event

Nesta etapa, todos os objetos a serem desenhados são
coletados durante um caminhamento pelo grafo de cena
Esta etapa pode ser realizada em diferentes processadores


Update
Estes 3 objetos estão fora
do volume de visão, então
não serão desenhados

Cull

Draw

GPU
Este objeto está
distante, uma versão de
menor resolução poderá
ser usada
Etapas de desenho do OSG

Event

Nesta etapa, todos os objetos coletados são ordenados e enviados à placa
3D
Eles podem ser ordenados por estado OpenGL (aparência) ou de acordo
com sua distância à câmera


Update

Cull
Ordenação
por estados

Draw

GPU
Ordenação

Existem diversas ordens possíveis para desenhar os
objetos da cena




Do mais distante ao mais próximo (necessário para objetos
transparentes)
Do mais próximo ao mais distante (útil para objetos com
shaders complexos)
Ordenandos por estados similares (default do OSG)
Imagine uma cena composta por 1000 guerreiros com
calça azul e camisa branca

Desenhar sem ordenação por estado implica em 1998 trocas
de estado desnecessárias

Material azul > desenhar > material branco > desenhar > material
azul > desenhar ...
Ordenação – Do fundo à frente
α = 50% cor=
α = 50% cor=
α = 50% cor=
α = 50% cor=
A-Buffer contém uma lista de
superfícies que compõem um
determinado pixel
Ordenação – Do fundo à frente
Esferas desenhadas do
fundo para a frente
1 2 3 4
Esferas desenhadas em
ordem aleatória
2 3 1 4
Etapas de desenho do OSG

Event

Nesta etapa, placa 3D desenha a geometria recebida
A geometria não é renderizada imediatamente
Pode ficar por algum tempo em uma fila de renderização



Update

Cull

Draw

GPU
Etapas de desenho do OSG





Event – Processamento de eventos (teclado, mouse, ...)
Update – Atualização do grafo
Cull – Seleção de geometria visível
Draw – Ordenação e envio à placa
GPU – Tempo de desenho na GPU (draw gpu)
Etapas de desenho do OSG
Download

PPT - PUC-Rio