algo calcul de volume objet 3d

algo calcul de volume objet 3d - VB/VBA/VBS - Programmation

Marsh Posté le 17-06-2012 à 21:58:37    

Bonjour,
 
Je dois pouvoir calculer le volume d'un objet 3D. J'utilise l'algo décrit ici:http://www.gamedev.net/page/resour [...] ions-r2247 que j'ai retranscrit en VB:
 

Citation :

Function volume(ByRef source As T_Objet)
    Dim i As Integer
    Dim vol As Double
    Dim v1 As T_Coord
    Dim v2 As T_Coord
    Dim v3 As T_Coord
     
    vol = 0
     
    For i = 0 To source.NmbFaces
        v1.X = source.Face(i).Point(0).Coord.X
        v1.Y = source.Face(i).Point(0).Coord.Y
        v1.Z = source.Face(i).Point(0).Coord.Z
        v2.X = source.Face(i).Point(1).Coord.X
        v2.Y = source.Face(i).Point(1).Coord.Y
        v2.Z = source.Face(i).Point(1).Coord.Z
        v3.X = source.Face(i).Point(2).Coord.X
        v3.Y = source.Face(i).Point(2).Coord.Y
        v3.Z = source.Face(i).Point(2).Coord.Z
         
        vol = vol + ((v2.Y - v1.Y) * (v3.Z - v1.X) - (v2.Z * v1.X) * (v3.Y - v1.Y)) * (v1.X + v2.X + v3.X)
    Next
    volume = vol / 6#
     
End Function


 
J'ai testé avec un cube de 2 dans un fichier .obj dont les coordonnées (stockées 3 par 3) sont:
 

Citation :

v -1 -1 -1
v 1 -1 -1
v -1 1 -1
v 1 1 -1
v 1 -1 -1
v -1 1 -1
v 1 1 -1
v -1 1 -1
v 1 1 1
v -1 1 1
v -1 1 -1
v 1 1 1
v -1 1 1
v -1 1 -1
v -1 -1 1
v -1 -1 -1
v -1 1 -1
v -1 -1 1
v -1 -1 -1
v 1 -1 1
v -1 -1 1
v -1 -1 -1
v 1 -1 1
v 1 -1 -1
v 1 1 1
v 1 -1 1
v 1 -1 -1
v 1 1 1
v 1 1 -1
v 1 -1 -1
v 1 1 1
v 1 -1 1
v -1 -1 1
v 1 1 1
v -1 1 1
v -1 -1 1


 
Cependant le volume qui est renvoyé est 0. Et en changeant les coordonnées du cube (avec les mêmes dimensions) j'obtiens un volume encore différent.
Savez-vous ce qui ne marche pas chez moi?

Reply

Marsh Posté le 17-06-2012 à 21:58:37   

Reply

Marsh Posté le 18-06-2012 à 10:40:32    

L'algo dans l'article ne fait jamais incrémenter i. Ton i correspond au j dans l'algo. Ton pb vient très probablement de la structure de stockage des coordonnées qui est différente.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 18-06-2012 à 16:39:13    

problème de clockwise/counterclockwise ?
Quand tu translates les coordonnées, c'est bien uniforme sur tous les vertices ? (tu ne changes pas l'ordre par triangle ?)

Reply

Marsh Posté le 20-06-2012 à 13:09:42    

Merci pour vos réponses.
 
Effectivement je viens de relire plus en détail la description de l'algo, et il semble que les points doivent être ordonnés d'une certaine manière... Cependant je ne vois pas comment traiter des points de façon horaire ou anti-horaire dans l'espace?

Reply

Marsh Posté le 21-06-2012 à 00:04:42    

La grosse question est de savoir si lors de tes tests de translation, tu changes l'ordre ou pas.
Si tu changes l'ordre tu pourri l'algorithme qui se base sur l'orientation des triangles pour sommer ou soustraire le volume de la pyramide (triangle => point constant/origine).
 
La plupart des algorithmes en 3D ont besoin d'une orientation (normale) cohérente, il faut que tu travailles ça ;)

Reply

Marsh Posté le 22-06-2012 à 09:47:23    

Lors de la translation, je calcule juste le barycentre (en faisant une moyenne sur chaque coordonnée), et je soustrais le barycentre sur chaque point, comme ça le barycentre se retrouve théoriquement aux coordonnées (0, 0, 0). Mais en aucun cas je ne change l'ordre des triangles.
 
Mon problème doit effectivement venir de l'orientation des points qui semble être indispensable pour cet algorithme, mais je ne sais pas trop m'y prendre en l’occurrence pour les orienter et les organiser correctement.

Reply

Marsh Posté le 22-06-2012 à 14:03:28    

Alors c'est plus bizarre, si tu ne fais qu'une translation sans changer l'ordre ça devrait pas bouger :/

Reply

Marsh Posté le 25-06-2012 à 21:39:51    

Oui, j'ai peut-être mal reproduit l'algo... J'ai voulu essayer d'autres algorithmes, mais il semble qu'ils aient tous besoin de cette orientation, et je ne sais pas trop comment m'y prendre pour ça...  
Il y aurait pas une solution plus simple?

Reply

Marsh Posté le 26-06-2012 à 09:59:08    

Non, mais si ton orientation est bonne à l'origine elle doit pas changer lors d'une translation/rotation.

Reply

Marsh Posté le 26-06-2012 à 10:40:53    

Oui, c'est sûr que ce n'est pas normal, il doit y avoir un problème algorithmique même si je ne vois pas où... :-/

Reply

Marsh Posté le 26-06-2012 à 10:40:53   

Reply

Marsh Posté le 26-06-2012 à 10:51:51    

tu t'est planté(e) en copiant/collant l'équation de calcul de volume ;)
(forcément le truc que j'ai pas regardé plus que ça en pensant que ça pouvait pas être possible  :lol: )


Message édité par bjone le 26-06-2012 à 10:52:08
Reply

Marsh Posté le 26-06-2012 à 11:29:07    

Oulah!! Oui effectivement, je ne sais pas comment j'ai pu faire une recopie aussi mauvaise, mea culpa... :-/
Bon, je trouve la même chose maintenant après et avant translation... a savoir 0.
J'ai fais une exécution pas à pas et en faite à un moment on ajoute 24 au volume, et j'enlève 24 par la suite, ce qui donne 0. Par contre si on ajoutait deux fois 24, j'arriverais à un volume final = 48/6 = 8. Donc le volume exact de mon cube de côté 2. :-)
On se rapproche... donc c'est ici que doit intervenir le problème d'orientation je pense, non?

Reply

Marsh Posté le 26-06-2012 à 17:57:10    

Il y a des chances ;)

Reply

Marsh Posté le 27-06-2012 à 13:27:46    

J'ai finalement trouvé une autre solution, qui fait que je n'ai plus à réfléchir à un quelconque sens horaire ou anti-horaire... Pour une fois mon algo a marché du premier coup... :p
Merci tout de même pour votre aide! :-)

Reply

Marsh Posté le 27-06-2012 à 13:29:08    

Tu devrais le poster ici, pour que ça serve à qq'un d'autre ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 27-06-2012 à 15:34:48    

aure31 a écrit :

J'ai finalement trouvé une autre solution, qui fait que je n'ai plus à réfléchir à un quelconque sens horaire ou anti-horaire... Pour une fois mon algo a marché du premier coup... :p
Merci tout de même pour votre aide! :-)


A mon avis tu vas avoir des cas foireux que tu n'as pas imaginé ^^

Reply

Sujets relatifs:

Leave a Replay

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