Python - Houdini to Blender

Ici on parle des scripts

Modérateurs : frez, Yadoob, stilobique, Matpi, ModSquad

Python - Houdini to Blender

Message par Akelian » 26 Fév 2016, 16:21

=============================================== EDIT
Bon j'ai finalement mergé les deux scripts cité ci dessous et ça marche plutot bien pour mes besoins sur un projet actuel donc je partage. Je vais faire une interface quand j'aurais le temps de me pencher dessus mais voila l'idée, ne modifier que ce qui est entre "#MODIFIER ICI".
En gros il convertit directement une sequence d'obj depuis houdini (que des tris je le rappel) et fichier gzip binaire compatible avec le systeme de fluide de blender (j'entend par là le cache rien d'autre.)

Voila le script:
Code : Tout sélectionner
import bpy
import struct
import gzip
import mathutils
from bpy.props import *

######################################## VOS INFOS #####################################

framestart = 1
frameend = 300
filepath = "/LE/CHEMIN/DU/DOSSIER" #Dossier contenant les objs
filename = "monkey_fluid_" #Prefixe de la sequence obj


#######################################################################################

#LE RESTE NE DOIT PAS CHANGER.
objectscale = 1 # Test
filesource = filepath + filename
print (filesource)

for i in range(framestart,frameend):
    mystring = str(i)
    mypadstring = "{0:0>4}".format(mystring) #{0:0>4} le 4 definit le padding (####)

    bpy.ops.import_scene.obj (filepath = filesource+mypadstring+".obj", axis_forward='X', axis_up='Y', filter_glob="*.obj;*.mtl", use_edges=True, use_smooth_groups=True, use_split_objects=True, use_split_groups=True, use_groups_as_vgroups=False, use_image_search=True, split_mode='ON', global_clamp_size=0)
    curObject = bpy.context.selected_objects[0]
    curObject.scale = [objectscale,objectscale,objectscale]
    bpy.ops.object.transform_apply(scale=True)

    myFileNamePost = ".bobj"
    myFileComplete = filepath+"fluidsurface_final_"+mypadstring+myFileNamePost
    myfile = gzip.open(myFileComplete+".gz","wb")               # ouvre l'obj dans Blender. 'wb' veut dire "write binary" et nous permet donc d"ecrire un fichier binaire

    myNumVerts = 0                                              # Le nombre de Vertex de l'objet. Initialisation à 0 en debut de loop.
    myNumPolys = 0                                              # Le nombre de Polygones de l'objet. Initialisation à 0 en debut de loop.
    myVertsPos = []                                             # Liste de la position des Vertex
    myVertNormals = []                                          # Liste des normales des Vertex
    myPolyVerts = []                                            # Liste de toute les vertex que possede chaque polygone.

    myVerts = curObject.data.vertices                           # Recupere toute les vertex du mesh
    myPolys = curObject.data.polygons                           # Recupere tout les polygones du mesh
   
    myNumVerts = len(myVerts)
    myNumVertsStruct = struct.pack("i",myNumVerts)
   
    myfile.write(myNumVertsStruct)
    for i in range(myNumVerts):                                 # Loop toute les vertex et recupere leur position XYZ
        #myVertsPos.extend((myVerts[i].co[0],myVerts[i].co[1],myVerts[i].co[2]))
        myVertsPosStruct = struct.pack("fff", myVerts[i].co[0],myVerts[i].co[1],myVerts[i].co[2]) # Sauvegarde la position des vertex en binaire. "fff"
                                                                                                  # precise qu'il s'agit d'un vecteur (Trois foats)
        myfile.write(myVertsPosStruct)                         # Ecrit ces infos dans le fichier
    #print ("Vertex Positions")
    #print (myVertsPos)

    myfile.write(myNumVertsStruct)                              # Ecrit le nombre de point total dans le meshs dans le fichier binaire, le systeme de cache de fluid ne marche pas sans ca.

    for i in range(myNumVerts):                                 # Comme le premier loop mais pour les normales
        myVertNormals.extend((myVerts[i].normal[0],myVerts[i].normal[1],myVerts[i].normal[2]))
        myVertNormalsStruct = struct.pack("fff", myVerts[i].normal[0],myVerts[i].normal[1],myVerts[i].normal[2])
        myfile.write(myVertNormalsStruct)
    #print("VertexNormals")
    #print (myVertNormals)

    myNumPolys = len(myPolys)                                   # le nombres de polygones
    myNumPolysStruct = struct.pack("i", myNumPolys)             # le nombre de polygones en binaire. le "i" de struct.pack signifie que c'est un integer
    #print("Number of Polygons:")
    #print (myNumPolys)
    myfile.write(myNumPolysStruct)                              # Ecrit le nombre de polygones

    for i in range(myNumPolys):                                 # Recupere le numero des vertex.
        myPolyVerts.extend((myPolys[i].vertices[0],myPolys[i].vertices[1],myPolys[i].vertices[2]))
        myPolyVertsStruct = struct.pack("iii", myPolys[i].vertices[0],myPolys[i].vertices[1],myPolys[i].vertices[2])
        myfile.write(myPolyVertsStruct)
    #print ("Vertices making up the Polygons:")
    #print (myPolyVerts)

    myfile.close
    bpy.ops.object.delete()



