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

OpenGL Discussion :

Voxelisation d'un objet 3D


Sujet :

OpenGL

  1. #1
    Membre du Club
    Doctorante
    Inscrit en
    Avril 2009
    Messages
    56
    Détails du profil
    Informations professionnelles :
    Activité : Doctorante

    Informations forums :
    Inscription : Avril 2009
    Messages : 56
    Points : 47
    Points
    47
    Par défaut Voxelisation d'un objet 3D
    Bonjour,

    Je veux crée un programme qui permet de représenter un objet 3D par un ensemble de voxels, j'ai comme entrée un mesh d'un fichier obj et je cherche une manière simple et efficace de voxeliser juste le contours, je travaille avec le C++ et GLSL 3.3 sous VS2008, j'ai crée la grille de voxels en utilisant la texture 3D:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    glGenTextures(1, &m_texID);
    glBindTexture(GL_TEXTURE_3D, m_texID);
     
    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 0);
    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 0);
    glBindTexture(GL_TEXTURE_3D, 0);
    Et j'ai crée un program shader de ray marching pour visualiser le volume,

    Pour tester si tous marche bien, j'ai générer des valeurs aléatoire pour remplir les données de la texture:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    float* data = new float[m_dim.x * m_dim.y * m_dim.z * 3];
    for (size_t i = 0; i < m_dim.x * m_dim.y * m_dim.z * 3; i++) {
      data[i] = (rand() / (float) RAND_MAX) * 0.5f + 0.1f;
      //std::cout << data[i] << "\n";
    }
     
    glBindTexture(GL_TEXTURE_3D, m_texID);
    glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB8, m_dim.x, m_dim.y, m_dim.z, 0,
                 GL_RGB, GL_FLOAT, data);
    glBindTexture(GL_TEXTURE_3D, 0);
    Et voilà le résultat:

    Nom : img02.png
