opengl

opengl - C++ - Programmation

Marsh Posté le 24-06-2003 à 17:13:29    

salut
 
je voudrais faire un programme en opengl qui permet d'afficher que les points visibles d'un maillage, à partir d'une position de caméra donnée.
Je dispose d'une liste de triangle, et de la liste de mes points.
Mon idée c'est trouver à partir de l'équation en 3D du plan correspondant à chaque face, et des coordonnées des points, de voir si il y a une intersection entre la droite qui par du point à la caméra et chaque face. Si cette intersection existe et est dans le triangle correspondant à la face traitée, alors le point est caché. Sinon on l'affiche.
Je sais pas si j'ai été clair, mais en fait je voudrais savoir ce que vous en pensez et s'il vous avez des suggestions.  
merci...
a+ MM

Reply

Marsh Posté le 24-06-2003 à 17:13:29   

Reply

Marsh Posté le 24-06-2003 à 17:22:13    

Ben tu as une fonction qui te permet d'afficher que ce qui est visible dans opengl (un truc à "setter" quelque part)...si j'ai bien compris ce que tu voulais faire.


---------------
Horizon pas Net, reste à la buvette!!
Reply

Marsh Posté le 24-06-2003 à 17:39:09    

C'est de la detection de collision de base ca.
Le point testé est en P. La camera en M. Les trois points de ton triangle sont A, B, C. Ils forment le plan ABC.
 
Commence par déterminer l'intersection I de ABC et de MP (la formule est assez simple ).  
 
Ensuite il faut vérifier si le P et M sont du meme coté du plan ABC. Pour cela, tu calcules la normale N de ton plan avec un produit vectoriel et tu fais deux produits scalaires : N avec IP, et N avec IM. Si les signes sont les memes ca veut dire que M et P sont du meme coté de ABC, et que donc la face ne cache pas notre point.
 
Si ils ne sont pas du meme coté, il reste juste a vérifier si le point I appartient au triangle formé par ABC. Pour cela fais la somme des trois mesures angulaires (IA,IB), (IB,IC), (IC,IA). Si tu es dans le triangle, tu dois trouver 360 degrés. Si tu trouves moins, c'est que I n'est pas dans le triangle et donc la face ne cache pas le point.

Reply

Marsh Posté le 24-06-2003 à 21:29:31    

Je ferais ça bourrin : tu dessines ton objet pour remplir le zbuffer (il reste invisible si tu demandes un blending (one, one) avec une couleur noire par exemple). Ensuite, tu bidouilles suivant le degré de précision souhaité : afficher un sprite rond pour chaque vertex donnera parfois un bout de sprite non voulu sur un vertex caché, pour un point d'un pixel aucun problème : tu le dessines directement, avec un peu de zbias (glPolygonOffset()) s'il y a du zfight.

Reply

Marsh Posté le 25-06-2003 à 13:11:54    

salut
 
merci pour vos suggestions. Je suis en train de chercher un algo qui permet de déterminer l'équation d'un plan à partir de trois points.
Si vous avez des idées, ou des adresses.
merci

Reply

Marsh Posté le 25-06-2003 à 14:09:45    

je cherche aussi comment calculer l'équation d'un droite à partir de 2 points  
 
merci d'avance

Reply

Marsh Posté le 26-06-2003 à 05:30:46    

mbibim tu es en quelle classe?  
(j'demande juste pour savoir faut pas se sentir agressé ;))
 
Si tu as trois points A, B et C et leur coordonnées respectives
 
Alors tu as simplement l'equation du plan comme
l'ensemble des points tels que AM (vecteur)  
soit perpendiculaire a AB^AC (produit vectoriel)
pour savoir s'ils sont perpendiculaires, tu fais le produit
scalaire des deux et tu regardes si c'est egal à zero.
 
Tu remarqueras que si A, B et C sont colineaires ca ne marche pas. (AB^AC = 0 et tu ne peux pas definir de plan a partir de trois points colineaires)
 
De meme si tu as deux points A et B, et leurs coordonnées.
Alors la droite est l'ensemble des points M tels que
AM et AB sont colineaires.
En general on determine que deux vecteurs sont colineaires lorsque leur produit vectoriel est nul (en 3D).
c'est a dire AM^AB = 0 (le vecteur nul).
Tu vas donc avoir trois equations, mais il ne t'en faut que deux pour determiner une droite. Ce n'est pas surprenant: le systeme est surdeterminé et l'une des equations est liée aux deux autres par une simple relation lineaire.
Bien evidemment tu ne peux pas savoir a l'avance quelle equation eliminer. Tu peux prendre la troisieme sauf dans le cas particulier ou l'une des deux premieres equations est deja sous la forme 0 = 0.
 
A+
LeGreg

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed