APIs para Gráfos de Cenas - ipp.ptave.dee.isep.ipp.pt/~jml/INTMU/acetatos/OSG.pdf ·...

15
1 Miguel Leitão, 2008 APIs para Gráfos de Cenas SGI Performer OpenSceneGraph OpenSG OpenInventor OpenRM SUN Java3D X3D, VRML

Transcript of APIs para Gráfos de Cenas - ipp.ptave.dee.isep.ipp.pt/~jml/INTMU/acetatos/OSG.pdf ·...

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