IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenSceneGraph Discussion :

Transformer une géométrie en triangles


Sujet :

OpenSceneGraph

  1. #1
    Membre habitué Avatar de robinsondesbois
    Homme Profil pro
    Etudiant
    Inscrit en
    Avril 2012
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 171
    Points : 173
    Points
    173
    Par défaut Transformer une géométrie en triangles
    Bonjour,

    J'ai une géométrie mais je ne sais pas si j'ai des QUADS ou des STRIP, ect...
    Du coup je voudrais savoir s'il existe un visitor qui transforme tous en TRIANGLES.
    Je veux que des triangles parce qu'après j'utilise un intersector qui me retourne que 3 points par face.

  2. #2
    Membre éprouvé
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Points : 1 179
    Points
    1 179
    Par défaut
    Alors de deux choses l'une :

    D'une part, tu dois pouvoir utiliser les optimizer d'osg, qui sont des visitors qui "arrangent" le graph de scene selon certains criteres
    http://www.openscenegraph.org/docume...cs/a00461.html

    D'autre part, tu peux juste te contenter d'utiliser un triangle Functor http://www.openscenegraph.org/docume....html#_details qui va te permettre de parcourir tous les triangles, quelque soit la geometrie
    En gros, en OpenGl, tout les facettes sont des triangles. Les primitives sont des facilités mais tout reste triangle. Le triangle Functor te permet de les parcourir, qu'ils soit en fait des Quads, des triangles strip, etc... il va te permettre d'implémenter un visitor qui sera passé sur chaque facette. (PS : le dernier argument de la méthode, le bool, te permet de savoir si c'est un "vrai" triangle ou si c'est autre chose découpé en triangles.

    Amuse toi bien.

    PS : si tu nous donnait un peu plus de contexte, on pourrait te conseiller peut etre de meilleurs méthodes que juste répondre a ta question

    PS2 : tu peux récupérer le type de primitive et savoir s'il s'agit de triangles, quads, etc...
    "le langage C permet de tout faire, y compris se tirer dans le pied. Le langage C++ permet de tout faire, y compris se tirer dans le pied - et réutiliser la balle"

  3. #3
    Membre habitué Avatar de robinsondesbois
    Homme Profil pro
    Etudiant
    Inscrit en
    Avril 2012
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 171
    Points : 173
    Points
    173
    Par défaut
    Bonjour,

    J'ai essayé le tessellateVisitor mais rien ne se passe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    virtual void apply( osg::Geode& geode )
    {
    	_tessellator->apply(geode);
    	for ( unsigned int i=0; i<nbDrawable; ++i )
    	{
    		ref_ptr<Drawable> drawable = geode.getDrawable(i);
    		Geometry::PrimitiveSetList test = drawable->asGeometry()->getPrimitiveSetList();
    		static_cast<UserData*>(drawable->getUserData())->setArray(drawable->asGeometry()->getVertexArray(), drawable->asGeometry()->getColorArray(), test);
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void UserData::setArray(Array *vertexArray, Array *colorArray, Geometry::PrimitiveSetList organisationFace)
    {
    	_tabVertex = vertexArray;
    	int nbVertex = _tabVertex->getNumElements();
     
    	_organisationFace = organisationFace;
    	ref_ptr<PrimitiveSet> primitive = organisationFace.at(0);
     
    	int nbFace = primitive->getNumPrimitives();
    	int mode = primitive->getMode();
    	_Face = new Face[nbFace];
    }
    Je passe en paramètre un quad et après le visitor c'est toujours un quad et son mode est toujours un QUADS (7).


    Par contre je n'est pas compris comment fonctionne le foncteur que tu m'a conseillé.


    Robin

  4. #4
    Membre éprouvé
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Points : 1 179
    Points
    1 179
    Par défaut
    Citation Envoyé par robinsondesbois Voir le message
    Bonjour,

    J'ai essayé le tessellateVisitor mais rien ne se passe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    virtual void apply( osg::Geode& geode )
    {
    	_tessellator->apply(geode);
    	for ( unsigned int i=0; i<nbDrawable; ++i )
    	{
    		ref_ptr<Drawable> drawable = geode.getDrawable(i);
    		Geometry::PrimitiveSetList test = drawable->asGeometry()->getPrimitiveSetList();
    		static_cast<UserData*>(drawable->getUserData())->setArray(drawable->asGeometry()->getVertexArray(), drawable->asGeometry()->getColorArray(), test);
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void UserData::setArray(Array *vertexArray, Array *colorArray, Geometry::PrimitiveSetList organisationFace)
    {
    	_tabVertex = vertexArray;
    	int nbVertex = _tabVertex->getNumElements();
     
    	_organisationFace = organisationFace;
    	ref_ptr<PrimitiveSet> primitive = organisationFace.at(0);
     
    	int nbFace = primitive->getNumPrimitives();
    	int mode = primitive->getMode();
    	_Face = new Face[nbFace];
    }
    Je passe en paramètre un quad et après le visitor c'est toujours un quad et son mode est toujours un QUADS (7).
    Ca depend des parametre du tesselator dejà, et je ne sais plus s'il modifie le truc ou en fabrique un second... a part aller voir dans le code je peux pas t'aider plus que ça.


    Citation Envoyé par robinsondesbois Voir le message
    Par contre je n'est pas compris comment fonctionne le foncteur que tu m'a conseillé.
    Depuis le site d'OSG :
    Notice that TriangleFunctor is a class template, and that it inherits from its template parameter T. This template parameter must implement T::operator() (const osg::Vec3 v1, const osg::Vec3 v2, const osg::Vec3 v3, bool treatVertexDataAsTemporary), which will be called for every triangle when the functor is applied to a Drawable. Parameters v1, v2, and v3 are the triangle vertices. The fourth parameter, treatVertexDataAsTemporary, indicates whether these vertices are coming from a "real" vertex array, or from a temporary vertex array, created by the TriangleFunctor from some other geometry representation.
    Donc tu applique ton functor sur tes Drawable. Je l'ai dejà utilisé donc je sais que ça marche.
    Par contre si tu veux un exemple, regarde dans le code des exemples OSG il doit y en avoir un surement.

    T'as le code, t'as tout ce dont tu as besoin.
    Bon courage.
    "le langage C permet de tout faire, y compris se tirer dans le pied. Le langage C++ permet de tout faire, y compris se tirer dans le pied - et réutiliser la balle"

  5. #5
    Membre habitué Avatar de robinsondesbois
    Homme Profil pro
    Etudiant
    Inscrit en
    Avril 2012
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 171
    Points : 173
    Points
    173
    Par défaut
    A oui tiens, je n'avais pas vu le code d'exemple. Je vais regarder les 800 lignes de code o_O.

    Merci

  6. #6
    Membre habitué Avatar de robinsondesbois
    Homme Profil pro
    Etudiant
    Inscrit en
    Avril 2012
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 171
    Points : 173
    Points
    173
    Par défaut
    Je vais surment passer pour un gros débutant mais temps pis

    Après 4 heures de recherche je n'ai rien trouvé. J'ai compilé le code d'exemple qui marche mais dès que je veux l'utiliser et bin sa mer..

    Voici le code de création d'une géométrie avec un QUADS (7) que je veux transformer en TRIANGLES (4).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    //creation d'une geometry
    	ref_ptr<MatrixTransform> mat_objet4 = new MatrixTransform;
    	ref_ptr<Geode> gde_objet4 = new Geode;
    	tessellateDemoGeometry *geo_objet4 = new tessellateDemoGeometry;
     
    	gde_objet4->addDrawable(geo_objet4);
    	mat_objet4->addChild(gde_objet4);
    	grp_root->addChild(mat_objet4);
     
    	Vec3Array *vertex = new Vec3Array;
    	vertex->push_back(Vec3d(0, 0, 0));
    	vertex->push_back(Vec3d(1, 0, 0));
    	vertex->push_back(Vec3d(1, 1, 0));
    	vertex->push_back(Vec3d(0, 1, 0));
    	geo_objet4->setVertexArray(vertex);
    	DrawElementsUInt *quad = new DrawElementsUInt(PrimitiveSet::QUADS, 0);
    	quad->push_back(0);
    	quad->push_back(1);
    	quad->push_back(2);
    	quad->push_back(3);
    	geo_objet4->addPrimitiveSet(quad);
    	Vec4Array *couleur = new Vec4Array;
    	couleur->push_back(Vec4d(0, 0, 0, 1));
    	couleur->push_back(Vec4d(0, 0, 0, 1));
    	couleur->push_back(Vec4d(0, 0, 0, 1));
    	couleur->push_back(Vec4d(0, 0, 0, 1));
    	TemplateIndexArray<unsigned int, Array::UIntArrayType, 4, 4> *indexDeCouleur;
    	indexDeCouleur = new TemplateIndexArray<unsigned int, Array::UIntArrayType, 4, 4>;
    	indexDeCouleur->push_back(0);
    	indexDeCouleur->push_back(1);
    	indexDeCouleur->push_back(2);
    	indexDeCouleur->push_back(3);
    	geo_objet4->setColorArray(couleur);
    	geo_objet4->setColorIndices(indexDeCouleur);
    	geo_objet4->setColorBinding(Geometry::BIND_PER_VERTEX);
     
    	Geometry::PrimitiveSetList test = geo_objet4->getPrimitiveSetList();
     
    	osgUtil::Tessellator *tess = new osgUtil::Tessellator;
     
    	tess->setTessellationType(osgUtil::Tessellator::TESS_TYPE_GEOMETRY);
    	tess->setWindingType( osgUtil::Tessellator::TESS_WINDING_POSITIVE);
    	tess->retessellatePolygons(*geo_objet4);
            //MEME APRES LE TESSELLATOR C'EST DES QUADS
    	int mode = geo_objet4->getPrimitiveSet(0)->getMode();

    EDIT : je n'est pas trouvé le fichier d'exemple osg sur le trianglefonctor.
    Et je ne sais pas utiliser un fonctor.

    EDIT2 : MOUHAhahaha, finalement j'ai peut-être trouvé.

    Cordialement, Robin

  7. #7
    Membre éprouvé
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Points : 1 179
    Points
    1 179
    Par défaut
    Alors tu t'en sors ?

    Je peux essayer un bout de code ce soir mais pas là au boulot... mais d'ici là tu auras trouvé surement ^^
    "le langage C permet de tout faire, y compris se tirer dans le pied. Le langage C++ permet de tout faire, y compris se tirer dans le pied - et réutiliser la balle"

  8. #8
    Membre habitué Avatar de robinsondesbois
    Homme Profil pro
    Etudiant
    Inscrit en
    Avril 2012
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 171
    Points : 173
    Points
    173
    Par défaut
    Pas sur ^^ (très formateur mon stage )

    J'ai a peut près compris : Je fabrique une géométrie de type QUADS
    Puis je crèe le fonctor
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	TriangleFunctor<NormalPrint> tri;
    	tri.Init();
    	geo_objet4->accept(tri);
    Et enfin je fabrique une nouvelle géométrie dans le fonctor :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    struct NormalPrint
    {
    public:
    	ref_ptr<Geometry> geo;
    	Vec3Array *vertex;
    	Vec3Array *normal;
    	Vec4Array *color;
    	int nbPrimitive;
    	int nbVertex;
    	std::vector<DrawElementsUInt> *primitive;
    	TemplateIndexArray<unsigned int, Array::UIntArrayType, 4, 4> *indexDeCouleur;
     
     
    	void Init()
    	{
    		vertex = new Vec3Array;
    		normal = new Vec3Array;
    		color = new Vec4Array;
    		color->push_back(Vec4d(0, 0, 0, 1));
    		color->push_back(Vec4d(0, 0, 0, 1));
    		color->push_back(Vec4d(0, 0, 0, 1));
    		color->push_back(Vec4d(0, 0, 0, 1));
    		nbPrimitive = 0;
    		nbVertex = 0;
    		primitive = new std::vector<DrawElementsUInt>;
    		indexDeCouleur = new TemplateIndexArray<unsigned int, Array::UIntArrayType, 4, 4>;
    	}
     
    	void operator() (const osg::Vec3& v1,const osg::Vec3& v2,const osg::Vec3& v3, bool) const
    	{
    		Vec3 nor = (v2-v1)^(v3-v2);
    		nor.normalize();
    		std::cout << "\t("<<v1<<") ("<<v2<<") ("<<v3<<") "<<") normal ("<<normal<<")"<<std::endl;
    		vertex->push_back(v1);
    		vertex->push_back(v2);
    		vertex->push_back(v3);
    		nbVertex += 3;                             //non modifiable;
    		normal->push_back(nor);
    	}
     
    	void MakeGeo()
    	{
    		geo->setVertexArray(vertex);
    		geo->setNormalArray(normal);
    		geo->setColorArray(color);
    		geo->setColorIndices(indexDeCouleur);
    		geo->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::TRIANGLES,0,nbVertex));
    	}
    };
    Mais évidement ça ne marche pas

    Je ne peut pas incrémenter ma variable nbVertex
    EDIT : CA MARCHE !!!

    Voici le Visitor qui transforme les géométrie de tout type en géométrie de triangle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    #pragma once
     
    #include <osg/MatrixTransform>
    #include <osg/ShapeDrawable>
    #include <osg/Sequence>
    #include <osg/Material>
     
    #include <osgViewer/CompositeViewer>
    #include <osgViewer/ViewerEventHandlers>
     
    #include <osgGA/TrackballManipulator>
     
    #include <osgDB/ReadFile>
    #include <osgDB/WriteFile>
     
    #include <osgViewer/GraphicsWindow>
     
    using namespace osg;
     
     
    struct NormalPrint
    {
    public:
    	ref_ptr<Geometry> geo;
    	Vec3Array *vertex;
    	Vec3Array *normal;
    	Vec4Array *color;
    	int nbPrimitive;
    	int nbVertex;
    	std::vector<DrawElementsUInt> *primitive;
    	TemplateIndexArray<unsigned int, Array::UIntArrayType, 4, 4> *indexDeCouleur;
     
     
    	void Init()
    	{
    		geo = new Geometry;
    		vertex = new Vec3Array;
    		normal = new Vec3Array;
    		color = new Vec4Array;
    		color->push_back(Vec4d(0, 0, 0, 1));
    		color->push_back(Vec4d(0, 0, 0, 1));
    		color->push_back(Vec4d(0, 0, 0, 1));
    		color->push_back(Vec4d(0, 0, 0, 1));
    		nbPrimitive = 0;
    		nbVertex = 0;
    		primitive = new std::vector<DrawElementsUInt>;
    		indexDeCouleur = new TemplateIndexArray<unsigned int, Array::UIntArrayType, 4, 4>;
    	}
     
    	void operator() (const osg::Vec3& v1,const osg::Vec3& v2,const osg::Vec3& v3, bool) const
    	{
    		Vec3 nor = (v2-v1)^(v3-v2);
    		nor.normalize();
    		//std::cout << "\t("<<v1<<") ("<<v2<<") ("<<v3<<") "<<") normal ("<<nor<<")"<<std::endl;
    		vertex->push_back(v1);
    		vertex->push_back(v2);
    		vertex->push_back(v3);
    		normal->push_back(nor);
    	}
     
    	void MakeGeo()
    	{
    		geo->setVertexArray(vertex);
    		geo->setNormalArray(normal);
    		geo->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::TRIANGLES,0,vertex->size()));
    	}
    };
     
     
    class TriangleVisitor : public osg::NodeVisitor
    {
    public:
     
        TriangleVisitor():osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN) {
    		tri = new TriangleFunctor<NormalPrint>;
        }
        virtual void apply(osg::Geode& geode) 
    	{
    		int nbDrawable = geode.getNumDrawables();
            for ( unsigned int i=0; i<nbDrawable; ++i )
    		{
    			ref_ptr<Drawable> drawable = geode.getDrawable(i);
    			if (drawable->asGeometry())
    			{
    				tri->Init();
    				drawable->accept(*tri);
    				tri->MakeGeo();
    				geode.removeDrawable(drawable);
    				geode.addDrawable(tri->geo);
    			}
    		}
        }
     
    private:
    	TriangleFunctor<NormalPrint> *tri;
    };
    La différence entre le maitre et le padawan :
    Je peux essayer un bout de code ce soir mais pas là au boulot...
    En un soir

    mais d'ici là tu auras trouvé surement ^^
    En une semaine


    Merci beaucoup

  9. #9
    Membre éprouvé
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Points : 1 179
    Points
    1 179
    Par défaut
    Mais je t'en prie, ça fait plaisir ^^
    (J'avais grave la flemme de me faire le code ce soir )
    "le langage C permet de tout faire, y compris se tirer dans le pied. Le langage C++ permet de tout faire, y compris se tirer dans le pied - et réutiliser la balle"

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [java - SQL] transformer une Image en BLOB ?
    Par pierre.zelb dans le forum JDBC
    Réponses: 3
    Dernier message: 04/07/2005, 15h04
  2. [DEBUTANT] Transformer une variable Double en STring
    Par Battosaiii dans le forum Langage
    Réponses: 6
    Dernier message: 13/06/2005, 16h43
  3. [Débutant] Transformer une appli locale en servlet
    Par msquall dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 05/04/2005, 16h10
  4. Réponses: 2
    Dernier message: 14/01/2005, 15h40
  5. Transformer une ligne en polygone
    Par bl4d3 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 02/09/2003, 09h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo