Un peu de maths - Calcul du volume englobant d'une spotlight

Un peu de maths - Calcul du volume englobant d'une spotlight - C++ - Programmation

Marsh Posté le 09-08-2009 à 12:12:57    

Bonjour,
 
Je fais un peu de deferred shading et je cherche à calculer un volume englobant très simple autour de ma spotlight. Elle est caractérisée par un angle max d'ouverture Phi, un vecteur direction Dir, une position Pos et une portée max Range (tous dans l'espace monde).
 
Le volume en question n'est ni plus ni moins qu'un prisme à 5 vertices: le sommet est la source Pos, les autres (A,B,C,D) forment la base, qui englobe le disque terminal (càd l'ouverture max), dont le centre est donc E = Pos + Dir * Range.
 
Je cherche à calculer les coordonnées monde de A,B,C,D.
 
En théorie c'est simple: A,B,C,D appartiennent tous à un plan P défini par son vecteur normal Dir et sa distance d à l'origine, soit celle de E.
Ils appartiennent également à une sphere S de centre E et de rayon r que j'ai calculé.
Je veux donc trouver l'équation de l'intersection de P et de S afin de déterminer les coordonnées d'un point quelconque (ce sera A) sur le disque résultant. Il sera ensuite facile de trouver les coordonnées des trois autres.
 
Bref on a:
a*xA + b*yA + c*zA + d = 0 avec a,b,c,d connus.
(xE-xA)² + (yE-yA)² + (zE-zA)² = r² avec xE, yE, zE et r connus.
Et là je sèche, ça fait seulement 2 équations pour trois inconnues, faut-il prendre une valeur au pif pour xA?
 
Est-ce quelqu'un peu m'expliquer comment trouver ces coordonnées?
 
Merci d'avance.

Reply

Marsh Posté le 09-08-2009 à 12:12:57   

Reply

Marsh Posté le 09-08-2009 à 15:52:49    

Houlà faut croire que tout le monde passe son chemin!
 
Bon je crois que j'ai trouvé une autre solution, plus simple, mais j'aimerais bien que quelqu'un confirme ma méthode:
 
- Plutôt que de chercher l'intersection plan-sphere, je calcule plutôt un vecteur directeur à mon plan. Donc je prends un point Q quelconque du plan tel que a*xQ + b*yQ + c*zQ + d = 0 et Q != E.
Si a != 0 je lui donne disons yQ = yE + offset, zQ = zE et je calcule xQ= - ( b*yQ + c*zQ + d ) / a.
Sinon j'essaye la même chose (b != 0, c != 0) pour tomber sur un point valide.
Maintenant j'ai mon vecteur EQ directeur, que je normalize et multiplie par coneRadius. Mon point A est donc E + ce vecteur.
Après un cross product et 2 inversions, je peux trouver les points B,C et D.
 
Ca vous semble bon?

Reply

Marsh Posté le 09-08-2009 à 17:13:36    

Oui c'est bon.  
Mais ce n'est pas très bien exprimé.
 
Tu as un vecteur direction (X,Y,Z). Il te suffit de trouver une perpendiculaire (par exemple [-Y,X,0]) normalisée correctement pour avoir un vecteur de base EA. (EC=-EA).
Puis tu calcules le produit vectoriel (DIR,V1) pour avoir le deuxième vecteur de base (EB=-ED).
 
 
Mais j'ai cru au départ que tu voulais simplement calculer le volume de la pyramide (OABCD?) donc pourquoi t'embêter à calculer les coordonnées das 4 sommets de base?

Reply

Marsh Posté le 09-08-2009 à 21:55:30    

Non l'idée est justement de connaitre les coordonnées monde de chaque vertex de mon volume, ainsi je peux ensuite les projeter en screen space et calculer la zone réellement couverte à l'écran...et donc profiter du scissor test lors de la passe d'éclairage.
 

Citation :


(EC=-EA).  
Puis tu calcules le produit vectoriel (DIR,V1) pour avoir le deuxième vecteur de base (EB=-ED).


Effectivement, c'est ce dont je parlais (cross product + 2 inversions). Désolé si j'ai été un peu confus dans mes explications.
 
Oui il y a peut-être plus simple pour trouver un vecteur perpendiculaire, néanmoins j'ai du mal à imaginer qu'en mettant Z à 0 j'obtienne le bon résultat dans tous les cas, mais je vais essayer ça.
 
Merci de ton aide!


Message édité par akalash47 le 09-08-2009 à 22:02:21
Reply

Sujets relatifs:

Leave a Replay

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