73
OpenSceneGraph Paulo Ivson [email protected]

OpenSceneGraph Paulo Ivson [email protected]

Embed Size (px)

Citation preview

Page 1: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

OpenSceneGraph

Paulo [email protected]

Page 2: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Exemplos

Page 3: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Exemplo: arquivo de modeloint main( int argc, char** argv ){

osgViewer::Viewer viewer;viewer.setSceneData( osgDB::readNodeFile("cessna.osg") );return viewer.run();

}

Page 4: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Exemplo: ShapeDrawableint 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();

}

Page 5: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Exemplo: Groups e Transformsosg::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);

Page 6: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Exemplo: Texturesosg::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);

Page 7: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Exemplo: StateSetsosg::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);

Page 8: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Arquitetura

Page 9: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

ArquiteturaSua aplicação

Classes principais da

biblioteca

Carregamento de arquivos

Extensões do grafo por terceiros

Page 10: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

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

Page 11: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

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)

Page 12: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

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

Page 13: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Arquitetura

Formatos suportados pelos plugins do OSG: .osg e .ive - Modelos nativos do OSG .3ds – 3dsmax .obj – Alias Wavefront .geo – Carbon Graphics’ Geo .dae – COLLADA .shp – ESRI Shapefile .lwo e .lws – NewTek LightWave (.lwo

e.lws)

.flt – OpenFlight .md2 – Quake .txp – Terrex TerraPage .x – Modelos do DirectX .mov – Vídeo Quicktime .bmp, .dds, .gif, .jpeg, .pic, .png, .rgb, .

tga, e .tiff – Texturas .zip – Plugin de ZIP que permite a

abertura de modelos em arquivos ZIP Plugin para carregamento destes

modelos a partir da internet

Page 14: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

API de introsp.do OSG

API do OSG

OSG PluginsOSG Core

ArquiteturaSua Aplicação

osgosgUtilosgDBosgGA

osgViewer

osgdb_osg

osgdb_pngosgdb_3ds

osgdb_jpgosgdb_zipoutros ...

OSG NodeKitsosgFX

osgManipulator

osgParticleosgSimosgText

osgTerrainosgShadow

Page 15: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Componentes do OSG Core

OSG Coreosg

osgUtilosgDBosgGA

osgViewer

A biblioteca osg oferece classes para: Montagem de grafos de cena Matemática com vetores e matrizes Representação Geométrica Estados OpenGL (aparência) Animações

apartamento

quarto

sala

cama camamesa de

jantarchão paredechãoparede

varanda

planta

cadeiracadeiratampo

Page 16: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Componentes do OSG Core

OSG Coreosg

osgUtilosgDBosgGA

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 Triangulação de Delaunay Geração de triangle strips Geração de coordenadas de textura

Page 17: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Componentes do OSG Core

OSG Coreosg

osgUtilosgDBosgGA

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 Triangulação de Delaunay Geração de triangle strips Geração de coordenadas de textura

Page 18: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Componentes do OSG Core

OSG Coreosg

osgUtilosgDBosgGA

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

OSG Pluginsosgdb_osg

osgdb_pngosgdb_3ds

outros ...

“c:/temp/imagem.png”

osgDB::readImageFile()

osg::Image*

osgdb_png.dll

Page 19: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Componentes do OSG Core

OSG Coreosg

osgUtilosgDBosgGA

osgViewer

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

osgGA::MatrixManipulator

EventMOUSE_PUSH

Viewer

EventKEYDOWN

getViewMatrix()

Page 20: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Componentes do OSG Core

OSG Coreosg

osgUtilosgDBosgGA

osgViewer

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

Page 21: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Componentes do OSG Core

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

OSG NodeKitsosgFX

osgManipulator

osgParticleosgSimosgText

osgTerrainosgShadow

Page 22: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Componentes do OSG Core

O NodeKit osgManipulation oferece classes para manipular objetos do grafo de cena: Mover Rotacionar Modificar escala

OSG NodeKitsosgFX

osgManipulator

osgParticleosgSimosgText

osgTerrainosgShadow

Page 23: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Componentes do OSG Core

O NodeKit osgParticle permite a criação de efeitos baseados em simulações de partículas como explosões, fogo e fumaça

OSG NodeKitsosgFX

osgManipulator

