(1) 2 »


Comparer 2 meshes - script python
OverdOzed
Inscrit:
17/07/2006 14:28
Post(s): 1032
Hello à tous

Je continue ma découverte de python

Le 2ème script que je voudrais faire: comparer 2 objets d'une scène, regarder si ils sont identiques, et dans ce cas, en faire des instances.

Cas concret: un .obj venant de maya avec 20 colonnes strictement identiques, mais reconnu dans blender comme des objets et meshs différents. L'intérêt serait d'en faire des instances pour alléger la scène.

Alors je pensais créer des listes de coordonnées des vertices et le comparer.

J'arrive à ma première question
Quand je regarde les vertices d'un simple cube créé dans une scène, je tombe sur ça:

bpy.data.meshes['Cube'].vertices[4].co
Vector((1.0000004768371582, 0.999999463558197, 1.0))


Ca ne tombe pas pile, c'est normal ?

Merci !!

Contribution le : 07/02/2017 11:19
Créer un fichier PDF de la contribution Imprimer


Re: Comparer 2 meshes - script python
OverdOzed
Inscrit:
17/07/2006 14:28
Post(s): 1032
Alors ça vient des floattans, je n'ai pas encore bien compris pourquoi, mais je vais découvrir cette nouvelle bizzarerie

Alors:

>>> 1 == 0.5 +0.5
True

>>> 0.6 == 0.4 + 0.2
False

>>> 0.4+0.2
0.6000000000000001



Ca vient de la virgule flottante.
https://fr.wikipedia.org/wiki/Virgule_flottante

Contribution le : 07/02/2017 11:38
Créer un fichier PDF de la contribution Imprimer


Re: Comparer 2 meshes - script python
OverdOzed
Inscrit:
21/08/2013 19:12
De CH [+]
Post(s): 1558
Ben ouais, c'est normal, comme tu dis ça vient des virgules flottantes...

L'une des règles concernant ces formats est qu'il ne faut "jamais" tester l'égalité de deux valeurs; au contraire, en général il est conseillé d'introduire un "epsilon", une petite tolérance.

Contribution le : 07/02/2017 12:53
_________________
BAddons, La Collection d'Addons de Matpi: https://github.com/qwenger/BAddons
Développeur Blender quand j'en ai le temps...

Créer un fichier PDF de la contribution Imprimer


Re: Comparer 2 meshes - script python
OverdOzed
Inscrit:
16/01/2011 17:05
De Le plus grand terrier du monde ! Et le plus high-tech.
Post(s): 4081
Typiquement, arrondi la valeur au millième (par exemple, plus si besoin) pendant la comparaison.

Contribution le : 07/02/2017 13:57
Créer un fichier PDF de la contribution Imprimer


Re: Comparer 2 meshes - script python
OverdOzed
Inscrit:
21/08/2013 19:12
De CH [+]
Post(s): 1558
Ah et si tu fais beaucoup de comparaisons spatiales, une structure style arbre KD pourrait bien économiser beaucoup de temps de calcul.

https://docs.blender.org/api/blender_python_api_current/mathutils.kdtree.html

Contribution le : 07/02/2017 15:00
_________________
BAddons, La Collection d'Addons de Matpi: https://github.com/qwenger/BAddons
Développeur Blender quand j'en ai le temps...

Créer un fichier PDF de la contribution Imprimer


Re: Comparer 2 meshes - script python
OverdOzed
Inscrit:
16/01/2011 17:05
De Le plus grand terrier du monde ! Et le plus high-tech.
Post(s): 4081
Bien vu Matpi, sinon des tests bruts à la chaîne risquent de très fortement brider les performances dès quelques milliers de vertices.

Contribution le : 07/02/2017 15:28
Créer un fichier PDF de la contribution Imprimer


Re: Comparer 2 meshes - script python
OverdOzed
Inscrit:
17/07/2006 14:28
Post(s): 1032
Cool, merci beaucoup lapineige et Matpi !

J'étudie tout cela attentivement !!

Contribution le : 07/02/2017 16:27
Créer un fichier PDF de la contribution Imprimer


Re: Comparer 2 meshes - script python
OverdOzed
Inscrit:
17/07/2006 14:28
Post(s): 1032
Hello

Alors j'ai relu 5 fois la page sur les KDTree utilities, et ça m'a paru un poil trop compliqué pour mon niveau de débutant J'y reviendrai dans quelques temps et ça sera sans doute plus clair

J'ai créé un ptit script simple, mais qui ne marche que si la transformation des objets n'est pas appliqué... Enfin il fonctionne et je suis déjà bien content, parce que j'ai bien lutté

import bpy

selection = bpy.context.selected_objects
nombre_objets = len (selection)
vertices = []
liste = {}

### Calcule le nombre de vertices dans l'objet ###
for n in range (0, nombre_objets):
    n_vertices = len(selection[n].data.vertices)
              
### Crée la liste des coordonnées des vertices par objet ###
    for v in range (0, n_vertices):
        vertices.append ([selection[n].data.vertices[v].co[0], selection[n].data.vertices[v].co[1], selection[n].data.vertices[v].co[2]])
    liste[n]=vertices
    vertices =[]

### Compare les meshes et crée une instance si ils sont identiques###
for n in range (0, nombre_objets):
    for m in range (0, nombre_objets):
        if liste[n] == liste[m] and n!=m:
            selection[n].data = selection[m].data

print("biiiiiiiiiiiiiim")


Le blend si vous voulez tester:
http://pasteall.org/blend/index.php?id=45472

Merci encore pour votre aide Matpi et lapineige !

Contribution le : 08/02/2017 15:13
Créer un fichier PDF de la contribution Imprimer


