Discussions au sujet des autres produits NI

annuler
Affichage des résultats de 
Rechercher plutôt 
Vouliez-vous dire : 

3D

Bonjour à tous ! (le pluriel est-il nécessaire ?) 🙂

Quelqu'un saurait-il comment trouver, pour une surface 3D, définie par un maillage de n points de coordonnées xi,yi,zi, l'altitude z d'un point quelconque de coordonnées x,y. Les xi,yi sont quelconques (ce serait trop facile si les points appartenaient à un maillage régulier !).

Merci pour vos suggestions.
Voir le vi attaché pour une visualisation 3D du problème...

CC
Chilly Charly    (aka CC)
0 Compliments
Message 1 sur 8
6 584 Visites
Bonjour,

Je ne vais pas rentrer dans les détails, et je n'ai peut être pas la solution la plus simple.
En bref, il faut déterminer l'équation de plan de la surface considérée (A,B,C) et remplacer x et y dedans pour trouver z.
Pour déterminer l'équation il faut calculer la normale à ce plan (produit vectoriel des vecteurs AB et AC). L'équation est ensuite donnée par le produit des vect AM et Normal : ax+by+cz+d = 0.

Ensuite il faut déterminer si le point trouvé appartient au triangle considéré.
Si l'on considére que le point se trouve à l'intérieur du triangle ABC, il faut calculer la somme des angles formés par les trois vecteurs MA,MB,MC et vérifier que celle-ci = 2pi.