osgParticleosgSimosgText

osgTerrainosgShadow

Page 24: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Componentes do OSG Core

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

OSG NodeKitsosgFX

osgManipulator

osgParticleosgSimosgText

osgTerrainosgShadow

Page 25: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Componentes do OSG Core

O NodeKit osgText oferece suporte completo ao desenho fontes TrueType em 2D e 3D

OSG NodeKitsosgFX

osgManipulator

osgParticleosgSimosgText

osgTerrainosgShadow

Page 26: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Componentes do OSG Core

O NodeKit osgTerrain oferece suporte para a renderização de dados de altimetria

OSG NodeKitsosgFX

osgManipulator

osgParticleosgSimosgText

osgTerrainosgShadow

Page 27: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Componentes do OSG Core

O NodeKit osgShadow oferece suporte para a diversas técnicas de renderização de sombras

OSG NodeKitsosgFX

osgManipulator

osgParticleosgSimosgText

osgTerrainosgShadow

Page 28: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Arquitetura (Fim)

Sua aplicação

Page 29: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Tipos de Nós

Page 30: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Contagem de Referências (1/2)

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

Group

Transform

Geode

Transform Transform

ref_ptrref_ptr

ref_ptrref_ptr

ref_

ptr 1 ref1 ref

3 refs

Page 31: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

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 )?

pai = objeto.pai;pai.remover( objeto )

SN

fimGeode

Transform

ref_ptrref_ptr

ref_

ptr 1 ref1 ref

3 refs

TransformTransform

Page 32: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Principais Nós do OSGosg::Node

osg::Group osg::Geode

osg::Billboardosg::Transform

osg::MatrixTransform osg::PositionAttitudeTransform

osg::AutoTransform

osg::Switchosg::LOD

Page 33: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Montando um grafo

apartamento

quarto sala

cama camamesa de

jantarchão parede

chãoparede

varanda

planta

cadeira

cadeiratampo

Page 34: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Tipos de nós do OSG (Group e Geode)osg::Node

osg::Group osg::Geode

osg::Transformosg::LOD

quarto

cama cama chão parede

osg::Group

osg::Geode

osg::Geode

osg::Geode

osg::Geode

(Classes herdam funcionalidades das classes de que derivam)

(Quarto é formado por: camas, chão e paredes)

Page 35: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Tipos de nós do OSG (Transform)osg::Node

osg::Group osg::Geode

osg::Transformosg::LOD

quarto

cama cama

osg::Group

osg::Geode

(Classes herdam funcionalidades das classes de que derivam)

osg::Transform

osg::Transform

posição = (8, 3, 0) posição = (8, 4, 0)

Page 36: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Hierarquia de Movimentos/Transformações

Base Braço 1 Braço 2 Braço 3Dedo

Dedo

Page 37: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Hierarquia de Movimentos/Transformações

Transformação

Grupo

Base

Transformação Braço 1

Transformação Braço 2

Transformação Braço 3 Dedo Dedo

Page 38: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Montando Hierarquia no OSGosg::Group* group = new

osg::Group();

osg::MatrixTransform* mt1 = new osg::MatrixTransform();

mt1->setMatrix( matrix1 );group->addChild( mt1 );

osg::MatrixTransform* mt2 = new osg::MatrixTransform();

mt2->setMatrix( matrix2 );mt1->addChild( mt2 );

osg::MatrixTransform* mt3 = new osg::MatrixTransform();

mt3->setMatrix( matrix3 );mt2->addChild( mt3 );

mt1(osg::MatrixTransform)

group(osg::Group)

base(osg::Geode)

mt2(osg::MatrixTransform)

braco1(osg::Geode)

mt3(osg::MatrixTransform)

braco2(osg::Geode)

Page 39: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Tipos de nós do OSG (LOD)osg::Node

osg::Group osg::Geode

osg::Transformosg::LOD

quarto

cama hi

osg::Group

osg::Geode

(Classes herdam funcionalidades das classes de que derivam)

osg::LOD

cama med cama low

osg::Geode

osg::Geode

0 a 5m

5 a

10m 10 a 15m

Page 40: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Geode – Geometry Node Os Geodes contém uma lista de objetos

desenháveis (Drawables)

osg::Node

osg::Geode

osg::Drawable

1

0..N

