(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
Hors Sujet !! les tutos de Moonboots    [1][2][3]...[25] 241 25186 Hier 21:56:30
moonboots 
The Blender Clan 'tchat Folle souris 0 24 Hier 20:48:46
Rimpotche 
Questions & Réponses [résolu] Ngons 6 81 Hier 19:00:13
Rimpotche 
Questions & Réponses [WIP] animatique vers projet réél : comment concilier les fichiers ? 4 145674 30/11 21:38:43
doudoulolita 
Questions & Réponses debutant- engrenage en pointe    [1][2] 10 350 30/11 19:19:47
CBY 
Moteur de jeu GameBlender et alternatives [WIP] Godot Engine - Projet Arsenal    [1][2][3] 22 2340 30/11 17:02:47
Redstar 
Questions & Réponses Raccourcis clavier qui ne marchent plus v 2.93.4 1 120 30/11 16:34:14
Redstar 
Questions & Réponses [résolu] Fusion 360 - recherche d'un connaisseur 1 165 30/11 16:31:30
Redstar 
Questions & Réponses Solution rendu saccade    [1][2] 17 389 30/11 08:08:02
CBY 
The Blender Clan 'tchat ANNONCE IMPORTANTE : LE BLENDER CLAN REOUVRE !! Etat des lieux sur le présent et le futur :)    [1][2][3] 22 64792 30/11 07:53:41
smogBlender 
Graphisme alternatif faire de la bd avec blender    [1][2][3]...[13] 125 11682 29/11 16:33:17
blend74 
Moteur de jeu GameBlender et alternatives [WIP] DeadSigns FPS Unity - Version alpha disponible + discord    [1][2][3]...[68] 673 152434 29/11 00:26:07
Hook 
Questions & Réponses [résolu] Découper un objet selon un autre 4 176 28/11 18:51:31
mamain83 
Questions & Réponses X-Ray uniquement en mode Solid 2 105 28/11 12:15:45
Horemheb 
Questions & Réponses Texture baké devient noir    [1][2] 14 240 27/11 07:58:33
moonboots 
The Blender Clan 'tchat Conseil pour débutante 4 420 25/11 16:24:59
Ksuhma 
Questions & Réponses Récupérer la couleur en sortie de shader 8 242 25/11 09:33:29
bibi 
Questions & Réponses Peut-on entrer les coordonnées du point visé de la caméra ? 4 190 24/11 19:16:16
CBY 
Questions & Réponses [résolu] snap fixe sur les cm ou mm 2 158 24/11 17:47:40
mamain83 
The Blender Clan 'tchat [abandonné] Clavier Corsair K55 RGB Pro / Raccourcis clavier    [1][2] 14 541 21/11 19:46:01
CBY 

Qui est en ligne
115 utilisateur(s) en ligne (dont 49 sur Forums)

Membre(s): 3
Invité(s): 112


EdmundCast, CarmellaOb, GwendolynT, plus...
Nouveaux membres
TwylaFerni 1/12/2021
LorieFerry 1/12/2021
KarolinBay 1/12/2021
TandyColso 1/12/2021
LeathaMick 1/12/2021
KaiAnderto 1/12/2021
JewelMcCul 1/12/2021
WildaBasty 1/12/2021
KatherinIr 1/12/2021
HaleyValad 1/12/2021
Dernier Ajout
2020-09-24.jpg

Evènements à venir
Dec 29
Anniversaire d'ebrain
Jan 8
BUG de Lyon
Fev 15
Anniversaire de Dany
plus 246 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