(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): 4082
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): 4082
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
Hors Sujet !! les tutos de Moonboots    [1][2][3]...[22] 218 21508 Hier 16:17:44
moonboots 
Moteur de jeu GameBlender et alternatives [WIP] Godot Engine - Projet Arsenal    [1][2] 18 1277 22/10 16:38:22
Redstar 
Questions & Réponses Pousser le pc au max 3 126 22/10 11:07:37
xjoce 
Questions & Réponses [non résolu] Problème de vide 1 69 21/10 18:09:50
sapajou 
Le coin des geeks vitesse d'un rendu EEVEE Windows/Linux 4 82 21/10 18:01:09
sapajou 
[WIP] et travaux terminés [WIP] La gabarre '' Le Gros Ventre''    [1][2][3]...[10] 98 17635 21/10 15:53:58
Guiu 
Questions & Réponses Armature en IK sur squelette complexe 2 86 21/10 11:37:34
Thewada 
Questions & Réponses [résolu] Os et FBX 3 252 20/10 16:15:38
zeromeetsinfinity 
Moteur de jeu GameBlender et alternatives [non résolu] Cs (vaisseau)    [1][2][3]...[56] 559 170967 20/10 11:06:51
Redstar 
Questions & Réponses texture procédurale qui suis une plane 2 126 20/10 10:19:22
Many 
Questions & Réponses Vertex groups qui disparaissent 0 53 20/10 09:09:22
Melodicpinpon 
Questions & Réponses MeasureIt et dpi 4 938 20/10 09:02:36
jcnouveau 
Questions & Réponses De Maya vers Blender concordance de axes. 9 179 19/10 17:04:59
Bibi09 
Questions & Réponses [résolu] Enlever "snapping" dans la timeline ? 6 151 19/10 09:47:12
CBY 
[WIP] et travaux terminés [terminé] Appli Blender de Poche en FR    [1][2][3] 29 1304 18/10 19:14:29
moonboots 
Questions & Réponses Débutant Blender, temps de travail pour un rendu ? 2 125 18/10 11:37:55
Jalis 
Questions & Réponses [WIP] Dragster-Tracteur pour Bécassine    [1][2][3] 24 5811 17/10 18:37:48
Laorz 
Graphisme alternatif faire de la bd avec blender    [1][2][3]...[13] 123 9390 17/10 14:20:26
blend74 
Questions & Réponses Bug texture sur plane avec bevel 1 228 16/10 08:09:13
Laorz 
Questions & Réponses [terminé] Supprimer le lien d'un objet entre 2 scènes 4 12211 15/10 12:52:21
Horemheb 

Qui est en ligne
216 utilisateur(s) en ligne (dont 97 sur Forums)

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


EddyMje067, OmerGaunso, MariaDasil, CandiceShu, Clara48R6, ClarenceDh, KathieKmh4, MichaleMai, plus...
Nouveaux membres
CheryleJef 24/10/2021
AmandaSqu5 24/10/2021
TyroneDupu 24/10/2021
LeandraBlu 24/10/2021
ElwoodKiek 24/10/2021
BonitaLowm 24/10/2021
ElkeBlais3 24/10/2021
Clara48R6 24/10/2021
MariaDasil 24/10/2021
AlbertoCoz 24/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