Re: Comparer 2 meshes - script python
OverdOzed
Inscrit:
21/08/2013 19:12
De CH [+]
Post(s): 1558
Pas mal pour un premier jet. Par contre le test

        if liste[n] == liste[m]


est probablement un peu simpliste: il suffirait que les vertices soient très légèrement décalées (virgules flottantes, hein!) ou dans un ordre différent pour que ça foire. Tant que tes colonnes sont "strictement identiques", ça va.

(et accessoirement tu ne testes que la position des vertices, pas les edges/faces)

Contribution le : 08/02/2017 16:57
_________________
BAddons, La Collection d'Addons de Matpi: https://github.com/qwenger/BAddons
Développeur Blender quand j'en ai le temps...

Créer un fichier PDF de la contribution Imprimer


Re: Comparer 2 meshes - script python
OverdOzed
Inscrit:
17/07/2006 14:28
Post(s): 1032
Merci Matpi pour ton message !

Oui en effet, ça n'est pas du tout précis encore comme script

Je vais essayer maintenant de comparer la surface et le volume des objets, ça devrait donner plus de précision.

J'ai créé ce petit script pour calculer la surface et le volume d'un objet:


import bpy
import bmesh

obj = bpy.context.active_object

### Calcule la surface d'un objet ###
def surface (obj):
    bm = bmesh.new()
    bm.from_mesh(obj.data)

    area = sum(f.calc_area() for f in bm.faces)
            
    bm.free()
    
    return area

### Calcule le volume d'un objet ###
def volume (obj):
    bm = bmesh.new()
    bm.from_mesh(obj.data)

    volume = bm.calc_volume()
        
    bm.free()
    
    return volume

### Imprime la surface et le volume ###
print ('la surface de ce truc est : ' + str(round(surface(obj),5)))
print ('le volume de ce machin est : ' + str(round(volume(obj),5)))



Je vais rajouter ça à mon code déjà existant

Contribution le : 14/02/2017 18:06
Créer un fichier PDF de la contribution Imprimer



 Haut   Précédent   Suivant
(1) 2 »




Enregistrer votre réponse
Compte*
Nom   Mot de passe   Authentification
Message:*



[Recherche avancée]



Sujets récemment répondus
Forums Sujets Réponses Lus Dernières contributions
[WIP] et travaux terminés [terminé] Appli Blender de Poche en FR    [1][2] 17 720 Hier 13:21:48
Bibi09 
Questions & Réponses [terminé] Supprimer le lien d'un objet entre 2 scènes 4 49 Hier 12:52:21
Horemheb 
Questions & Réponses Blender kit : barre d'assets 0 25 Hier 09:26:52
Sphere3d 
Questions & Réponses MeasureIt et dpi 3 55 Hier 08:39:25
Cdric 
Questions & Réponses Comment faire la symétrie d’une multitude d’éléments.    [1][2] 13 601 14/10 23:35:18
meltingman 
Moteur de jeu GameBlender et alternatives [non résolu] Cs (vaisseau)    [1][2][3]...[56] 556 170131 14/10 21:57:38
sbkodama 
Hors Sujet !! les tutos de Moonboots    [1][2][3]...[22] 213 20767 14/10 12:21:54
moonboots 
Questions & Réponses Conversion courbe 1 54 13/10 16:59:40
moonboots 
Moteur de jeu GameBlender et alternatives [non résolu] Godot Engine - Projet Arsenal    [1][2] 15 973 13/10 16:14:33
Redstar 
Questions & Réponses MeasureIt et dpi 0 696 13/10 13:10:10
Cdric 
Graphisme alternatif faire de la bd avec blender    [1][2][3]...[13] 122 8639 12/10 18:53:16
blend74 
Moteur de jeu GameBlender et alternatives hARMful engine    [1][2][3]...[9] 86 26460 12/10 17:38:03
Bibi09 
Questions & Réponses magie vaudou :)    [1][2] 17 538 12/10 13:24:04
blend74 
Questions & Réponses Couleur étrange en sculpt mode 2 101 12/10 13:07:46
Arielboid 
Graphisme alternatif les addons pour blender : bumarin etc    [1][2] 16 1171 11/10 14:50:16
blend74 
Questions & Réponses Opacité texture PNG 9 220 11/10 13:50:10
Bibi09 
Questions & Réponses [résolu] (animation) Avoir des layers de keyframe ? 7 254 10/10 20:03:35
PounchPounch 
Le coin des geeks Changer la carte graphique    [1][2] 13 591 09/10 23:28:09
sapajou 
Questions & Réponses [non résolu] Squelette qui devient une boule de polygone lors de l'import sur Mixamo 1 34674 09/10 01:33:48
blend74 
Questions & Réponses Bug texture sur plane avec bevel 0 119 08/10 18:29:17
artstation13 

Qui est en ligne
307 utilisateur(s) en ligne (dont 87 sur Forums)

Membre(s): 8
Invité(s): 299


Ignacio534, Josefa8811, PaulaMarte, ChristenCr, AllisonBoi, DonnyMckin, BillyMcLau, EstherLin3, plus...
Nouveaux membres
HayleyBugg 16/10/2021
MaeCriswel 16/10/2021
BarbaraDjm 16/10/2021
RafaelBly 16/10/2021
Leonel10K 16/10/2021
JaymeDun23 16/10/2021
OtiliaSimm 16/10/2021
JulietS586 16/10/2021
MarcosL68 16/10/2021
Camille034 16/10/2021
Dernier Ajout
2020-09-24.jpg

Evènements à venir
Nov 18
Anniversaire de RichDeg
Dec 29
Anniversaire d'ebrain
Jan 8
BUG de Lyon
plus 247 plus d'élément(s)
 Par Mickaël Guédon [ebrain] © 2003-2021 The Blender Clan - hébergé par TuxFamily - Site déclaré à la CNIL sous le numéro 1155445