1
Miguel Leitão, 2008
APIs para Gráfos de Cenas
SGI Performer
OpenSceneGraph
OpenSG
OpenInventor
OpenRM
SUN Java3D
X3D, VRML
2
SceneGraph
object nodes (geometry)
transformation nodes
group nodes
group3
obj3 obj4
t5 t6
t4
root
t0
group1
t1 t2
obj1 group3
t3
group2
group3 obj2
• 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
SceneGraph
tricycle
Back wheels
Front Group
Left wheel
Right wheel
T T Seat
Handle bars
Front Wheel
T
3
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
CadeiraTampoPerna 4Perna 3Perna 2Perna 1
Perna
Cadeira 2 Cadeira 3SofáMesa ArmárioCadeira 1
4
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
5
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
6
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 - …
7
OSG
Scene Graph
Rendering Elements OSGDB
Data Base Loading
Plug-in Management
OSGUtil
Traversers
Enhancements
OSGText OSGSim Node Kits…
Plug-Ins
OSG: Functional Components
File Formats Supported
bmp dds pic png
pnm qt rgb tga
3D File Formats
Image Formats:
3dc 3ds ac3 dw flt Freetype
iv ive logo lwo md2 obj
osg osg tgz tgz txp directX zip
8
Open Scene Graph - Support
Mailing list
Web site support
On-line reference guides
Examples
Contributions
OpenGL Performer Documentation
Processing phases
Update Cull Draw
9
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.
10
osg::Group Node que mantém uma lista de desceneentes.
Osg::Group
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.
11
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)
tankNode
(osg::Node)
tankXform
(osg::PositionAttitudeTransform)
12
Exemplo 2
root
(osg::Group)
tankTwoGroup
(osg::Group)
tankTwoPAT
(osg::PositionAttitudeTransform)
tankOneGroup
(osg::Group)
tankThreeGroup
(osg::Group)
tankThreePAT
(osg::PositionAttitudeTransform)
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);
13
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
// Creating the root node
osg::Group* SceneRoot = new osg::Group;
// Load arm model
osg::Node* loadedModel = osgDB::readNodeFile("cube.obj");
SceneRoot->addChild( loadedModel );
SceneRoot
loadedModel
14
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->addChild( bracoSeg );
SceneRoot
bracoSeg
loadedModel
Robot2
// Load arm model
…
// bracoSeg
…
// braco0
osg::MatrixTransform* braco0 = new osg::MatrixTransform;
braco0->setMatrix( osg::Matrix::identity() );
braco0->addChild( bracoSeg );
SceneRoot->addChild( braco0 );
while( !viewer.done() )
{
…
braco0->postMult( osg::Matrix::rotate(0.0002, 0., 0., 1.) );
SceneRoot
bracoSeg
loadedModel
braco0
15
Robot3
// braco0
…
// braco1
osg::MatrixTransform* braco1 = new osg::MatrixTransform;
braco1->setMatrix( osg::Matrix::identity() );
braco1->addChild( bracoSeg );
pos = new osg::MatrixTransform;
pos->setMatrix( osg::Matrix::translate(0., 0., 10.) );
pos->addChild( braco1 );
braco0->addChild( pos );
while( !viewer.done() )
{
…
braco1->postMult( osg::Matrix::rotate(0.0005, 0., 1., 0.) );
SceneRoot
bracoSeg
loadedModel
braco0
Pos1
braco1
Robot4
// braco1
…
// braco2
osg::MatrixTransform* braco2 = new osg::MatrixTransform;
braco2->setMatrix( osg::Matrix::identity() );
braco2->addChild( bracoSeg );
pos = new osg::MatrixTransform;
pos->setMatrix( osg::Matrix::translate(0., 0., 10.) );
pos->addChild( braco2 );
braco1->addChild( pos );
while( !viewer.done() )
{
…
braco2->postMult( osg::Matrix::rotate(0.001, 1., 0., 0.) );
SceneRoot
bracoSeg
loadedModel
braco0
Pos1
braco1
Pos2
braco2
Top Related