Courbes nurbs 3d dans openscenegraph

Description

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 / Exemple :


#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.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.