osg::ShapeDrawable osg::Geometry

Page 41: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Drawable É possível reimplementar a

classe Drawable e fazer chamadas diretas ao OpenGL

class MeuDrawable : public osg::Drawable{virtual void drawImplementation( RenderInfo&

renderInfo ) const{

glBegin( GL_LINES );glVertex3f( 0, 0, 0 );glVertex3f( 0, 1, 0 );glVertex3f( 1, 2, 0 );glVertex3f( 3, 3, 0 );glVertex3f( 3, 3, 0 );glVertex3f( 3, 4, 0 );glEnd();

}}

osg::Node

osg::Geode

osg::Drawable

1

0..N

osg::ShapeDrawable

osg::Geometry

Page 42: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Drawable É possível atribuir formas

geométricas a uma instância dessa classe: Esfera Caixa Cone Cilindro Cápsula Plano Infinito Fecho Convexo Campo de Alturas

osg::Node

osg::Geode

osg::Drawable

1

0..N

osg::ShapeDrawable

osg::Geometry

Page 43: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Drawable É possível atribuir vértices,

normais e faces a uma instância dessa classeosg::Node

osg::Geode

osg::Drawable

1

0..N

osg::ShapeDrawable

osg::Geometry

Page 44: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Mais Exemplos

Page 45: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

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 );

Page 46: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

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 );

Page 47: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

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()

Page 48: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

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)

Page 49: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Usando Índices (2/2)osg::Geometry* geometry = new osg::Geometry();

osg::Vec3Array& vertexArray = *new osg::Vec3Array( 9 );

vertexArray[0] = osg::Vec3( 0, 0, 0 );vertexArray[1] = osg::Vec3( 1, 0, 0 );vertexArray[2] = osg::Vec3( 2, 0, 0 );vertexArray[3] = osg::Vec3( 0, 1, 0 );vertexArray[4] = osg::Vec3( 1, 1, 0 );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 );

unsigned int indices[6];indices[0] = 0;indices[1] = 3;indices[2] = 1;indices[3] = 4;indices[4] = 2;indices[5] = 5;geometry->addPrimitiveSet( new

osg::DrawElementsUInt( osg::PrimitiveSet::QUAD_STRIP, 6, indices ) );

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 ) );

Page 50: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

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...

Page 51: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

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 );

}

Page 52: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

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 );}

Page 53: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Aplicando Texturasosg::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 );

Page 54: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

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())

Textura

0 1 2 3 3.80

1

2

2.2

(1;1) (2;1) (3;1)

Page 55: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Desenho com Texturaosg::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 );

Page 56: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

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

Page 57: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

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 );

Page 58: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

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 );

Page 59: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Câmera

Page 60: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

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)

Page 61: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

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 );

Page 62: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

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 );

Page 63: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Etapas de Desenho

Page 64: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Etapas de desenho do OSG

Eventos de teclado e mouse

Event Update Cull Draw GPU Nesta etapa, os eventos gerados durante o

quadro anterior são processados Tipos de eventos:

Teclado Mouse Resize das janelas Fechamento

Geram atualizações no estado da cena

Page 65: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Etapas de desenho do OSG

Animações

Event Update

Cull Draw GPU Nesta etapa, o grafo de cena é atualizado Durante as etapas seguintes, este estará

sendo desenhado e não poderá ser modificado

Atualizações no estado da cena

Simulação física

Page 66: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Etapas de desenho do OSG Event Update Cull Draw GPU 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

Estes 3 objetos estão fora do volume de visão, então

não serão desenhados

Este objeto está distante, uma versão de menor resolução poderá

ser usada

Page 67: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Etapas de desenho do OSG Event Update Cull Draw GPU 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

Ordenação por estados

Page 68: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

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 ...

Page 69: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Ordenação – Do fundo à frente

α = 50% cor=

α = 50% cor=

α = 50% cor=

A-Buffer contém uma lista de superfícies que compõem um

determinado pixel

α = 50% cor=

Page 70: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Ordenação – Do fundo à frente

Esferas desenhadas do fundo para a frente

Esferas desenhadas em ordem aleatória

2 3 1 41 2 3 4

Page 71: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Etapas de desenho do OSG Event Update Cull Draw GPU 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

Page 72: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

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)

Page 73: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br

Etapas de desenho do OSG