OMKVisuOpenSG

Un article de OpenMASKWiki.

Jump to: navigation, search
   -----------------  ATTENTION PLUGIN EN COURS DE MISE AU POINT  ---------------- 

Le service de visualisation basé OpenSG pour OpenMASK (OSGVisOSO) reprend l'architecture générique d'un service de rendu et l'adapte à un rendu visuel basé sur la bibliothèque OpenSG version 2.
De plus, ce service est basé sur une bibliothèque intermédiaire (CollavizOsgCluster) gérant un service de rendu visuel, distribué sur un cluster de serveurs OpenSG. Ce service vise à pouvoir projeter une scène virtuelle dans un équipement de type visio-cube, multi-écrans, multi-machines.

Sommaire

OpenSG

OpenSG est un système portable de gestion d'un graphe de scène ( http://www.opensg.org/ ).

Historique

OpenMASK V3 disposait aussi d'un service de rendu visuel basé OpenSG. Il s'appuyait sur la version 1.7 d'OpenSG. L'architecture de ce composant était différente de celle du présent composant OMK4 qui lui reprend l'architecture général d'un serice de rendu. Tout le code OpenSG était dans le composant OMK3 alors que maintenant il est encapsulé dans la bibliothèque CollavizOsgCluster.

Prérequis

Pour utiliser notre service de rendu visuel OpenSG pour OpenMASK, vous devez donc au préallable installer et valider OpenSG sur vos machines. En particulier, il faut en premier se familiariser avec le déploiement de plusieurs serveurs OpenSG sur vos machines.

Bibliothèque CollavizOsgCluster

La bibliothèque CollavizOsgCluster offre une interface simplifiée avec OpenSG 2 pour la gestion d'un cluster de rendu.
Initialement développée pour interfacer OpenSG avec le système d'interaction collaborative Collaviz, nous l'avons réutilisée pour interfacer OpenMASK avec OpenSG.
Plus généralement, la bibliothèque CollavizOsgCluster est une contribution à OpenSG, réutilisable par toute personne cherchant un outil simple de gestion d'un cluster de rendu distribué sur plusieurs machines gérant plusieurs écrans éventuellement composés de pavés juxtaposés et partiellement superposés.

Fonctionnalités

Son API permet de :

  • construire un SceneManager,
  • définir le système de projection composé de plusieurs écrans. Chaque écran peut lui même être composé de plusieurs pavés associés à différents serveurs de rendu OpenSG,
  • définir et de placer une caméra dans la scène,
  • placer la position de la tête de l'utilisateur par rapport à la caméra. Cela permet de déformer la pyramide de vue.
  • introduire des lumières dans la scène
  • gérer le graphe de scène sous forme d'un râteau dont chaque dent représente un objet de l'univers

Architecture

La bibliothèque permet de construire un gestionnaire de la scène OpenSG (SceneManager) qui est le client de un ou plusieurs serveurs de rendu OpenSG. Le système de projection associé à ce SceneManager peut être composé de plusieurs écrans, eux même divisés en plusieurs pavés. OpenMASK est en relation avec le client uniquement pour définir le système de projection et mettre à jour la scène OpenSG.

Système client/serveurs

Le client OpenSG est encapsulé dans un objet de simulation OpenMASK via la bibliothèque CollavizOsgCluster.
Les serveurs OpenSG sont des exécutables génériques s'exécutant dans d'autres processus localisés éventuellement sur d'autres machines. On peut très bien utiliser l'exécutable appClusterServerGLUT.exe fournit dans les exemples d'OpenSG 2. Les paramètres d'un serveur sont :

  • son nom qui sera mis en relation avec ceux de la liste fournie dans le client.
  • affichage plein écran ou non
  • affichage stéréovision ou non

Système de projection

