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 :

[OSG] supprimer les couleurs de base


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 [OSG] supprimer les couleurs de base
    Bonjour,

    J'ai un modèle 3ds qui viens de 3dsmax et il a des couleur de base. Je voulais donc savoir comment on peut supprimer ses couleurs sans avoir à recréer une géométrie à partir des tableaux de vertex et des indice de face ?

    Merci d'avance, Robin

  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
    Bonjour,

    Tu peux soit parcourir les données et modifier les couleurs dans le/les colorArray des drawable/geometry, soit appliquer un material tout simplement (utilisation des StateSet )
    "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
    Alors justement, parcourir les geometry ne marche pas avec les modèls de 3dsmax.

    cette fonction est appliqué à toutes les geometry. Elle a la propriété de mettre toutes les couleur à gris rose si mode chaleur activé.
    Ca marche pour les modèls de Blender.

    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
    void UserData::setArray(Array *vertexArray, Array *colorArray, Geometry::PrimitiveSetList organisationFace)
    {
    	_tabVertex = vertexArray;
     
    	_organisationFace = organisationFace;
     
    	Vec4Array *couleur1 = new Vec4Array;
    	Vec4Array *couleur2 = new Vec4Array;
    	for (int i=0; i< _tabVertex->getNumElements(); i++)
    	{
    		if (i % 2 == 0)
    		{
    			couleur1->push_back(Vec4d(0.5, 0.5, 0.5, 1));
    			couleur2->push_back(Vec4d(0.5, 0.5, 0.5, 1));
    		}
    		else
    		{
    			couleur1->push_back(Vec4d(0.5, 0.5, 0.5, 1));
    			couleur2->push_back(Vec4d(1, 0.5, 0.5, 1));
    		}
    	}
    	_tabColorBase = couleur1;
    	_tabColorChaleur = couleur2;
    }
    Avec Blender :

    Nom : 377336.png
Affichages : 67
Taille : 49,9 Ko

    Avec 3dsmax :

    Nom : 377337.png
