begin process at 2012 05 27 15:03:02
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > COURBES NURBS 3D DANS OPENSCENEGRAPH

COURBES NURBS 3D DANS OPENSCENEGRAPH


 Information sur la source

Note :
Aucune note
Catégorie :Maths & Algorithmes Classé sous :nurbs, openscenegraph, courbe, frenet, caméra Niveau :Initié Date de création :27/12/2010 Date de mise à jour :28/12/2010 12:06:49 Vu / téléchargé :3 740 / 133

Auteur : ordiman85

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (0)
Ajouter un commentaire et/ou une note


 Description

Cliquez pour voir la capture en taille normale
Ce programme affiche une courbe NURBS et les anneaux de sa surface tubulaire associée en 3D. Selon le manipulateur de caméra (voir main.cpp), vous pouvez bouger la caméra avec la souris, ou bien vous balader le long la courbe avec les touches haut et bas.

OpenSceneGraph est un moteur 3D temps réel libre utilisant OpenGL.

Les NURBS sont des courbes paramétrées avec points de contrôle, vecteur de noeuds et poids pour chaque point. Il est alors facile d'éditer des formes complexes en 3D à la main ou à la souris grâce à ces courbes.
Les algorithmes de la courbe NURBS viennent principalement du livre "The NURBS book". Les numéros de page sont indiqués.

Cette source montre également un exemple simple de manipulateur de caméra en dérivant osgGA::MatrixManipulator.

Source

  • #include "NURBSCurve.hpp"
  • #include "CurveGeodeFactory.hpp"
  • #include "TubeGeodeFactory.hpp"
  • #include "CurveCameraManipulator.hpp"
  • #include <iostream>
  • #include <osg/Node>
  • #include <osg/Group>
  • #include <osg/Geode>
  • #include <osg/Geometry>
  • #include <osgViewer/Viewer>
  • #include <osgGA/TrackballManipulator>
  • int main()
  • {
  • NURBSCurve3 curve;
  • TubeSurface3 tube;
  • std::vector<osg::Vec3> points;
  • CurveGeodeFactory curveGeodeFactory;
  • TubeGeodeFactory tubeGeodeFactory;
  • osg::Group * rootNode;
  • osg::Geode * curveGeode;
  • osg::Geode * tubeGeode;
  • osgViewer::Viewer viewer;
  • // On ajoute des points à la courbe NURBS.
  • points.push_back( osg::Vec3( 10., 0., 0. ) );
  • points.push_back( osg::Vec3( 20., 0., 0. ) );
  • points.push_back( osg::Vec3( 33., 53., 0. ) );
  • points.push_back( osg::Vec3( 0., 40., 0. ) );
  • points.push_back( osg::Vec3( 0., 50., 50. ) );
  • points.push_back( osg::Vec3( 50., 106., 56. ) );
  • points.push_back( osg::Vec3( 0., 157., 107. ) );
  • points.push_back( osg::Vec3( -58., 58., 58. ) );
  • points.push_back( osg::Vec3( 0., 19., 0. ) );
  • curve.setPoints( points );
  • // On fabrique mathématiquement un tube à partir de la courbe.
  • tube.setCurve( curve );
  • tube.setRadius( 3. );
  • // On fabrique une courbe à afficher en 3D.
  • curveGeodeFactory.setCurve( curve );
  • curveGeodeFactory.setFrames( true );
  • curveGeodeFactory.setDeltaT( 1e-2 );
  • curveGeode = curveGeodeFactory.createGeode();
  • // On fabrique un tube à partir de la courbe.
  • tubeGeodeFactory.setSurface( tube );
  • tubeGeodeFactory.setCurveDeltaT( 5e-3 );
  • tubeGeodeFactory.setRingSubdivision( 16 );
  • tubeGeode = tubeGeodeFactory.createGeode();
  • // On regroupe tout
  • rootNode = new osg::Group();
  • rootNode->addChild( curveGeode );
  • rootNode->addChild( tubeGeode );
  • viewer.setSceneData( rootNode );
  • // Décommenter pour contrôler la caméra avec la souris.
  • viewer.setCameraManipulator( new osgGA::TrackballManipulator() );
  • // Décommenter pour que la caméra suive la courbe.
  • //viewer.setCameraManipulator( new CurveCameraManipulator( curve ) );
  • viewer.realize();
  • while ( !viewer.done() )
  • {
  • viewer.frame();
  • }
  • return 0;
  • }
#include "NURBSCurve.hpp"
#include "CurveGeodeFactory.hpp"
#include "TubeGeodeFactory.hpp"
#include "CurveCameraManipulator.hpp"
#include <iostream>
#include <osg/Node>
#include <osg/Group>
#include <osg/Geode>
#include <osg/Geometry>
#include <osgViewer/Viewer>
#include <osgGA/TrackballManipulator>