Le système de projection est composé d'un unique point de projection de référence (que nous appellerons camera) qui projette vers plusieurs plans de projections (que nous appellerons écrans). La position et la taille de chaque écran est définit par les coordonnées de ses quatre coins dans le repère Yup ayant la camera pour origine. Chaque écran peut être divisé en N pavés. N est définit comme étant p lignes de k colonnes. Les pavés peuvent avoir un recouvrement identique pour tous, en X comme en Y. Un pavé est identifié par le nom du serveur OpenSG associé. L'ensemble des noms est fournit par une liste dans l'ordre des colonnes puis des lignes.
Il faut également fournir au client la liste des noms des machines hébergeant les serveurs OpenSG. La bibliothèque se charge de trouver et d'associer les bons serveurs aux bons pavés.
Dans ce système de projection, l'utilisateur n'est pas obligé de rester au point de référence de la caméra. Il peut bouger autour de ce point et entre les écrans. Dans ce cas, les pyramides de vue pour chaque écran sont déformées à partir de la position de la tête de l'utilisateur. Il faut donc définir, à chaque itération de rendu, la position de la tête de l'utilisateur dans le repère de la caméra.
Il y a deux deux niveaux de navigation avec ce système :

  • le déplacement de la caméra dans la scène virtuelle
  • le déplacement de l'utilisateur dans le système de projection.

Scène OpenSG

La scene OpenSG ne dispose que d'une caméra dont on contrôle la position dans l'univers. Si le point de vue de l'utilisateur ne coïncide pas avec celui de la camera, il faut fournir, en permanence, la position de la tête de l'utilisateur dans le repère de la caméra.
On peut placer différents types de lumières dans la scène : directionnelle, spot, etc... Chaque type de lumière a ses propres paramètres qui peuvent être initialisés puis mis à jour en cours de session. Une lumière est identifiée par un identificateur rendu par le SceneManager à sa création. Toute la scène peut être éclairée par les lumières.
On peut placer des objets géométriques dans la scène. Chaque objet est identifié par un identificateur rendu par le SceneManager à sa création. Ses paramètres peuvent être initialisés puis mis à jour en cours de session. Graphe de scène

API

La page suivante précise ApiCollavizOsgCluster l'API de la bibliothèque et fournit une première documentation.

Service de visualisation OpenSG pour OpenMASK

Comme tout service de rendu OpenMASK, le service de visualisation OpenSG s'articule autour d'un objet de simulation extensible (OSGVisOSO) qui initialise le service via les paramètres fournis dans le fichier de configuration. Ensuite il délègue à des objets de service (OSGVO) la construction et l'initialisation du graphe de scène spécifique à l'application. Ces objets visuels délèguent eux même la mise à jour fine du graphe à des animateurs (OMKOSGAnimatorT).
Le plugin associé s'appelle OpenSGVis avec les identifications de trace "Vis:OSG" "Vis:OSG:Stack" .

L'OSO de service de rendu OpenSG : OSGVisOSO

Son identifiant de classe OSO est :

Class OSGVisOSO

Système de projection

La description se fait dans le fichier de configuration dans la partie UserParams du visualiseur.
On commence par décrire chaque écran dans une liste :

DisplayScreenList  // mot clé obligatoire
{
  floor  // nom de l'ecran
  {
    Width 10
    Height 2
    Columns 2
    Rows 1
    OverlapX 0
    OverlapY 0
    CornerUpLeft   [ [-4.8 0.0 -2.88] ] 
    CornerUpRight  [ [4.8 0.0 -2.88] ] 
    CornerLowLeft  [ [-4.8 0.0 0.0] ] 
    CornerLowRight [ [4.8 0.0 0.0] ] 
    ServerTileNameList [ "paveGauche" "paveDroit" ]
  } //end DisplayScreen floor
} //end DisplayScreenList

Puis on fournit la liste des noms réseau des machines hébergeant les serveurs de rendu.

ServerHostsList [ "localhost" ]

Graphe de scène

A ce stade, on ne définit que le décor, les initialisations de la caméra et de la tete.

SceneFile "Data-osg/grille.wrl" // decor
WorldCamInitPos  [ [0 0 10] ]  // Position initiale de la camera dans le monde virtuel
UserToCamInitPos  [ [0 1.5 0] ]  // Position initiale de la tete de l'utilisateur par rapport au point de projection de reference

Les objets de service

Chaque objet visuel va venir ajouter un noeud au graphe de scène. Il sera connu par un identifiant du SceneManager. A l'exception de l'objet visuel "camera" qui n'est là que pour pouvoir manipuler la caméra via un animateur.

Caméra

Son identifiant de classe est :

Class OSGVOcameraObject

Il n'a pas de paramètre et doit être unique. Par contre il pourra intégrer deux animateurs, l'un pour contrôler la position de la caméra, l'autre celle de la tête de l'utilisateur.

