OpenSceneGraph Paulo Ivson psantos@tecgraf.puc-rio.br.

Post on 07-Apr-2016

224 Views

Category:

Documents

2 Downloads

Preview:

Click to see full reader

Transcript

OpenSceneGraph

Paulo Ivsonpsantos@tecgraf.puc-rio.br

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

top related