int main()
{
	NURBSCurve3 curve;
	TubeSurface3 tube;
	std::vector<osg::Vec3> points;
	CurveGeodeFactory curveGeodeFactory;
	TubeGeodeFactory tubeGeodeFactory;
	osg::Group * rootNode;
	osg::Geode * curveGeode;
	osg::Geode * tubeGeode;
	osgViewer::Viewer viewer;

	// On ajoute des points à la courbe NURBS.
	points.push_back( osg::Vec3( 10., 0., 0. ) );
	points.push_back( osg::Vec3( 20., 0., 0. ) );
	points.push_back( osg::Vec3( 33., 53., 0. ) );
	points.push_back( osg::Vec3( 0., 40., 0. ) );
	points.push_back( osg::Vec3( 0., 50., 50. ) );
	points.push_back( osg::Vec3( 50., 106., 56. ) );
	points.push_back( osg::Vec3( 0., 157., 107. ) );
	points.push_back( osg::Vec3( -58., 58., 58. ) );
	points.push_back( osg::Vec3( 0., 19., 0. ) );
	curve.setPoints( points );

	// On fabrique mathématiquement un tube à partir de la courbe.
	tube.setCurve( curve );
	tube.setRadius( 3. );

	// On fabrique une courbe à afficher en 3D.
	curveGeodeFactory.setCurve( curve );
	curveGeodeFactory.setFrames( true );
	curveGeodeFactory.setDeltaT( 1e-2 );
	curveGeode = curveGeodeFactory.createGeode();

	// On fabrique un tube à partir de la courbe.
	tubeGeodeFactory.setSurface( tube );
	tubeGeodeFactory.setCurveDeltaT( 5e-3 );
	tubeGeodeFactory.setRingSubdivision( 16 );
	tubeGeode = tubeGeodeFactory.createGeode();

	// On regroupe tout
	rootNode = new osg::Group();
	rootNode->addChild( curveGeode );
	rootNode->addChild( tubeGeode );
	viewer.setSceneData( rootNode );

	// Décommenter pour contrôler la caméra avec la souris.
	viewer.setCameraManipulator( new osgGA::TrackballManipulator() );

	// Décommenter pour que la caméra suive la courbe.
	//viewer.setCameraManipulator( new CurveCameraManipulator( curve ) );

	viewer.realize();

	while ( !viewer.done() )
	{
		viewer.frame();
	}
	return 0;
}

 Conclusion

J'ai trouvé personnellement que la documentation sur OpenSceneGraph est encore rare, alors j'espère que ça en aidera certains ;)

Les bibliothèques à inclure sont : osg, osgGA, osgViewer (paquet "libopenscenegraph-dev" sous Ubuntu).

"Curve.project" est un fichier de projet CodeLite.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

28 décembre 2010 12:06:49 :
Corrections (dont getLength) et ajout de TubeSurface

 Sources du même auteur

Source avec Zip BIBLIOTHEQUE FONCTIONNELLE : OPÉRATIONS, COMPOSITION D'OBJET...
Source avec Zip LIBRAIRIE JSON C++
Source avec Zip Source avec une capture [WIN32] EASY WAVE MIXER
Source avec Zip Source avec une capture [C++] HASH FINDER - CALCULATEUR DE HASH
Source avec Zip Source avec une capture CONTROLEUR DE VOLUME SONORE EN C [ API WINDOWS ]

 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture AFFICHER DES COURBES DE BEZIER par shorzy
Source avec Zip Source avec une capture COURBE DE BÉZIER par macsou01
Source avec Zip Source avec une capture REPRESENTATION GRAPHIQUE DE DONNEES par wildhawk
Source avec Zip Source avec une capture CLASSE CGRAPHXY par bobbyantho
Source avec Zip Source avec une capture GRAPHEUR 2D par BCedric

Commentaires et avis

Aucun commentaire pour le moment.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

mouvement saccadé [ par pornik ] hum voila mon problème :imaginons ke a chake pression de la flèche avant, j'avance de 0.1 unité la caméra. je m'apercoit alors que c'est fluide mais b Problème avec le copier coller [ par Unknown ] J'ai un projet où j'utilise un composant image. Il me permet l'affichage d'une courbe a partir d'un oscilloscope numérique. Mon problème est que je do faire une courbe toute conne [ par Axool ] pouvez-vous m'aider svp: j'aimerais savoir faire une courbe toute conne, vraiment le + simple possible...mercips: si au passage vous savez comment cré desiner une courbe a partir des valeurs d'un tableau [ par aymentri ] je veut afficher un graphe en utilisant des valeurs stokées dans un tableau Sismographe [ par nahs ] Bonjours,Je cherche un moyen de tracer une courbe de la meme fason qu'un sismographe c'est à dire: sur une fenetre on verrai la feuille qui bouge de d courbe C++ [ par tguinel ] salut,je veut afficher un graphe en utilisant des valeurs stokées dans une base données(en C++, visualC++ 6.0).merci de m'aider. Utilisation de TWAIN pour caméra [ par medlah ] Bonjour les amis,J'ai une carte d'acquisition PCTV et je cherche un programme qui permet de commander une caméra pour l'acquisition de portrait en uti gluLookAt() [ par fabienGL ] bonjour, cette fonction sert pour les débutants à modifier la matrice MODELVIEW de façon à effectuer les prochaines transformations du repère Objet ve Rafraichissement [ par gus2647 ] Bonjour,J utilise VC++ 6 et les MFC. lorsque je trace une courbe, elle s affiche correctement, mais lorsque je cree par dessus par exemple une CListCt Comment faire un Defilemant de courbe en API [ par nahs ] Bonjours,J'aurai voulu saloire comment faire un effet defilent en API; les instructions qui permet de faire cela.Merci


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,702 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales