Jump to content

Atom

Members
  • Content count

    3,396
  • Donations

    0.00 CAD 
  • Joined

  • Last visited

  • Days Won

    116

Everything posted by Atom

  1. One way to avoid substeps with fast moving sources is to create a trail and submit the trail, along with the lead, as the source. This can help fill in the gaps.
  2. Try deleting the Output node. When an output node is present, it is assumed that is the final output, regardless of the Display flag. Most of the time, you want that in an HDA so it always functions, even if you forget to move the flag before saving it.
  3. Hi All, I put together a small shelf tool that populates a subnet with an object for each .bgeo.sc file found in a supplied folder path. The end goal was to leverage s@instance for file based objects. s@instance can only reference objects, not disk files. In this hard coded example file I am fetching 144 debris shards into 144 geometry objects which instancing can reference. # Populates an existing subnet with a geometry node for each file found in the supplied folder. # The File node inside the default geometry node is populated with the filename from the folder. # The end result is you get an object for each disk object in a folder. import os, re def returnValidHoudiniNodeName(passedItem): # Thanks to Graham on OdForce for this function! # Replace any illegal characters for node names here. return re.sub("[^0-9a-zA-Z\.]+", "_", passedItem) def returnFilesLike(passedFolderName, passedFileExtension = ".obj"): result = [] for file in os.listdir(passedFolderName): if file.endswith(passedFileExtension): result.append(os.path.join(passedFolderName,file)) return result def createSubnetOfFileNodes(passedPath, passedType): root = hou.node("/obj/geo_debris_container") # Make sure it exists before running, choose your own name. if root != None: lst_files = returnFilesLike(passedPath, passedType) if len(lst_files): for i,file in enumerate(lst_files): # Create a file node for each geometry in our list. local_name = os.path.basename(file) local_name_only = os.path.splitext(local_name)[0] geo_name = returnValidHoudiniNodeName("geo_%s" % local_name_only) geo_name = geo_name.replace(".","_") node_geo = root.createNode("geo", geo_name) if node_geo: # The first child is a default File node. n = node_geo.children()[0] if n: # Assign this filename as the filepath for this file node. n.parm("file").set(file) else: print "No subnet container found to contain generated results." createSubnetOfFileNodes ("F:/Keep/Models/Rocks/debris_sharp",".bgeo.sc")
  4. Copy stamp

    Try typing the word "orient" into the search field of this forum. This is a common topic.
  5. what do you eat to be a vfxtd?

    Coffee and candy, constantly.
  6. Try animating the Fire Intensity Scale on the Look tab of the pyrosolver. Animate the value from 0 to 15.
  7. FLIP FLUID Mesh penetrates surface

    What? you want a flat edge on the cube sides? Just boolean the sides flat.
  8. It looks like all the color information is in the FBX file. The Cd attribute is assigned to the vertex context.
  9. evaluating display flag in OBJ level

    I think you can use the companion get function for that. import hou box1 = hou.node('/obj/box1') box2 = hou.node('/obj/box2') box1.setDisplayFlag(box2.getDisplayFlag())
  10. python code in a shelf buttom

    It works for me, but the error tells you what is wrong. A node in the selection was removed somewhere during the process. Try testing to make sure p is not None before trying to fetch the keyframes.
  11. evaluating display flag in OBJ level

    In almost all coding languages, a "flag" is considered to be a boolean value, or an integer that is 1 or 0. Try passing a number instead of a string. box2.setDisplayFlag(1)
  12. About redshift node types (python)

    have you tried print tex.type() to see what is actually being passed through?
  13. How to Approach Small Scale FLIP Sim

    I think that's what fluid particles can be used for. Check out Lewis' video and example file here.
  14. Delete random points from each copy

    Try using switch which randomly supplies one of the pre-deleted versions of you source.
  15. Houdini fire timing is off

    Looks like a bug in Cinema eh? It might be units related. Do you scale anything when you move between apps?
  16. Hi All, Houdini just crashed and when I open up the old version of my scene I can no longer turn off any Display flags? Houdini reports Permission Denied? What the heck does this mean? How do I get rid of this unwanted functionality?
  17. MTL To Redshift Material

    Make sure you set n=0, if you modify the paths under that IF statement. You need to modify both variables, they are matched. One path points to the folder where the textures reside and the other points directly to the . MTL you want to process.
  18. Heightfield Texture from Geo

    Drop down a height field output node and read the help card. I think you can output to texture with that.
  19. FLIP volume loss: water wheel

    Here's my tweak of your scene. I basically reset everything to the defaults. ap_water_wheel_v_01.hiplc
  20. Programmatically layout/home nodes ?

    There is a method for a node called moveToGoodPosition(). It's available through python, but probably in the HDK as well. You should call it for each new node created. It's like pressing the L-KEY in the network view.
  21. Strange water simulation

    Fluid from object is a one-shot fluid generator. You probably want to try the Emit Particle Fluid button instead.
  22. I created a short python script to help out with the excessive nodes that are presented when importing detailed FBX files. My example is a vehicle with 278 object nodes referencing 37 materials inside the materials subnet generated by the import. This script scans the materials subnet and creates a new object level geo for each material it finds. Inside this new geo node it creates an ObjectMerge node and populates the node with all object references to the FBX material. It assigns the new material to this new geo node that points to /shop instead of the FBX materials subnet. Then it reviews the FBX materials and creates a new Redshift material for each FBX material detected. It scans the FBX Surface node and extracts a few parameters like diffuse color, specular etc... The net result is that I only have 37 nodes to manage instead of 278 after running the script. Also my nodes have Redshift placeholder materials assigned so I can get right to rendering. Add this code to a new shelf button and adjust the paths, at the bottom of the script, to point to your FBX subnet. The texture path is not really used at this time. # Scan a FBX subnet for materials. # Create a geo object with an object merge for each object that references the material. # Create a place holder Redshift material by reviewing the FBX materials in the subnet. # Atom 08-22-2018 # 10-14-2018 import hou, os, re def returnValidHoudiniNodeName(passedItem): # Thanks to Graham on OdForce for this function! # Replace any illegal characters for node names here. return re.sub("[^0-9a-zA-Z\.]+", "_", passedItem) def createRedshiftImageMapMaterial(passedSHOP, passedImageFilePath, passedName, passedDiffuse=[0,0,0], passedSpecular=[0,0,0], passedWeight=0.1, passedRoughness=0.23, passedIOR=1.0, passedOpacity=1.0): #print "->%s [%s] [%s]" % (passedSHOP, passedImageFilePath, passedName) rs_vop = hou.node(passedSHOP).createNode("redshift_vopnet",passedName) if rs_vop != None: rs_output = hou.node("%s/%s/redshift_material1" % (passedSHOP, passedName)) # Detect the default closure node that should be created by the redshift_vopnet. if rs_output != None: # Create. rs_mat = rs_vop.createNode("redshift::Material","rs_Mat") if rs_mat != None: # Set passed values. rs_mat.parm("diffuse_colorr").set(passedDiffuse[0]) rs_mat.parm("diffuse_colorg").set(passedDiffuse[1]) rs_mat.parm("diffuse_colorb").set(passedDiffuse[2]) rs_mat.parm("refl_colorr").set(passedSpecular[0]) rs_mat.parm("refl_colorg").set(passedSpecular[1]) rs_mat.parm("refl_colorb").set(passedSpecular[2]) rs_mat.parm("refl_weight").set(passedWeight) rs_mat.parm("refl_roughness").set(passedRoughness) if passedIOR ==0: # A zero based IOR means activate mirror mode for the reflection section. rs_mat.parm("refl_fresnel_mode").set("1") rs_mat.parm("refl_brdf").set("1") rs_mat.parm("refl_reflectivityr").set(0.961998) rs_mat.parm("refl_reflectivityg").set(0.949468) rs_mat.parm("refl_reflectivityb").set(0.91724) rs_mat.parm("refl_edge_tintr").set(0.998643) rs_mat.parm("refl_edge_tintg").set(0.998454) rs_mat.parm("refl_edge_tintb").set(0.998008) rs_mat.parm("refl_samples").set(128) rs_mat.parm("diffuse_weight").set(0) else: rs_mat.parm("refl_ior").set(passedIOR) rs_mat.parm("opacity_colorr").set(passedOpacity) rs_mat.parm("opacity_colorg").set(passedOpacity) rs_mat.parm("opacity_colorb").set(passedOpacity) rs_tex = rs_vop.createNode("redshift::TextureSampler",returnValidHoudiniNodeName("rs_Tex_%s" % passedName)) if rs_tex != None: # Wire try: rs_output.setInput(0,rs_mat) can_continue = True except: can_continue = False if can_continue: if passedImageFilePath.find("NOT_DETECTED")==-1: # Only plug in texture if the texture map was specified. rs_mat.setInput(0,rs_tex) # input #0 is diffuse color. extension = os.path.splitext(passedImageFilePath)[1] files_with_alphas = [".png",".PNG",".tga",".TGA",".tif",".TIF",".tiff",".TIFF",".exr",".EXR"] if extension in files_with_alphas: # Place a sprite after the rsMaterial to implment opacity support. rs_sprite = rs_vop.createNode("redshift::Sprite",returnValidHoudiniNodeName("rs_Sprite_%s" % passedName)) if rs_sprite != None: rs_sprite.parm("tex0").set(passedImageFilePath) # set the filename to the texture. rs_sprite.parm("mode").set("1") rs_sprite.setInput(0,rs_mat) rs_output.setInput(0,rs_sprite) #rs_mat.setInput(46,rs_tex) # input #46 is opacity color (i.e. alpha). rs_tex.parm("tex0").set(passedImageFilePath) # set the filename to the texture. # Remove luminosity from texture using a color corrector. rs_cc = rs_vop.createNode("redshift::RSColorCorrection",returnValidHoudiniNodeName("rs_CC_%s" % passedName)) if rs_cc != None: rs_cc.setInput(0,rs_tex) rs_cc.parm("saturation").set(0) # Add a slight bump using the greyscale value of the diffuse texture. rs_bump = rs_vop.createNode("redshift::BumpMap",returnValidHoudiniNodeName("rs_Bump_%s" % passedName)) if rs_bump != None: rs_bump.setInput(0,rs_cc) rs_bump.parm("scale").set(0.25) # Hard coded, feel free to adjust. rs_output.setInput(2,rs_bump) # Layout. rs_vop.moveToGoodPosition() rs_tex.moveToGoodPosition() rs_cc.moveToGoodPosition() rs_bump.moveToGoodPosition() rs_mat.moveToGoodPosition() rs_output.moveToGoodPosition() else: print "problem creating redshift::TextureSampler node." else: print "problem creating redshift::Material node." else: print "problem detecting redshift_material1 automatic closure." else: print "problem creating redshift vop net?" def childrenOfNode(node, filter): # Return nodes of type matching the filter (i.e. geo etc...). result = [] if node != None: for n in node.children(): t = str(n.type()) if t != None: for filter_item in filter: if (t.find(filter_item) != -1): # Filter nodes based upon passed list of strings. result.append((n.name(), t)) result += childrenOfNode(n, filter) return result def groupByFBXMaterials(node_path, rewrite_original=False): lst_geo_objs = [] lst_fbx_mats = [] s = "" material_nodes = childrenOfNode(hou.node("%s/materials" % node_path),["Shop material"]) #Other valid filters are Sop, Object, cam. for (name, type) in material_nodes: node_candidate = "%s/%s" % ("%s/materials" % node_path, name) n = hou.node(node_candidate) if n !=None: lst_fbx_mats.append(node_candidate) object_nodes = childrenOfNode(hou.node(node_path),["Object geo"]) #Other valid filters are Sop, Object, cam. for (name, type) in object_nodes: node_candidate = "%s/%s" % (node_path, name) n = hou.node(node_candidate) if n !=None: lst_geo_objs.append(node_candidate) # Make an object geo node for each material detected. # Inside the object will reside an object merge to fetch in each object that references the material. root = hou.node("/obj") if root != None: for mat in lst_fbx_mats: mat_name = os.path.basename(mat) shader_name = "rs_%s" % mat_name geo_name = "geo_%s" % mat_name ''' node_geo = root.createNode("geo", geo_name) if node_geo: # Delete the default File node that is automatically created as well. if (len(node_geo.children())) > 0: n = node_geo.children()[0] if n: n.destroy() node_geo.parm("shop_materialpath").set("/shop/%s" % shader_name) node_obm = node_geo.createNode("object_merge","object_merge1") if node_obm != None: p = node_obm.parm("objpath1") all_obj = "" for obj in lst_geo_objs: temp_node = hou.node(obj) if temp_node != None: smp = temp_node.parm("shop_materialpath").eval() if smp.find(mat_name) != -1: all_obj += "%s " % obj p.set(all_obj) node_obm.parm("xformtype").set(1) ''' # Make a place holder Redshift material by reviewing the FBX material. opacity = 1.0 ior = 1.025 reflection_weight = 0.1 reflection_roughness = 0.23 diffuse_color = [0,0,0] specular_color = [0,0,0] # Typically the FBX Surface Shader is the second node created in the FBX materials subnet. n = hou.node(mat).children()[1] if n != None: r = n.parm("Cdr").eval() g = n.parm("Cdg").eval() b = n.parm("Cdb").eval() diffuse_color = [r,g,b] sm = n.parm("specular_mult").eval() if sm > 1.0: sm = 1.0 reflection_weight = 1.0-sm if (sm==0) and (n.parm("Car").eval()+n.parm("Cdr").eval()==2): # Mirrors should use another Fresnel type. ior=0 r = n.parm("Csr").eval() g = n.parm("Csg").eval() b = n.parm("Csb").eval() specular_color = [r,g,b] opacity = n.parm("opacity_mult").eval() reflection_roughness = n.parm("shininess").eval()*0.01 em = n.parm("emission_mult").eval() if em > 0: # We should create an rsIncandescent shader, using this color, instead. r = n.parm("Cer").eval() g = n.parm("Ceg").eval() b = n.parm("Ceb").eval() # Try to fetch the diffuse image map, if any. tex_map = n.parm("map1").rawValue() if len(tex_map) > 0: pass else: tex_map = "%s/%s" % (texture_path,"NOT_DETECTED") createRedshiftImageMapMaterial("/shop", tex_map, shader_name, diffuse_color, specular_color, reflection_weight, reflection_roughness, ior, opacity) if rewrite_original: # Re-write the original object node's material reference to point to the Redshift material. for obj in lst_geo_objs: node_geo = hou.node(obj) if node_geo: m = node_geo.parm("shop_materialpath").eval() if len(m): mat_name = os.path.basename(m) shader_name = "/shop/rs_%s" % mat_name # To do this right, we need to add a material node to the end of the network and populate it with the shop_materialpath value. node_display = node_geo.displayNode() if node_display != None: node_mat = node_geo.createNode("material","material1") # Create new node. if node_mat != None: node_mat.parm("shop_materialpath1").set(shader_name) node_mat.setInput(0,node_display) # Wire it into the network. node_mat.setDisplayFlag(True) # Move the display flag to the new node. node_mat.setRenderFlag(True) # Move the render flag to the new node. node_mat.moveToGoodPosition() # Program starts here. texture_path = '/media/banedesh/Storage/Documents/Models/Ford/Ford_F-150_Raptor_2017_crewcab_fbx' #Not really used yet. fbx_subnet_path = "/obj/Container_Ship_Generic_FBX" groupByFBXMaterials(fbx_subnet_path, True)
  23. Paint splash via heightfields?

    Have you checked out Konstantin's thread?
  24. [SOLVED] @P in Flip/POP Vexpression

    In my experience, not all node parameters are "writable" from a vexpression, but you can try by directly assigning to the name you see in the tooltip popup. For this example, create a single point in your scene and reference it using the vex point function. Us the fit to remap the minimum and maximum distance into a new wind value for your scene. // Fetch point attribute from any node, anywhere. vector p1 = point("../obj/geo_one_point/OUT","P",0); float dist = distance(@P-p1); // Remap distance into new wind Y range value. float result = fit(dist,0,10, -0.5,-2); windy = result;
  25. Walt Disney Animation Studios has released a massive amount of data for the island scene from their animated movie "Moana". To get the data, visit this link. https://www.disneyanimation.com/technology/datasets
×