algo calcul de volume objet 3d - VB/VBA/VBS - Programmation
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.
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 ?)
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?
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
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.
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
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?
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.
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ù... :-/
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 )
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?
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...
Merci tout de même pour votre aide! :-)
Marsh Posté le 27-06-2012 à 13:29:08
Tu devrais le poster ici, pour que ça serve à qq'un d'autre
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... |
A mon avis tu vas avoir des cas foireux que tu n'as pas imaginé ^^
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:
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:
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?