Jump to content


  • Content count

  • Donations

    0.00 CAD 
  • Joined

  • Last visited

  • Days Won


Everything posted by Atom

  1. 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.
  2. 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
  3. 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.
  4. Strange water simulation

    Fluid from object is a one-shot fluid generator. You probably want to try the Emit Particle Fluid button instead.
  5. 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)
  6. Paint splash via heightfields?

    Have you checked out Konstantin's thread?
  7. [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;
  8. 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
  9. Hi All, I have a set of points I am trying to connect with connectadjacentpieces. The node does connect some points, but I want to connect all points. The node has an error..."attribute name either not used or unrecognized". I assume I need to name something, but I just have points. What does this error mean and how do I fix it?
  10. Inside the SopSolver inside the dopnetwork try moving the display flag to the attribute transfer. Without that, I don't think your Cd transfer is actually working. Also, you may want to add Cd to the list of interpolated attributes under the Reseeding TAB of the FLIP solver.
  11. I just create the compressed cache first, which will require the full simulation time (NOTE: Whitewater will fetch its input from this node). Then I'll load that from disk and use it to generate the surface cache. If you are truly seeing a resim, perhaps another node is actually fetching from the dopnetwork, or you left the displayflag for the dopnetwork turned not (you don't need that, the import will fetch that data). If you're not seeing the simulation message, perhaps what you are experiencing is simply slow load times of the cache data. That can't be avoided. Place cache data on SSD drive, if possible. Try turning off your display flags and solo the import.
  12. Subdivide the result of a boolean. Issues.

    Try choosing another Subdivision Algorithm, like OpenSubdivLoop.
  13. Redshift Compositing

    Try using a sprite after your texture to cut out your card then you don't have to worry about excluding it from lighting because the above technique does not run through any shader.
  14. Pyro, not working in Redshift

    It looks like you have disabled the Import checkbox on your Density field. You need density to render with any render system.
  15. Drive Particles from Point A to Point B

    This is an implementation of Blender's keyed particle system.
  16. Dream config comes true

    I think I would pick an nVidia card instead.
  17. "Banding" effect on pop sim

    On the DOPNetwork titled "Experiment" there is an Object field. This field contains an asterisk by default denoting the wildcard of all nodes with geometry inside the dop network. If you examine your network you'll discover that there is a StaticCollision node named geo1. When you import everything using the asterisk the collision geometry is imported as well. Houdini supports some symbolic grammar to allow you to modify this list. You can use the caret symbol to exclude an object from import. Try using... * ^geo1 to import the particles but exclude the geo1 collision node inside the dopnetwork.
  18. Random vellum pressure

    They may have used some form of animated mask or mass transfer. You can draw seams with color and inflate the non-seams. ap_vellum_mask_based_seams.hiplc This one is using an attributefrommap node to load in a grid texture map.
  19. Hi All, I have a font object and I want to extrude it using the shape of a curve to create a custom extrusion look. I have dropped down a curve and connected it to the second input of the PolyExtrude node but no matter how I move the points of the curve around, no useful extrusion is ever produced using this technique. Is there a way to emulate Blenders method for profile beveling in Houdini? ap_extrude_font_profile_issue.hipnc.hiplc
  20. "Banding" effect on pop sim

    Yeah, the problem with a minpos solution is that it gathers into strings over time. You get 5, maybe 10 seconds of animation before it all clumps together. In this example I have expanded the sphere and inverted the normal to use it as a collision object for containment. You might be able to use other shapes with this setup. ap_lib_test1.hipnc
  21. "Banding" effect on pop sim

    What you are calling "banding" seems to be more like a gathering of particles. The popwind acts a lot like a washing machine. It just stirs things around. You can use a popgrain node to push particles apart, but the real problem is that you are adding hundreds of thousands of particles per frame. Try setting your life to 1.0 to remove older particles. ap_orbsOdForce.hipnc
  22. Hi All, I downloaded and installed redshift but it does not show up in the OUT network of my Houdini 15.5 Indie. Does anyone know how to setup redshift for use with Houdini on Windows 7? The redshift installer failed to do this correctly. Thanks
  23. If you are within the LOPs context, be aware that attribute names are changed. LOPs is an implementation of USD. Try connecting a pxrAttribute node to the baseColor of the shaders node. Instead of typing Cd type displayColor for the attribute name.
  24. flock systems collisions and rotations

    Check out this link, perhaps?