Affichages : 549
Taille : 59,9 Ko

    Ma question est: comment faire pour insérer l'objet dans le volume, afin de le voxeliser

    Merci.

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 393
    Points : 685
    Points
    685
    Par défaut
    Les réponses que l'on t'a donné sur l'autre forum ne t'aident pas ?

  3. #3
    Membre du Club
    Doctorante
    Inscrit en
    Avril 2009
    Messages
    56
    Détails du profil
    Informations professionnelles :
    Activité : Doctorante

    Informations forums :
    Inscription : Avril 2009
    Messages : 56
    Points : 47
    Points
    47
    Par défaut
    Bonjour,

    Citation Envoyé par mintho carmo Voir le message
    Les réponses que l'on t'a donné sur l'autre forum ne t'aident pas ?
    Pas grande chose, je veux une idée pour terminer avec le travail que j'ai le déjà commencé, c'est à dire comment insérer l'objet dans le volume?

    Merci.

  4. #4
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    L'approche naïve serait de rasterizer ton objet à la main, tu prends chaque triangle de ton objet et tu détermines à quel sous-volume il appartient, puis tu donnes à ce sous-volume les infos de couleur nécessaire au calcul d'éclairage (simple : juste la couleur d'affichage finale. un peu plus complexe : les paramètres du matériel, les normales etc). Si plusieurs triangles occupent le même sous-volume tu peux soit décider de couper le sous-volume en plus petits sous-volumes, soit de faire une "moyenne" des infos de chaque triangle, soit de ne prendre en compte que le premier triangle (ou le dernier triangle) etc. Il peut y avoir des problèmes d'angle de vue (est-ce que chaque voxel a la même apparence quel que soit l'angle de vue ?).

    Tu pourrais aussi vouloir avoir un objet "plein", dans ce cas tu peux déterminer l'intérieur de l'objet (si c'est un objet fermé), et de donner des valeurs de couleur à ces voxels intérieur (procéduralement ou à la main).

    Autres approches possibles : scanner le volume voxel par voxel et utiliser des méthodes de recherche (lancer de rayon ?) pour déterminer si tu te trouves à l'intérieur ou l'extérieur de l'objet, etc.

    Il y a probablement d'autres techniques possibles..

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  5. #5
    Membre du Club
    Doctorante
    Inscrit en
    Avril 2009
    Messages
    56
    Détails du profil
    Informations professionnelles :
    Activité : Doctorante

    Informations forums :
    Inscription : Avril 2009
    Messages : 56
    Points : 47
    Points
    47
    Par défaut
    Bonjour,

    Merci pour ta réponse,

    Citation Envoyé par LeGreg Voir le message
    L'approche naïve serait de rasterizer ton objet à la main, tu prends chaque triangle de ton objet et tu détermines à quel sous-volume il appartient, puis tu donnes à ce sous-volume les infos de couleur nécessaire au calcul d'éclairage (simple : juste la couleur d'affichage finale. un peu plus complexe : les paramètres du matériel, les normales etc). Si plusieurs triangles occupent le même sous-volume tu peux soit décider de couper le sous-volume en plus petits sous-volumes, soit de faire une "moyenne" des infos de chaque triangle, soit de ne prendre en compte que le premier triangle (ou le dernier triangle) etc. Il peut y avoir des problèmes d'angle de vue (est-ce que chaque voxel a la même apparence quel que soit l'angle de vue ?).
    Pour faire cette étape, je dois insérer mon objet dans le volume (texture 3D), et ça mon problème comment je peux remplir la texture 3D par les données de mon modèle (les sommets sont stockés dans un fichier obj), afin de commencer l'algorithme,
    Citation Envoyé par LeGreg Voir le message
    Tu pourrais aussi vouloir avoir un objet "plein", dans ce cas tu peux déterminer l'intérieur de l'objet (si c'est un objet fermé), et de donner des valeurs de couleur à ces voxels intérieur (procéduralement ou à la main).

    J'ai pas besoin de l'intérieur, je veux voxeliser les contours uniquement.

  6. #6
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    Citation Envoyé par shadow07 Voir le message
    Pour faire cette étape, je dois insérer mon objet dans le volume (texture 3D), et ça mon problème comment je peux remplir la texture 3D par les données de mon modèle (les sommets sont stockés dans un fichier obj), afin de commencer l'algorithme,
    Quelle est la question ?
    Si ton problème est de lire les infos du fichier obj, il faut se référer à la documentation du format pour le lire. Il y a probablement dans ce fichier des nombres qui sont des représentations de la position des triangles, avec peut-être d'autres infos comme les normales, les coordonnées de texture ou la couleur diffuse par sommet.
    Si ton problème est de trouver la position d'un triangle (dont tu connais les coordonnées) dans un sous-volume, il faut que tu fasses un calcul d'intersection triangle/volume pour chaque triangle (ce qui devrait être facile si le volume en question est dans une grille régulière orientée selon les axes de coordonnées X,Y et Z).

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  7. #7
    Membre du Club
    Doctorante
    Inscrit en
    Avril 2009
    Messages
    56
    Détails du profil
    Informations professionnelles :
    Activité : Doctorante

    Informations forums :
    Inscription : Avril 2009
    Messages : 56
    Points : 47
    Points
    47
    Par défaut
    Citation Envoyé par LeGreg Voir le message
    Quelle est la question ?
    Si ton problème est de lire les infos du fichier obj, il faut se référer à la documentation du format pour le lire. Il y a probablement dans ce fichier des nombres qui sont des représentations de la position des triangles, avec peut-être d'autres infos comme les normales, les coordonnées de texture ou la couleur diffuse par sommet.
    Si ton problème est de trouver la position d'un triangle (dont tu connais les coordonnées) dans un sous-volume, il faut que tu fasses un calcul d'intersection triangle/volume pour chaque triangle (ce qui devrait être facile si le volume en question est dans une grille régulière orientée selon les axes de coordonnées X,Y et Z).
    J'ai crée le volume, et j'ai chargé le modèle obj avec l'utilisation d'Assimp, mais avant de faire le calcul d'intersection triangle/volume, il faut insérer les données de l'objet dans la texture 3D

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    glBindTexture(GL_TEXTURE_3D, m_texID);
    glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB8, m_dim.x, m_dim.y, m_dim.z, 0,
                 GL_RGB, GL_FLOAT, data);
    glBindTexture(GL_TEXTURE_3D, 0);
    Quand j'ai rempli data par des valeurs aléatoire, j'ai obtenu le résultat ci-dessus,

    Donc ma question que (et comment) je dois mettre dans data afin de commencer le test d'intersection triangle/volume?

Discussions similaires

  1. codage objet
    Par charly dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 22/08/2002, 16h49
  2. algo : rotation d'objet 3d
    Par numeror dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 19/08/2002, 22h58
  3. Importer des objets de 3dsMax
    Par Anonymous dans le forum OpenGL
    Réponses: 3
    Dernier message: 06/05/2002, 13h53
  4. Peux t'on créer une copie locale de l'objet partagé?
    Par Anonymous dans le forum CORBA
    Réponses: 8
    Dernier message: 16/04/2002, 16h20
  5. [Kylix] Erreur objet
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 22/03/2002, 09h41

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