Petit Test:
Image




=============================================== EDIT FIN

Salut tout le monde.

Bon je vous explique la situation.
Je bosse beaucoup sur Houdini et je me suis mis que très recemment à chercher un bridge avec blender.
Les options que j'ai testés et qui marchent:

LE CAS OU LE NOMBRE DE POINTS EST INCHANGE (cloth*, soft body...)
Le format MDD passe très bien entre Houdini et Blender, il faut se mettre en Left Handed pour que les objets arrivent dans le bon sens.
Dans Houdini ROP>MDD Cache.

LE CAS OU LE NOMBRE DE POINTS CHANGE (destructions, Dechirement de cloth, fluides...)
Dans ce cas là et c'est l'origine de mon post, j'ai trouvé une solution plutot mortel.

Le concept general:
1-Exporter le mesh depuis Houdini en sequence d'obj (que des tris pas de quads).
2-Importer toute les frames dans 1 seul blend (j'ai été agréablement surpris de la réactivité de Blender parceque sur le papier j'y croyais pas du tout)
3-Convertir chaque obj en frame de cache fluid.
http://blenderartists.org/forum/showthread.php?388297-Addon-Object-Sequence-to-Fluidsim-Cache-exporter
4-Voila vous avez un blend super reactif avec une grosse simulation Houdini.


Donc bon ça marche super bien mais mon workflow est super fastidieux.
En gros j'ai ce script pour importer chaque obj:

Code : Tout sélectionner
import bpy
framestart = 1
frameend = 130
filepath = "/Volumes/user/monkey/obj_seq/" #Dossier contenant les objs
filename = "monkey_fluid_" #Prefixe de la sequence
filesource = filepath + filename
objectname = "Monkey.000" #Nom dans Blender
objectscale = 1 # Test

print (filesource)

for i in range(framestart,frameend):
    mystring = str(i)
    mypadstring = "{0:0>4}".format(mystring) #{0:0>4} le 4 definit le padding (####)
   
    bpy.ops.import_scene.obj (filepath = filesource+mypadstring+".obj", axis_forward='X', axis_up='Y', filter_glob="*.obj;*.mtl", use_edges=True, use_smooth_groups=True, use_split_objects=True, use_split_groups=True, use_groups_as_vgroups=False, use_image_search=True, split_mode='ON', global_clamp_size=0)
    bpy.context.selected_objects[0].name = objectname
    bpy.context.selected_objects[0].scale = [objectscale,objectscale,objectscale]
    bpy.ops.object.transform_apply(scale=True)


J'aimerais me faire un panel, ou mieux une fenetre flottante si c'est possible dans BL avec les variables filename, filepath etc.
Mais c'est la que je sêche, je n'arrive pas a recuperer une variable d'une panel, ni a faire une fonction dans BL. J'ai aussi du mal a comprendre ces histoires de register.
Si quelqu'un pouvait filer un coup de main ce serait top.
Dernière édition par Akelian le 26 Fév 2016, 20:27, édité 2 fois.
Avatar de l’utilisateur
Akelian
 
Message(s) : 112
Inscription : 04 Mai 2015, 11:48

Re: Python - Recuperer la valeur d'un Panel

Message par cedric » 26 Fév 2016, 16:31

As-tu essayé le bridg de mifth sur BA ?

http://blenderartists.org/forum/showthr ... ht=houdini

Ce n'est pas vraiment ce que tu cherches mais ça devrait t'aider.
Cédric Lepiller, Freelance 3D Pitiwazou.com, Mes Addons, Asset Management, Speedflow
Avatar de l’utilisateur
cedric
Administrateur
 
Message(s) : 7049
Inscription : 03 Août 2013, 21:36

Re: Python - Recuperer la valeur d'un Panel

Message par Akelian » 26 Fév 2016, 17:49

