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

C++ Discussion :

Affichage 3d d'un nuage de points


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Par défaut Affichage 3d d'un nuage de points
    Bonjour,
    je dispose d'un fichier contenant 1000000 points de cordonnées x,y,z.
    Je veux afficher ces points dans un repère 3D
    j'ai utilisé opengl, mais il faut programmer tout à la main (en plus pour 1000000 points les manipulations sont très lourdes) ,
    je suis pressée par le temps en plus je suis débutante en programmation 3d
    Y a t'il une bibliothèque déjà développée et qui est open source (basé sur apenGl+des accélérateurs ou autres) qui me permet d'afficher les points, de faire un zoom, des trnslations, des rotations, projection selon x, projection selon y etc.
    Merci d'avance

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 477
    Par défaut
    Si tu t'intéresses juste à l'affichage de tes points et que la programmation n'est qu'un moyen parmi d'autre d'y parvenir, tu peux essayer GNUPlot :

    http://www.gnuplot.info/demo_canvas/random.html

    Si tu travailles sous Unix ou Linux, il y a des chances pour qu'il soit déjà installé et disponible. Maintenant, s'il s'agit d'afficher ces points au sein d'une application plus large, alors tu ne fera pas beaucoup plus rapide (en rendu et en développement) qu'OpenGL.

    Là où je ne suis pas d'accord avec toi par contre, c'est qu'afficher 1.000.000 de points une fois que l'on a la bonne bibliothèque n'est pas plus compliqué qu'en afficher dix. Il suffit de faire une boucle.

  3. #3
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Par défaut
    Bonjour,
    Merci pour votre réponse
    Peut être j'ai oublié de dire que je veux intégrer le code d'affichage des points dans une application développée avec Visual C++, donc GNUPlot à éliminer

    Citation Envoyé par Obsidian Voir le message
    Là où je ne suis pas d'accord avec toi par contre, c'est qu'afficher 1.000.000 de points une fois que l'on a la bonne bibliothèque n'est pas plus compliqué qu'en afficher dix. Il suffit de faire une boucle.
    Mon problème n'est pas dans l'affichage, mais dans la rapidité d'affichage et des manipulations (zoom, rotation, déplacement ...) pour 10, l'affaire est très rapide mais pour 1.000.000 points, il faut attendre 2 minutes pour afficher le résultat d'un zoom ou d'un déplacement.
    Veuillez SVP me proposer un code ou une bibliothèque qui me permet d'afficher les points rapidement et de les manipuler d'une façon rapide aussi

    Merci d'avance

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 59
    Par défaut
    salut,

    suivant ton OS (windows ou linux) tu peux utiliser DirectX (windows only) ou OpenGL

    ensuite pour la performance cela dépendra de ta carte graphique (si elle fait le T&L : Transform & Lighting ou pas)
    en openGL tu peut utiliser les VertexArray : en gros tu charges en mémoire tous les vertexes avec une disposition précise
    et tu laisse le GPU faire la boucle en fonction de ses atouts (mémoire GPU, opérations vectorielles ..)

    d'un autre coté il y a une moultitude de techniques pour éliminer les points potentiellement non visibles à l'écran,
    par exemple : découper le nuage en plusieurs sous-ensembles et faire un test de visibilité sur les volumes englobants (précalculés)
    de ces ensembles (Frustun Culling), ça évite de transformer leurs contenus pour rien

    il y a aussi des réglage à faire au niveau de la lib graphique : désactiver le texturing, l'éclairage ..

    Cdt

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 47
    Par défaut
    Bonjour,
    M'étant confronté à ce genre de problèmes les solutions que je privilégie sont d'utiliser les VertexArray ou DisplayList (pour le choix, il y'a un excellent article dans la FAQ OpenGL) et les construire des que les point sont disponibles selon le type d'affichage que tu souhaite (Point3D, triangles vide ou plein ...). Si le nombre de points est vraiment monstrueux et que ta carte graphique est limitée, le plus simple est de sous échantillonné tes points en tenant compte des caractéristiques de la surface ou du volume qu'ils représente et aussi de la taille de l'affichage.
    Après les manips de zoom, translation et rotations ne posent plus aucun soucis de fluidité.

  6. #6
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Par défaut
    Merci pour vos réponses, ça m'explique un peu les choses mais j'ai quelques interrogations
    Citation Envoyé par kessoufi Voir le message
    en openGL tu peut utiliser les VertexArray : en gros tu charges en mémoire tous les vertexes avec une disposition précise
    Cdt
    Je n'arrive pas à fixer cette disposition, j'ai un nuage de points arbitraire et que je veux l'afficher , comment je peux fixer la disposition d'un ensemble de points arbitraire?
    Citation Envoyé par kessoufi Voir le message
    il y a aussi des réglage à faire au niveau de la lib graphique : désactiver le texturing, l'éclairage ..
    Cdt
    comment je peux les faire et dans quel but?
    Citation Envoyé par tazer Voir le message
    Si le nombre de points est vraiment monstrueux et que ta carte graphique est limitée, le plus simple est de sous échantillonné tes points en tenant compte des caractéristiques de la surface ou du volume qu'ils représente et aussi de la taille de l'affichage.
    Comment faire l'échantillonnage ??? c à dire découper les points en des sous ensembles??? je suis débutante dans ce domaine et ma connaissance est limitée
    Citation Envoyé par tazer Voir le message
    Après les manips de zoom, translation et rotations ne posent plus aucun soucis de fluidité
    Cela après l'échantillonnage ou bien en utilisant les vertexArray?

    Merci d'avance

  7. #7
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 59
    Par défaut
    Citation Envoyé par 3aychoucha Voir le message
    Je n'arrive pas à fixer cette disposition, j'ai un nuage de points arbitraire et que je veux l'afficher , comment je peux fixer la disposition d'un ensemble de points arbitraire?
    avec OpenGL on dit comment il faut lire les données en mémoire, tout est dans les params passés à cette fonction :
    http://www.opengl.org/sdk/docs/man/x...texPointer.xml

    il faudra aussi "activer" le vertex array :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glEnableClientState(GL_VERTEX_ARRAY);
    Citation Envoyé par 3aychoucha Voir le message
    comment je peux les faire et dans quel but?
    avec ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    glDisable(GL_LIGHTING);
    glDisable(GL_TEXTURE_2D);
    ...
    le moteur graphique qu'utilise OpenGL ou DirectX est une machine à états, certains traitements sont activés par défaut *à vérifier* et peuvent être inutils pour ton cas.

    Citation Envoyé par 3aychoucha Voir le message
    Comment faire l'échantillonnage ??? c à dire découper les points en des sous ensembles???

    Cela après l'échantillonnage ou bien en utilisant les vertexArray?
    L'idée est la suivante :
    - pour chacun des 1000000 points, il faut une à deux transformation Matrice*Vecteur pour transformer les coordonnées dans le repère de la camera puis tester sur le point transformé est dans l'espace visible, l'échantillonage premet de réduire le coùt de cette opération en la faisant par groupe disons de 1000 points *voisins*

    Ainsi :
    - si le groupe n'est pas visible : on évite de trasformer les 1000 points dedans qui de toute façon ne seront pas affichés.

    Pour les vertex array, c'est une optim pour le processeur de la carte graphique (GPU) : plutôt que de lui donner 1 par 1 les points à afficher (mode immédiat), on lui indique où il faut chercher ces points et on le laisse jouer.

    Suivant ta config : Processeur/Carte graphiqe/ distribution des points l'une ou l'autre des techniques peut être plus avantageuse

    Cdt

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 47
    Par défaut
    En premier je te conseil, si ce n'est pas déjà fait, de faire un tour dans la partie tuto et FAQ du site, j'y suis souvent passé et m'ont rendu d'enormes services.

    Comment faire l'échantillonnage ??? c à dire découper les points en des sous ensembles??? je suis débutante dans ce domaine et ma connaissance est limitée
    Le plus simple est de ne prendre en compte qu'un point sur N. N peut être calculé, si ton nuage de points set définit sur une grille, comme rapport entre la taille de la grille et la dimensions de la fenêtre d'affichage.
    Cela après l'échantillonnage ou bien en utilisant les vertexArray?
    La meilleur réponse à te donner et de te filer un bout extrait de mon code. il est extrait d'un code plus conséquent et donc ne marchera pas tel quel. C'est pour t'inspirer :
    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
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    ///Création de la display list de point 3D disposer sur une grille rectangulaire avec un échantillonnage de 1 sur nSample.
    void CreateListPoints();
    if (!glIsList(m_nPointsList))
    {
    	POINT3D pt;
    	int il;
    	int ic;
    	int nLi = m_pPt3D.m_nLi;
    	int nCo = m_pPt3D.m_nCo;
     
    	m_nPointsList = glGenLists(1);
    	glNewList(m_nPointsList, GL_COMPILE);
    	glBegin(GL_POINTS);
    		for (il = 0; il<nLi-1; il+=nSample)
    		for (ic = 0; ic<nCo-1; ic+=nSample)
    		{
    			pt = m_pPt3D(il, ic);
    			int iColor = (NUMBER_OF_COLOR-1)*(pt.z-m_fZmin)/(m_fZmax-m_fZmin);
    			if (iColor >= 0 && iColor < NUMBER_OF_COLOR)
    			{
    				float r = m_ColorMap(iColor, 0)/float(NUMBER_OF_COLOR-1);
    				float g = m_ColorMap(iColor, 1)/float(NUMBER_OF_COLOR-1);
    				float b = m_ColorMap(iColor, 2)/float(NUMBER_OF_COLOR-1);
    				glColor4f(r, g, b, m_fAlpha);				
    				glVertex3f(pt.x,pt.y,pt.z);
    			}
    		}
    	glEnd();
    	glEndList();
    }
     
     
    ///Suppression de la displaylist
    void DeleteListPoints()
    GLboolean bIsList = glIsList(m_nPointsList);
    if (bIsList)
    {
    	glDeleteLists(m_nPointsList, 1);
    	m_nPointsList = 0;
    }
     
    ///Affichage de la displaylist
    void DrawAsPoints()
    {
    	GLboolean bIsList = glIsList(m_nPointsList);
    	if(!bIsList)
    		CreateListPoints();
    	glCallList(m_nPointsList);
    }
     
    ///Affichage OPENGL
    void RenderScene()
    {
    	wglMakeCurrent(m_hDC, m_hGLContext);
     
    	glClearColor(0.0, 0.0, 0.0, 1.0f);
    	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     
    	///Cette partie est propre à mon code. Elle a pour but de centrer l'affichage
    	/// et utilise certaines variables déclarées plus loin et dont le nom est explicite
    	int cx = m_nWidth;
    	int cy = m_nHeight;
     
    	if (cy == 0) 
    		cy = 1;
    	if (cx == 0) 
    		cx = 1;
     
    	float xc = (m_fXmax+m_fXmin)/2.0f;
    	float yc = (m_fYmax+m_fYmin)/2.0f;
    	float zc = (m_fZmax+m_fZmin)/2.0f;
     
    	float xw = (m_fXmax-m_fXmin);
    	float yw = (m_fYmax-m_fYmin);
    	float zw = (m_fZmax-m_fZmin);
     
    	m_fSceneRay = sqrt(xw*xw+yw*yw+zw*zw);
     
    	float x1 = xc-m_fSceneRay;
    	float x2 = xc+m_fSceneRay;
    	float y1 = yc-m_fSceneRay;
    	float y2 = yc+m_fSceneRay;
    	float z1 = zc-m_fSceneRay;
    	float z2 = zc+m_fSceneRay;
     
    	float ratio;
    	ratio = (float)cy/(float)cx;
    	if (ratio > 1)
    	{
    		x1 = -m_fSceneRay/ratio;
    		x2 = m_fSceneRay/ratio;
    	}
    	else
    	{
    		y1 = m_fSceneRay*ratio;
    		y2 = m_fSceneRay*ratio;
    	}
    	glPushMatrix();
     
    	glViewport(0, 0, cx, cy);
    	glMatrixMode(GL_PROJECTION);
    	glLoadIdentity();
    	glOrtho(-m_fSceneRay, m_fSceneRay, -m_fSceneRay*ratio, m_fSceneRay*ratio, -m_fSceneRay*m_fSceneRay, m_fSceneRay*m_fSceneRay);
    	glMatrixMode(GL_MODELVIEW);
    	glLoadIdentity();
     
    	glTranslatef(-xc, -yc, -zc);
     
    	///ICI les transformation géométrique du nuage de points
    	glRotatef(m_fxRotat, 1.0f, 0.0f, 0.0f);
    	glRotatef(m_fyRotat, 0.0f, 1.0f, 0.0f);
    	glRotatef(m_fzRotat, 0.0f, 0.0f, 1.0f);
     
    	glScalef(m_fxScale, m_fyScale, m_fzScale);
     
    	glTranslatef(m_fxTrans, m_fyTrans, m_fzTrans);
     
    	///Affichage du nuage dans le nouveau repère
    	DrawAsPoints();
     
    	glTranslatef(xc, yc, zc);
    	glPopMatrix();
     
    	glFinish();
    	SwapBuffers(wglGetCurrentDC());
    }
    J'ai essayer de mettre le maxi de commentaires pour te guider.

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Maintenant, s'il s'agit d'afficher ces points au sein d'une application plus large, alors tu ne fera pas beaucoup plus rapide (en rendu et en développement) qu'OpenGL.
    Et Ogre3D, c'est pour les lutins ? Il n'y a pas que Ogre d'ailleurs, il y a aussi Irrlicht, et d'autres. Développer en OpenGL pur est fastidieux et pas très souple. Avec un moteur 3D, comme Ogre, on peut switcher entre OpenGL et DirectX si on le souhaite, et des tas d'algorithmes et de fonctions sont disponibles, rendant plus facile la gestion de l'éclairage par exemple. Et contrairement aux idées reçues, le coup d'entrée dans le moteur n'est pas si élevé que ça, car c'est très bien documenté.

    Dans ton cas 3aychoucha, je pense que tu devrais opter pour un rendu sans éclairage (couleur pure). Ca te fera gagner du temps.

  10. #10
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Par défaut
    Bonjour, merci une autre fois pour vos réponses
    En fait il faut que j'affiche tous les points (Ce sont des mesures à représenter)
    je vais prendre vos remarques en considération
    je croix que ce n'est une mince affaire surtout que je suis débutante
    Merci

  11. #11
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 477
    Par défaut
    1 million de points, ce n'est pas forcément infaisable mais ça reste très gros quand même.

    Il faut absolument que tu aies un ordre d'idée de la quantité de données que tu produis et de ce que cela représente en coût de traitement, avant de chercher une bilbiothèque magique qui fasse accélérer le tout.

    Et, non, tu n'as pas besoin d'afficher tous ces points : par exemple, un écran 1024×768 ne contient que 786.432 pixels. Même en remplissant l'écran entier, il n'y aurait pas moyen de placer tous tes points dessus. Cela signifie que bon nombre de tes coordonnées vont être confondues à l'écran. Et avec un peu de précalcul, tu pourrais ne conserver que les coordonnées projetées en deux dimensions et/ou fusionner les points les plus proches, par exemple.

    Ensuite, un million de point à placer, c'est conséquent, certes, mais ça ne devrait pas prendre deux minutes non plus. Montre nous un peu ton code, il y a probablement moyen de faire de sérieuses optimisations dessus avant d'envisager l'utilisation d'un accélérateur graphique.

    Tu dois probablement utiliser des classes dont le prototype est attirant sur le papier mais qui se révèlent désastreuses en terme de performances.

  12. #12
    Inactif  
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 123
    Par défaut
    Bonjour,
    Oui, effectivement, il s'agirait d'une application importante. Avec opengl ou directX, ce serait parfait. Il ne faut pas avoir peur de pousser les processeurs au maximum. Le fait que l'écran soit trop petit pour contenir tous les points n'est pas grave. En fait, OpenGL ou DirectX sont capables, j'en suis sûr, de calculer eux-mêmes les points à afficher et ceux à ne pas afficher.
    Donc, à priori, vous devez réaliser d'abord une fonction qui convertit vos coordonnées (x,y,z) en un vertex 3D et les intégrer dans la liste des vertex du moteur.
    Par contre, pour ce qui est de l'interaction avec l'utilisateur, vous devriez vous simplifier la tâche et ne pas exagérer sur la technicité de l'interaction. Enfin, tout dépend de votre niveau de connaissances en OpenGL ou en DirectX.
    Le simple fait de réussir à afficher les points et savoir comment déplacer le viseur du rendu devrait vous suffir.
    Je n'ai pas la maîtrise de opengl ou de directX mais je le connais un peu. Les développements ne sont pas si compliqués que cela si on prend un peu d'attention à se limiter dans les objectifs.
    Bon courage

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/06/2012, 06h30
  2. affichage d'un nuage de points
    Par ryma87rh dans le forum C++Builder
    Réponses: 6
    Dernier message: 19/03/2009, 17h54
  3. Equation d une sphere a partir d un nuage de points
    Par MDiabolo dans le forum Algorithmes et structures de données
    Réponses: 27
    Dernier message: 05/05/2006, 16h40
  4. nuages de points sont-ils dans une zone??
    Par smedini dans le forum Algorithmes et structures de données
    Réponses: 26
    Dernier message: 21/02/2006, 11h01
  5. interpolation couleur entre nuage de points
    Par soubre dans le forum OpenGL
    Réponses: 2
    Dernier message: 02/07/2005, 15h52

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