openscenegraph paulo ivson [email protected]
TRANSCRIPT
![Page 2: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/2.jpg)
Exemplos
![Page 3: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/3.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/4.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/5.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/6.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/7.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/8.jpg)
Arquitetura
![Page 9: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/9.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/10.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/11.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/12.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/13.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/14.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/15.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/16.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/17.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/18.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/19.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/20.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/21.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/22.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/23.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/24.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/25.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/26.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/27.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/28.jpg)
Arquitetura (Fim)
Sua aplicação
![Page 29: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/29.jpg)
Tipos de Nós
![Page 30: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/30.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/31.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/32.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/33.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/34.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/35.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/36.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/37.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/38.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/39.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/40.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/41.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/42.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/43.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/44.jpg)
Mais Exemplos
![Page 45: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/45.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/46.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/47.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/48.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/49.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/50.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/51.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/52.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/53.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/54.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/55.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/56.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/57.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/58.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/59.jpg)
Câmera
![Page 60: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/60.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/61.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/62.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/63.jpg)
Etapas de Desenho
![Page 64: OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/64.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/65.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/66.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/67.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/68.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/69.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/70.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/71.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/72.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062502/570638601a28abb8238ffa2e/html5/thumbnails/73.jpg)
Etapas de desenho do OSG