Affichages : 62
Taille : 33,2 Ko

    On remarque que le mode chaleur est activé puisque la camion (oui c'est un camion) est en gris et en rose.

  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
    Alors justement, parcourir les geometry ne marche pas avec les modèls de 3dsmax.

    cette fonction est appliqué à toutes les geometry. Elle a la propriété de mettre toutes les couleur à gris rose si mode chaleur activé.
    Ca marche pour les modèls de Blender.

    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
    void UserData::setArray(Array *vertexArray, Array *colorArray, Geometry::PrimitiveSetList organisationFace)
    {
    	_tabVertex = vertexArray;
     
    	_organisationFace = organisationFace;
     
    	Vec4Array *couleur1 = new Vec4Array;
    	Vec4Array *couleur2 = new Vec4Array;
    	for (int i=0; i< _tabVertex->getNumElements(); i++)
    	{
    		if (i % 2 == 0)
    		{
    			couleur1->push_back(Vec4d(0.5, 0.5, 0.5, 1));
    			couleur2->push_back(Vec4d(0.5, 0.5, 0.5, 1));
    		}
    		else
    		{
    			couleur1->push_back(Vec4d(0.5, 0.5, 0.5, 1));
    			couleur2->push_back(Vec4d(1, 0.5, 0.5, 1));
    		}
    	}
    	_tabColorBase = couleur1;
    	_tabColorChaleur = couleur2;
    }
    Si ce code marche une fois sur deux c'est qu'il est pas assez blindé encore.
    Sert toi d'un débogueur ou d'un éditeur de texte sur les fichiers .osg pour voir comment les couleurs sont mises dans les données, et tu verra surement pourquoi ça ne marche pas sur les modeles de 3ds.

    Sinon donne aussi le code qui utilise cette méthode...
    "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
    Alors ce code est appellé par un visitor :

    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
     
                    int nbDrawable = geode.getNumDrawables();
    		for ( unsigned int i=0; i<nbDrawable; ++i )
    		{
    			ref_ptr<Drawable> drawable = geode.getDrawable(i);
    			drawable->setUserData(new UserData(true, true));
    			if (drawable->asGeometry())
    			{
    				Geometry::PrimitiveSetList test = drawable->asGeometry()->getPrimitiveSetList();
    				static_cast<UserData*>(drawable->getUserData())->setArray(drawable->asGeometry()->getVertexArray(), drawable->asGeometry()->getColorArray(), test);
    				drawable->asGeometry()->setColorArray(static_cast<UserData*>(drawable->getUserData())->_tabColorBase);
    				drawable->asGeometry()->setColorBinding(osg::Geometry::BIND_PER_VERTEX);
     
    				std::cout << spaces() << static_cast<UserData*>(drawable->getUserData())->getId() << "::"  
    				  << drawable->className() << std::endl;
     
    			}
                   }
    Il faut savoir que j'importe des fichiers 3ds.

  6. #6
    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
    Ok a vue de nez ça devrait marcher en effet, essaye peut etre de rajouter un datavariance a dynamique

    http://www.openscenegraph.org/docume...c456de6fc49e0b :

    void osg::Object::setDataVariance ( DataVariance dv ) [inline]
    Set the data variance of this object.

    Can be set to either STATIC for values that do not change over the lifetime of the object, or DYNAMIC for values that vary over the lifetime of the object. The DataVariance value can be used by routines such as optimization codes that wish to share static data. UNSPECIFIED is used to specify that the DataVariance hasn't been set yet.
    "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"

  7. #7
    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
    Non toujours pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Geometry::PrimitiveSetList test = drawable->asGeometry()->getPrimitiveSetList();
    static_cast<UserData*>(drawable->getUserData())->setArray(drawable->asGeometry()->getVertexArray(), drawable->asGeometry()->getColorArray(), test);
    drawable->asGeometry()->setColorArray(static_cast<UserData*>(drawable->getUserData())->_tabColorBase);
    drawable->asGeometry()->setColorBinding(osg::Geometry::BIND_PER_VERTEX);
    drawable->asGeometry()->setDataVariance(Object::DataVariance::DYNAMIC);

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


    Bha je vois pas là...

    Mon seul conseil c'est d'utiliser le format OSG comme output de débogage pour aller voir dans les données ASCII se qui se passe..
    "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"

  9. #9
    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
    Alors j'ai exporté le modele 3ds en osg et j'obtient ceci :

    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
    MatrixTransform {
        name "HautDeForm"
        nodeMask 0xffffffff
        cullingActive TRUE
        referenceFrame RELATIVE
        Matrix {
          0.669557 0.742761 0 0
          -0.742761 0.669557 0 0
          0 0 1 0
          6.3949 11.7846 43.214 1
        }
        num_children 12
        MatrixTransform {
          name "Sphere03"
          nodeMask 0xffffffff
          cullingActive TRUE
          referenceFrame RELATIVE
          Matrix {
            -0.533442 0.0242776 0.149043 0
            0.0780181 -0.424195 0.348332 0
            0.116897 0.321993 0.365936 0
            11.7162 -3.16168 -10.39 1
          }
          num_children 1
          Geode {
            name "Sphere03"
            nodeMask 0xffffffff
            cullingActive TRUE
            num_drawables 1
            Geometry {
              UniqueID Geometry_2
              DataVariance DYNAMIC
              StateSet {
                UniqueID StateSet_3
                rendering_hint DEFAULT_BIN
                renderBinMode INHERIT
                Material {
                  name "01 - Default"
                  ColorMode OFF
                  ambientColor 0 0 0 1
                  diffuseColor 0.980392 0.270588 0.270588 1
                  specularColor 0 0 0 1
                  emissionColor 0 0 0 1
                  shininess 0
                }
              }
              useDisplayList TRUE
              useVertexBufferObjects FALSE
              PrimitiveSets 1
              {
                DrawElementsUShort TRIANGLES 2880
                {
                  0 1 2 3 2 4 5 4 6 7
                  6 8 9 8 10 11 10 12 13 12
                  14 15 14 16 17 .........
    On remarque qu'il y a des matériaux. Comment on peut les supprimer ?

  10. #10
    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
    On remarque qu'il y a des matériaux. Comment on peut les supprimer ?
    Il faut utiliser les state set. (méthode getOrCreateStateSet()) et tu l'utilise pour récupérer le stateAttribute qui correspond a ton material et tu le set à NULL, quelque chose dans ce genre là.
    "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"

  11. #11
    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
    La limite de tes connaissances sur osg c'est l'horizon, non ?

    Merci beaucoup sa marche niquel

  12. #12
    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
    La limite de tes connaissances sur osg c'est l'horizon, non ?
    4 ans d'experience pro sur OSG, et voilà ce que ça donne, et encore je suis loin d'en avoir fait le tour...
    "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. [Débutant] supprimer les doublons d'une base access avec datagridview
    Par ziedyah dans le forum ADO.NET
    Réponses: 3
    Dernier message: 19/03/2013, 02h14
  2. [KSH] Supprimer les lignes d'un fichier sur base d'un autre fichier
    Par Rithy666 dans le forum Shell et commandes POSIX
    Réponses: 2
    Dernier message: 12/03/2013, 01h30
  3. Gérer les couleurs du site avec la base de données.
    Par ginkas31 dans le forum Webdesign & Ergonomie
    Réponses: 6
    Dernier message: 06/12/2008, 02h13
  4. Puis-supprimer les doublons de ma base sans risque?
    Par kervano dans le forum Requêtes
    Réponses: 4
    Dernier message: 24/03/2008, 13h51
  5. segmentation base sur les couleurs
    Par hanane78 dans le forum Traitement d'images
    Réponses: 6
    Dernier message: 02/10/2007, 16h02

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