OpenSceneGraph Paulo Ivson [email protected].
-
Upload
marcia-macedo-araujo -
Category
Documents
-
view
226 -
download
2
Transcript of OpenSceneGraph Paulo Ivson [email protected].
OpenSceneGraph
Paulo [email protected]
Exemplos
Exemplo: arquivo de modeloint main( int argc, char** argv ){
osgViewer::Viewer viewer;viewer.setSceneData( osgDB::readNodeFile("cessna.osg") );return viewer.run();
}
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();
}
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);
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);
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);
Arquitetura
ArquiteturaSua aplicação
Classes principais da
biblioteca
Carregamento de arquivos
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: .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
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
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
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
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
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
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()
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
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
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
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
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
Componentes do OSG Core
O NodeKit osgText oferece suporte completo ao desenho fontes TrueType em 2D e 3D
OSG NodeKitsosgFX
osgManipulator
osgParticleosgSimosgText
osgTerrainosgShadow
Componentes do OSG Core
O NodeKit osgTerrain oferece suporte para a renderização de dados de altimetria
OSG NodeKitsosgFX
osgManipulator
osgParticleosgSimosgText
osgTerrainosgShadow
Componentes do OSG Core
O NodeKit osgShadow oferece suporte para a diversas técnicas de renderização de sombras
OSG NodeKitsosgFX
osgManipulator
osgParticleosgSimosgText
osgTerrainosgShadow
Arquitetura (Fim)
Sua aplicação
Tipos de Nós
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
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
Principais Nós do OSGosg::Node
osg::Group osg::Geode
osg::Billboardosg::Transform
osg::MatrixTransform osg::PositionAttitudeTransform
osg::AutoTransform
osg::Switchosg::LOD
Montando um grafo
apartamento
quarto sala
cama camamesa de
jantarchão parede
chãoparede
varanda
planta
cadeira
cadeiratampo
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)
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)
Hierarquia de Movimentos/Transformações
Base Braço 1 Braço 2 Braço 3Dedo
Dedo
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
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)
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
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
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
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
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
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();
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 ) );
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 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 );
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)
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 );
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
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
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
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
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
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=
A-Buffer contém uma lista de superfícies que compõem um
determinado pixel
α = 50% cor=
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
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
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