PDA

Voir la version complète : Point d'intersection entre un vecteur et un polygone



César Vonc
09/12/2011, 20h25
Bonjour,


Je cherche à calculer l'éventuel point d'intersection entre un vecteur et un polygone.

J'ai effectué des recherches sur la toile mais je ne comprends vraiment pas les formules proposées (comme ici (http://www.cs.princeton.edu/courses/archive/fall00/cs426/lectures/raycast/sld017.htm) où dès la seconde ligne ne je pige pas ce qu'est la valeur « d »), notamment au sujet de l'équation du plan, j'ai juste les coordonnées des points du polygone, et non un truc du genre ax+by+cz+d=0 comme j'ai vu sur beaucoup de sites.

Je sèche vraiment sur le coup... quelqu'un sait-il comment s'y prendre ? Peut-être y a-t-il une méthode miracle en COFFEE.

valkaari
09/12/2011, 21h11
Si c'est pour c4d pas besoin de se prendre la tête plus que ça, il suffit d'utiliser c4d.utils.GeRayCollider

un init, intersect et un getIntersection. Pour la longueur du rayon tu peux éventuellement prendre la distance entre le centre de l'objet et le point de départ du rayon et ajouter la taille de l'objet.


edit :
Sinon pour cette histoire de d ondirait que c'est la distance entre la projection du point perpendiculairement au plan et le point réellement projeté. Je crois hein, j'suis pas certain j'y comprends rien à ces trucs. y a bien un vrai matheux qui vas passer dans le coin ^^



edit2 :
Sauf que tu veux le faire en coffee et qu'en coffee ces fonctions n'existent pas ^^


Par contre on dirait qu'il y a une solution sur le forum c4dcafé (c'est juste un peu plus long -_-')
http://www.plugincafe.com/forum/forum_posts.asp?TID=5811

César Vonc
09/12/2011, 21h38
Par contre on dirait qu'il y a une solution sur le forum c4dcafé (c'est juste un peu plus long -_-')
http://www.plugincafe.com/forum/foru...s.asp?TID=5811 (http://www.plugincafe.com/forum/forum_posts.asp?TID=5811)
Ah oui en effet, c'est plus long d'une centaine de lignes, en plus d'être en C++.


J'étais parti pour faire ça en COFFEE, j'ai en plus déjà fait un script pour calculer les normales des sommets et polygones.


La solution c4d.utils.GeRayCollider est en Python, c'est ça ?

Si en plus le Python peut récupérer les normales des sommets en une fonction, je crois que je vais devoir dire adieu au Coffee...

valkaari
09/12/2011, 23h57
C'est pas important qu'il soit en c++ ça reste lisible ^^

Pour la version 11.5 le module python (qui n'est plus dispo officiellement) n'était pas complet.
C'était mieux avec la R12.

Avec la R13, il y a presque toutes les fonctions du sdk c++ et avec toutes les fonctions qui viennent déjà avec python.
Donc oui abandonner le coffee est une bonne idée.

paspas
10/12/2011, 16h57
hello

j' avais en coffee fait le code qui calcul une intersection d'un plan ( un polygone ) et une droite .

faut que je retrouve ca .

il traine déjà sur ce forum mais faut le retrouver
je regarde et je repasse si je trouve

paspas

César Vonc
10/12/2011, 22h01
C'est pas important qu'il soit en c++ ça reste lisible ^^Oui, pour ce cas ci, je craignais qu'il n'utilise des fonctions que le Coffee ne gère pas.

J'ai essayé son code, il a l'air de marcher une fois sur deux, ceci dit je l'ai peut être mal interprété, certaines lignes ne me parlent pas beaucoup, comme :

if (res < 1) continue;Que signifie continue, exactement ?

Ou bien :

if (fabs(b) < SMALL_NUM)Je ne connais pas le C++, mais si SMALL_NUM est le plus petit réel qui soit, ce qui y est inférieur est forcément zéro ou un nombre négatif, non ?



j' avais en coffee fait le code qui calcul une intersection d'un plan ( un polygone ) et une droite .Ah, cela ne serait pas de refus, paspas !

valkaari
12/12/2011, 16h32
le continue est utilisé dans une boucle. Contrairement au break, qui casse et sort de la boucle, le continue lui arrête la boucle et passe à l'itération suivante. Cela évite de mettre tout un gros bloc de code dans un if quoi. Dans l'exemple, si res est inférieur à 1, on passe à la boucle suivante sans exécuter le reste du code.


Pour le SMALL_NUM c'est une constante définie à


#define SMALL_NUM 0.00000001f

C'est une façon de définir des constantes sans qu'elles appartiennent à des classes ou à des fonctions.

César Vonc
25/12/2011, 21h19
Ah d'accord, merci pour ces précisions, Valkaari.


On dirait bien que cette solution fonctionne !

Il faut cependant noter qu'elle s'applique à un triangle, car elle n'utilise que les points a b et c d'un polygone, donc dans le cas d'un quadrangle (lorsque p->c != p->d) il est bon de vérifier à nouveau la collision du rayon mais avec les points a c et d du polygone.