Je n'ai pas d'autres idées.
Tout est dans le VI (je l'ai enregistré en version 7.0).

Cordialement,

Gianni Martinico.
NI France.
Cordialement,

Gianni Martinico
NI France
Message 2 sur 8
6 532 Visites
Merci pour votre réponse.
En fait, je n'ai pas de problème pour calculer l'altitude à partir de trois points. Le problème, c'est de trouver les trois points autour du point d'altitude inconnue. L'algoritme doit être rapide car la surface 3D sur laquelle je travaille est constituée de 30000 pts placés sur un maillage aléatoire. Et ce n'est pas d'une altitude dont j'ai besoin, mais d'un million !
Pour l'instant, je suis totalement incapable de repérer le triangle concerné. Ce n'est pas une opération triviale. Essayez par exemple avec 4 points disposés en carré. Comment tracer la diagonale ? Les deux solutions sont acceptables, sauf qu'elle génèrent des surfaces totalement différentes, l'une convexe, l'autre concave. Laquelle est la bonne ? La solution ne peut être trouvée qu'en allant regarder AUTOUR...
Manifestement, la fonction graphe 3D est capable de réaliser ce travail de manière très efficace. Elle parvient même à attribuer une couleur à chaque pixel appartenant à un triangle quelconque, et à faire varier cette couleur en fonction de son illumination par plusieurs sources.
N'y a t'il pas des accès à ces fonctions intégrées qui me permettraient d'atteindre mon objectif ?

CC
Chilly Charly    (aka CC)
0 Compliments
Message 3 sur 8
6 501 Visites
Bonjour,

Alors là, je ne peux pas faire grand chose pour vous. Effectivement le graph3D que vous utilisez n'offre pas ce genre de fonctionnalités (qui sont normalement réservées à des logiciels tels que 3DStudio ou Maya au niveau rendering (Ray tracing)).
Il vous faudra donc essayer de trouver l'algorithme vous-même, et effectivement cela ne va pas être simple.
C'est un sujet intéressant, même si je ne connais pas la finalité de votre projet, mais faute de temps je ne pourrais pas me pencher là dessus.
Je vous souhaite bon courage. Si j'ai une petite idée, j'ajouterai un post.
Cordialement,

Gianni Martinico
NI France
Message 4 sur 8
6 493 Visites

Effectivement le graph3D que vous utilisez n'offre pas ce genre de fonctionnalités (qui sont normalement réservées à des logiciels tels que 3DStudio ou Maya au niveau rendering (Ray tracing)).


Si, justement, l'outil graph3D propose des fonctions de colorisation et d'éclairement ! Et il gère donc l'interpolation !!
Il est vrai que la documentation de cet outil est quelque peu succincte, et qu'il faut creuser un peu pour accéder à ces fonctions. Voir par exemple : click droit sur le graph, puis "propriétés...", qui donne accès à l'ensemble des réglages, y compris éclairement.

CC
Chilly Charly    (aka CC)
0 Compliments
Message 5 sur 8
6 490 Visites
Je pense que nous nous sommes mal compris.
Le graph 3D ne propose pas ces fonctionnalités, ou appels de fonctions pour obtenir ce que vous souhaitez, car le tracé d'une simple surface triangulaire avec l'éclairage est entiérement géré par la bibliothèque OpenGL. Le graph "ne fait rien lui-même" et donc aucun calculs, le but étant, de faire faire ses calculs par la carte graphique. Bien entendu, OpenGL offre des fonctions pour selectionner une face suite à un click de souris par exemple (ce genre de fonctions est utilisé par le graph pour déplacer un curseur), mais le graph3D n'est pas prévu pour exploiter toutes les fonctionnalité de l'OpenGL.
Cordialement,

Gianni Martinico
NI France
Message 6 sur 8
6 485 Visites
Merci pour votre réponse, qui me permet d'avancer nettement dans un domaine qui ne m'est pas familier. Je pense que la question que j'ai posé ne correspond pas à mon problème. Grace à vos réponse, je peux reformuler ma question.
En fait, je désire faire deux choses :

1/ Calculer l'altitude d'un point quelconque. Il s'agit là de repérer le triangle auquel appartient le point, et de faire un peu de math. C'est le repérage qui pose problème, mais en recherchant les plus proches voisins, et avec un peu de modélisation, je devrais m'en tirer.

2/ Plaquer une texture sur la surface 3D. La surface en question est un bout de montagne, et je voudrais plaquer dessus soit l'image 2D d'une carte topographique, soit une photo aérienne, soit une image satellite (fausses couleurs, correspondant à la nature du sol). Il existe des outils pour celà, mais ils sont financièrement hors de ma portée.
L'approche que j'avais suivi était d'attribuer à chaque point de la surface (3D) la couleur correspondante de l'image ou de la photo. Je sais faire ça sur chacun des vertex (vous voyez, mon vocabulaire s'adapte...), en jouant sur la composante w utilisée dans les graphes 3D. Mais il fallait que je le fasse aussi sur les autres points. Mon idée (mauvaise) était de reéchantillonner la surface 3D pour avoir un nombre de vertex correspondant à la résolution recherchée pour la texture.
J'ai découvert, en creusant un peu à partir de votre réponse, que la bibliothèque openGL disposait de fonctions de placage de texture, et je peux maintenant reformuler ma question :
Quelqu'un sait-il comment plaquer une texture sur une surface 3D avec LabVIEW ?
Chilly Charly    (aka CC)
0 Compliments
Message 7 sur 8
6 461 Visites
OpenGL utilise des structures de données qui lui sont propres pour l'appel de ses fonctions, ce qui le rend inutilisable directement avec LabVIEW.
Il vous faut donc réaliser un "wrapper", c'est à dire une dll comportant des fonctions que LabVIEW peut appeler, ces fonctions appelant elles-mêmes les fonctions d'OpenGL. Ensuite, vous devez appeler les fonctions du wrapper(dll) dans LabVIEW. Ce n'est pas simple et ça demande de connaître OpenGL (je crois qu'il y a prés de 250 fonctions).
Vous avez deux solutions :
-Faire le wrapper à l'aide d'un outil de développement en C par exemple.
-Trouver un contrôle ActiveX (un peu comme le graph3D) qui fait le wrapper pour vous et vous met à disposition des fonctions de plus haut niveau.

Maintenant, si quelqu'un à quelque chose à proposer à Chilly Charly....

Pour info, National Instruments propose pour évaluation (gratuit) un toolkit permettant de faire de l'OpenGL dans un contrôle de type Picture (pour LabVIEW 7.1).
Pour l'instant les fonctionnalités sont limitées (le texturing n'est pas présent entre autres choses) et il n'y a pas de support.
Peut être verrons nous ce toolkit s'étoffer un peu s'il intéresse le public...

http://zone.ni.com/devzone/conceptd.nsf/webmain/9672F024704DE89086256ED100620A56?opendocument
des exemples s'installeront dans ...\LabVIEW 7.1\Examples\Picture3d
Cordialement,

Gianni Martinico
NI France
Message 8 sur 8
6 455 Visites