Pas vraiment oui, lui c'est plus un espece de GoZ, je n'en ai pas vraiment l'utilité. Ce que je cherche c'est un moyen d'utiliser Houdini sur des projets Blender/Cycles. En attendant l' Alembic (je crois avoir vu que ca avancait pas mal) c'est la meilleure solution que j'ai trouvé pour des simulations de fluides qui ne plombent pas la scene. J'aurais voulu streamliné le tout.
HS total : Je viens de choper Pie Menu Editor c'est une tuerie
Avatar de l’utilisateur
Akelian
 
Message(s) : 112
Inscription : 04 Mai 2015, 11:48

Re: Python - Recuperer la valeur d'un Panel

Message par cedric » 26 Fév 2016, 17:56

Oui, il a l'air terrible cet addon.

Après, je crois qu'on ne peut pas injecter de code perso pour le moment.
Cédric Lepiller, Freelance 3D Pitiwazou.com, Mes Addons, Asset Management, Speedflow
Avatar de l’utilisateur
cedric
Administrateur
 
Message(s) : 7049
Inscription : 03 Août 2013, 21:36

Re: Python - Recuperer la valeur d'un Panel

Message par pistiwique » 26 Fév 2016, 18:05

Ce que tu cherches c'est créer un panel avec une"case" pour récupérer le chemin du fichier et d'autres pour y entrer tes différentes valeur comme framestart, frameend ects c'est ça ?
Pour une fenêtre flottante, je ne crois pas que tu puisses directement via blender mais en passant par PyQt comme l'a fait VincentG, c'est possible...... et ça me donne envie d'essayer mais pas le temps pour l'instant.... :shock:
Ho mon dieu ! Je suis possédé par Lapi :lol:
Avatar de l’utilisateur
pistiwique
 
Message(s) : 590
Inscription : 10 Août 2014, 10:35
Localisation : le sud ou il fait trop chaud

Re: Python - Recuperer la valeur d'un Panel

Message par Akelian » 26 Fév 2016, 18:35

Yes pisti c'est exactement ce que je recherche.
Je viens de me rendre compte de la débilité du workflow... Je suis en train de merger les deux scripts pour ne pas avoir à importer d'abord les obj puis les rendre en fluid cache.
Je poste le resultat ici quand j'ai fini.

Sinon Cedric, oui tu peux "injecter" du code, tu peux du coup faire ce que tu veux en layout.
Je me suis fait un pie très proche du menu click droit de zbrush (color picker, petite brosses en dessus avec icones cstoms, intensite etc etc)

C'est incroyablement facile à mettre en place imaginons que tu sois en train de bosser et que tu veux modifier un pie vite fait ou t'en créer un pour un truc spécifique, ça prend 10mn max...
Si toute l'UI fonctionnait comme ça....
Avatar de l’utilisateur
Akelian
 
Message(s) : 112
Inscription : 04 Mai 2015, 11:48

Re: Python - Recuperer la valeur d'un Panel

Message par cedric » 26 Fév 2016, 18:41

Faudrait que je l’achète pour tester, mais oui ça a l'air vraiment puissant !
Faire les pie menus à la main c'est long et fastidieux.
Cédric Lepiller, Freelance 3D Pitiwazou.com, Mes Addons, Asset Management, Speedflow
Avatar de l’utilisateur
cedric
Administrateur
 
Message(s) : 7049
Inscription : 03 Août 2013, 21:36

Re: Python - Houdini to Blender

Message par Akelian » 26 Fév 2016, 20:47

C'est bizare je trouve très peu d'infos concernant le bridge des deux.
La solution que j'ai édité post#1 est pour l'instant la meilleur que j'ai pu essayer
Avatar de l’utilisateur
Akelian
 
Message(s) : 112
Inscription : 04 Mai 2015, 11:48

Re: Python - Houdini to Blender

Message par lapineige » 27 Fév 2016, 13:48

pistiwique a écrit :Ho mon dieu ! Je suis possédé par Lapi :lol:

Ou par l'API :mrgreen:

VincentG a effectivement fait quelques trucs avec PyQt.
Mon terrier/blog: https://lapineige.fr/wp (l'ancien: le-terrier-de-lapineige.over-blog.com) | Mon GitHub: https://github.com/lapineige/Blender_add-ons | Lapineige's Tools: http://cgcookiemarkets.com/blender/all- ... ompilation
Avatar de l’utilisateur
lapineige
 
Message(s) : 3716
Inscription : 25 Juin 2014, 07:06


Retour vers Scripts - Python - OSL

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 0 invité(s)