(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): 4080
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): 4080
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
Questions & Réponses Vitesse d'une vidéo 5 145 Aujourd'hui 00:59:51
Lylo 
Hors Sujet !! les tutos de Moonboots    [1][2][3]...[26] 257 30224 Aujourd'hui 00:28:17
moonboots 
Hors Sujet !! Le champilutin - tutoriel débutant - low polygone 0 8 Hier 23:15:31
meltingman 
Questions & Réponses Objets sur aucun 'View layer' 1 22 Hier 20:43:59
Rimpotche 
Questions & Réponses [résolu] Matériau partiellement transparent 7 87 Hier 20:16:21
meltingman 
The Blender Clan 'tchat W10 pour le prix d'une cacahuète    [1][2][3] 23 471 22/01 17:29:47
Bibi09 
[WIP] et travaux terminés [WIP] La pince à linge    [1][2] 11 259 21/01 18:53:10
meltingman 
Hors Sujet !! Tuto Astraonaute low-poly + rigify en 25mm 3 201 21/01 14:47:47
meltingman 
Questions & Réponses Texture et courbe de Bézier 9 192 21/01 14:19:10
Horemheb 
Questions & Réponses freestyle lineset : ignorer un objet spécifique pour une arrête cachée 0 140260 21/01 08:56:34
yekcim 
[WIP] et travaux terminés Pagani Zonda Barchetta 6 232 20/01 09:03:37
moonboots 
[WIP] et travaux terminés [WIP] La gabarre '' Le Gros Ventre''    [1][2][3]...[12] 112 22259 19/01 17:57:26
Guiu 
Questions & Réponses chemins suivant une déformation de surface 6 178 19/01 12:26:50
meltingman 
Questions & Réponses Armature sans parenté? 1 92 18/01 19:38:25
meltingman 
The Blender Clan 'tchat Avenir du blender clan    [1][2][3]...[41] 405 49131 17/01 20:40:59
Rimpotche 
Questions & Réponses texture eyes avec empty 1 97 17/01 13:17:33
Rimpotche 
The Blender Clan 'tchat Progression dans Blender et la 3D    [1][2] 11 578 16/01 17:37:45
Rimpotche 
Questions & Réponses [terminé] Modificateur Mirror sur un Vertex Group 2 140 16/01 15:55:36
Horemheb 
Questions & Réponses Ma caméra me saoule... 5 262 15/01 20:33:23
Lylo 
Hors Sujet !! Appareil Photo Compact, qualité, zoom...    [1][2] 19 539 14/01 14:45:17
lucky 

Qui est en ligne
231 utilisateur(s) en ligne (dont 98 sur Forums)

Membre(s): 1
Invité(s): 230


PaulineLil, plus...
Nouveaux membres
BlondellGa 2/1/2022
EileenTomk 2/1/2022
RamonaDahl 2/1/2022
SashaBeals 2/1/2022
TroyLightn 2/1/2022
PhillippBu 2/1/2022
LesterHida 2/1/2022
PansyHolm 2/1/2022
YukikoMitt 2/1/2022
Randall318 2/1/2022
Dernier Ajout
2020-09-24.jpg

Evènements à venir
Fev 15
Anniversaire de Dany
Fev 19
Anniversaire de APPGirault123
Fev 23
anniversaire de windspirit
plus 244 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