Lumières

Il peut y avoir plusieurs types de lumières. Toutes héritent de la classe OSGVOlightObject dont elles doivent obligatoirement redéfinir la méthode createLight().
Elles vont partager les paramètres suivants :

Color [ [0.0 1.0 0.0 ] ]  // couleur RGB de la lumière
Activity "true" // allumée ou éteinte

Lumière directionnelle

Son identifiant de classe est :

Class OSGVOdirectionalLightObject

Son paramètre spécifique est :

Direction [ [0.0 1.0 1.0 ] ]  // vecteur xyz = de l'origine vers le point fourni

Ce type de lumière arrive de l'infini avec la direction donnée.<b<> cet objet supporte un animateur contrôlant la direction de la lumiere.

Spot

Son identifiant de classe est :

Class OSGVOspotLightObject

Ses paramètres spécifiques sont :

 Direction [ [0.0 1.0 1.0 ] ]   // direction du spot
SpreadAngle  0.78526  // angle du cone du spot en radian : PI/4 par défaut
Concentration  0.0 // coefficient de concentration du spot ;  0: faible ; 1: fort  ; par défaut : faible

Objets géométriques

Son identifiant de classe est :

Class OSGVOgeoObject

Les objets géométriques sont définis par un nom de fichier compatible avec OpenSG.

GeometryFile "cycab.wrl"  // par défaut = cube

Quatre mots prédéfinis engendrent des formes de base ou un noeud de groupe :

    • "cube" : cube de 2 unités de coté, centré sur l'origine
    • "sphere" : sphere de rayon 1, centré sur l'origine
    • "cylinder" : cylindre de rayon 1 et de 1 de hauteur, centré sur l'origine
    • "none" : cree simplement un noeud de groupe

Si vos fichiers géométriques n'ont pas, inclus via les fichiers .mtl, des informations de couleur de matériaux, il est possible de les préciser.

DiffuseColor [ [0.0 0.0 1.0] ]  
AmbientColor [ [1.0 1.0 0.0] ]  
EmissiveColor [ [1.0 0.0 .0] ]  
SpecularColor [ [0.0 1.0 1.0] ]  
Shininess 0.5 
Transparency  0.5  

Les animateurs

Déplacement de caméra

Son identifiant de classe est :

Class OSGcameraAnimator

Son paramètre spécifique est :

ConnectTo ["artWorkspace" "transform"]

Coordonnées dans le repère de l'univers

Déplacement de tête

Son identifiant de classe est :

Class OSGuserToCamAnimator

Son paramètre spécifique est :

ConnectTo ["VRPNDTrack" "Tete"]

Coordonnées dans le repère de projection

Déplacement d'un objet géométrique

Son identifiant de classe est :

Class OSGTransformAnimator

Son paramètre spécifique est :

ConnectTo ["movingPoint1" "Position"] 

Coordonnées dans le repère de l'univers

Déplacement d'une lumière

Son identifiant de classe est :

Class OSGlightPositionAnimator

Son paramètre spécifique est :

ConnectTo ["movingPoint1" "Position"] 

Coordonnées dans le repère de l'univers

Switch On/Off d'une lumière

Son identifiant de classe est :

Class OSGlightSwitchAnimator

Son paramètre spécifique est :

ListenedEvent OnOff-Light1

Cet animateur bascule le bouton marche-arret. Il commence dans l'état "ouvert". Il fonctionne plutôt à l'écoute d'un événement non typé que vous définissez dans le fichier de configuration.
C'est l'OSO qui l'intercepte et le transmet à cet animateur via un plug de type Event.

Plugin OpenSGVis

Fiche d'identification

  • localisation dans la forge : [ openmask4 ] / OMKOpenSGVis-Plugin
  • nom de la bibliothèque : OpenSGVis
  • nom du namespace : OMKSG
  • noms des identificateurs de trace : "Vis:OSG" "Vis:OSG:Stack"

Installation

La version en cours intègre la bibliothèque CollavizOsgCluster dans le code source du plugin et s'installe donc en même temps que le plugin.
Mettre à jour la variable OpenSGVis_HOME

Exemples

  • C1-justVisuOsg-sans-mpi-viewer
Navigation