Miguel Leitão, 2008 APIs para Gráfos de Cenas SGI Performer OpenSceneGraph OpenSG OpenInventor OpenRM SUN Java3D X3D, VRML 1
SceneGraph Gráfo definido pela associação entre pares de elementos. Estrutura genérica que permite descrever cenas. Representa a hierarquia da cena. Árvore de Objectos root group3 t0 t5 t6 group1 obj3 obj4 t1 t2 obj1 group3 group2 object nodes (geometry) transformation nodes t3 t4 group nodes obj2 group3 SceneGraph tricycle T T Seat Front Group Back wheels T Handle bars Left wheel Right wheel Front Wheel 2
SceneGraphs Datastructure: Directed Acyclic Graph (DAG) Usually a tree (only one parent per node) Represents object-based hierarchy of geometry Leaves contains geometry (triangles, etc.) Each node holds pointers to children Children can be Group Geometry Matrix transform Others SceneGraph: Exemplo Sala Mesa Sofá Cadeira 1 Cadeira 2 Cadeira 3 Armário Perna 1 Perna 2 Perna 3 Perna 4 Tampo Cadeira Perna 3
Bounding Volumes Os gráficos de cena podem manter uma definição de um volume envolvente em cada nó. Um volume envolvente oferece uma especificação simples do espaço onde se localizam todos os descendentes do nó. Os volumes envolventes podem ser: Esferas (Bounding Spheres) Caixas alinhadas com os eixos (Axis Aligned Bounding Boxes) SG + BV = Bounding Volume Hierarchy (BVH) Bonding Volumes circles=bvs scene graph root 4
OpenSceneGraph Uma iniciativa Open Source para criar uma API de Gráfo de Cena. Baseado no OpenGL/Performer A maioria das classes de nós são coincidentes. A migração Performer->OSG é fácil. OpenSceneGraph API C++ Desenvolvido sobre OpenGL Cross-platform Windowing system agnostic Open Source Implementa: Importação de Objectos Gestão de Gráfo de Cena Rendering optimizado www.openscenegraph.org 5
OSG Features All standard nodes: DCS, GeoSet, LOD etc. Culling: Viewfrustrum culling Tree traversals Support for Win32, Linux and Irix. Native fileformat.osg Loads among others.flt and.pfb files OSG Users Magic Earth - Geoprobe - Oil & Gas Boeing - Flight simulation Indra - Train simulation STN Atlas - Simulation NASA - Earth visualization Norcontrol - Maritime simulation Real World Entertainment - Gaming Terrex - LOD Paging POSTECH - 6
OSG: Functional Components OSGUtil Traversers Enhancements OSG Scene Graph Rendering Elements OSGDB Data Base Loading Plug-in Management Plug-Ins OSGText OSGSim Node Kits File Formats Supported 3D File Formats 3dc 3ds ac3 dw flt Freetype iv ive logo lwo md2 obj osg osg tgz tgz txp directx zip Image Formats: bmp dds pic png pnm qt rgb tga 7
Open Scene Graph - Support Mailing list Web site support On-line reference guides Examples Contributions OpenGL Performer Documentation Processing phases Update Cull Draw 8
Multi-buffered Data Protection Update Cull Draw Buff 0 Buff 1 Buff 2 Phase n Phase n-1 Phase n-2 osg::node osg::node Classe base de todos os nós (Nodes) do gráfico de cena. 9
Osg::Group osg::group Node que mantém uma lista de desceneentes. osg::transform osg::transform Um grupo que matém uma matriz de transformação 4x4. A transformação é herdada por todos os nós descendentes. 10
Geometry Nodes osg::geode Um nó que contém geometria. Corresponde sempre a uma folha da árvore de objectos (não tem filhos). Os objectos visíveis são definidos em Geodes Exemplo 1 Modelo Geométrico posicionado na cena root (osg::group) tankxform (osg::positionattitudetransform) tanknode (osg::node) 11
Exemplo 2 root (osg::group) tankonegroup (osg::group) tanktwopat (osg::positionattitudetransform) tankthreepat (osg::positionattitudetransform) tanktwogroup (osg::group) tankthreegroup (osg::group) Criar geometria // Create a vector to represent the "center of the cone" Vec3 vcen(xcen, ycen, zcen); // Create a cone geometry Cone* cone = new Cone(vcen, radius, height); // Create a drawable object based on the cone ShapeDrawable *obj = new ShapeDrawable(cone); obj>setcolor(vec4(color[0], color[1], color[2], color[3])); // Create a scene graph node for obj Geode* geode = new Geode(); geode->adddrawable(obj); 12
Combinar geometria MatrixTransform* arrow = new MatrixTransform; arrow->setmatrix(matrix::scale(1.0, 1.0, 1.0)); arrow->addchild(cone); arrow->addchild(cylinder); root->addchild(arrow); Robot0 SceneRoot // Creating the root node osg::group* SceneRoot = new osg::group; loadedmodel // Load arm model osg::node* loadedmodel = osgdb::readnodefile("cube.obj"); SceneRoot->addChild( loadedmodel ); 13
Robot1 // Creating the root node osg::group* SceneRoot = new osg::group; // Load arm model osg::node* loadedmodel = osgdb::readnodefile("cube.obj"); // bracoseg osg::matrixtransform* bracoseg = new osg::matrixtransform; mymatrix.makescale( 1., 1., 5. ); mymatrix.settrans( 0., 0., 5. ); bracoseg->setmatrix( mymatrix ); bracoseg->addchild( loadedmodel ); SceneRoot bracoseg loadedmodel SceneRoot->addChild( bracoseg ); Robot2 // Load arm model // bracoseg // braco0 osg::matrixtransform* braco0 = new osg::matrixtransform; braco0->setmatrix( osg::matrix::identity() ); braco0->addchild( bracoseg ); SceneRoot braco0 bracoseg SceneRoot->addChild( braco0 ); while(!viewer.done() ) { braco0->postmult( osg::matrix::rotate(0.0002, 0., 0., 1.) ); loadedmodel 14
Robot3 // braco0 // braco1 osg::matrixtransform* braco1 = new osg::matrixtransform; braco1->setmatrix( osg::matrix::identity() ); braco1->addchild( bracoseg ); SceneRoot braco0 pos = new osg::matrixtransform; pos->setmatrix( osg::matrix::translate(0., 0., 10.) ); pos->addchild( braco1 ); braco0->addchild( pos ); Pos1 braco1 while(!viewer.done() ) { braco1->postmult( osg::matrix::rotate(0.0005, 0., 1., 0.) ); bracoseg loadedmodel Robot4 // braco1 // braco2 osg::matrixtransform* braco2 = new osg::matrixtransform; braco2->setmatrix( osg::matrix::identity() ); braco2->addchild( bracoseg ); Pos1 SceneRoot braco0 pos = new osg::matrixtransform; pos->setmatrix( osg::matrix::translate(0., 0., 10.) ); pos->addchild( braco2 ); braco1->addchild( pos ); Pos2 braco1 while(!viewer.done() ) { braco2->postmult( osg::matrix::rotate(0.001, 1., 0., 0.) ); braco2 bracoseg loadedmodel 15