Jump to content


Popular Content

Showing most liked content on 06/07/2021 in all areas

  1. 2 points
    If your school doesn't introduce you some method of parametric design, you should consider switching to another one It hard to answer you as the picture you shown used different method, and in houdini most of the time for achieving one goal, multiple roads exist. Just do not burn the steps many Grass hoper is also a good option if you are not afraid of its interface. There are plenty of discussion posted here, and paper on the web to read, start with a basic challenge, experiment by yourself and be patient... Solver, volume sculpting , L_sys, algorithm like Differential growth, DLA, GrayScott Reaction-diffusion, Space colonization, Fibonacci sequence , Implicit surface, Phyllotaxis , shortest path and voroinoid patern, recursion and fractal subd( Hansmeyer ), here few examples of names you should be familiar with, google then, that's not about houdini but they will help you ________________________________________________________________ Vincent Thomas (VFX and Art since 1998) Senior Env and Lighting artist & Houdini generalist & Creative Concepts http://fr.linkedin.com/in/vincentthomas
  2. 2 points
    Not the requested pattern, but a procedural way to split and sew a mesh. stitch.hipnc
  3. 1 point
    wassap! an artwork i just finished
  4. 1 point
    A lot of this stuff is Diffusion Reaction, Volume, and/or solver based. Getting familiar with basic VDB nodes will go a long way in most of these. Stuff like using noises to erode other volumes then converting back to polygons type stuff. Some other reference images you have are just creative Greeble style polygon manipulation but with basic poly shapes. The Mardini SciFi breakdown (Fendra Fx) I released recently actually goes over a cheap way to make some poly extrusions randomly across a surface.
  5. 1 point
    Hey Hristo, That's pretty cool ! I like your Try Except to set the switch as a workaround to "Error while cooking." Yet another way to do it would be to make the check in onInputChanged, and if problem, switch to the input 0. In the input 0, you can put an error node with your message. That way, it doesn't have the "Error: Error generated by python node." update_curve_coords.hda P.S. Nice cloud =P
  6. 1 point
  7. 1 point
    Hi amin, this works, I just added the "function" function int[] amin() { return {1,2,3,4,5,6}; } i[]@test = amin(); EDIT: I am just adding link to the docs: https://www.sidefx.com/docs/houdini/vex/lang.html#notes
  8. 1 point
    Hi Alain, This is fantastic! Much appreciated! I played around a little to find a way to get the error message to propagate upwards without throwing to the consol onInputChanged. I combined the 2 methods you wrote about (thanks for the great detail btw!). I left the python SOP alone in a separate branch and I run the cook() method on it onInputChanged. I don't know if that takes care of the cook-on-every-frame issue. This is what I've got: https://github.com/arabadzhiyski/update_curve_coordinates It must be the most useless, useful thing I've done yet.. Thanks again, Hristo
  9. 1 point
    Hi Hristo, yes you can. With a Python node as the first node in your HDA, you can fetch the input node's type, and check if it is a type you want or not. In the example below, I check against a list to see if it is a type I don't want. The opposite would be easy to implement. wrongTypes = ["add", "box", "testgeometry_pighead"] node = hou.node(".").inputs()[0] nodeType = node.type().name() #print(nodeType) for type in wrongTypes: if nodeType == type: raise hou.NodeError("Node \"%s\" not compatible !" % nodeType) This method might not be the best, since if the input is animated, the Python node will evaluate at each frame. Since you have an HDA, you could go into the Type Properties, Script, then add an Event Handler "On Input Changed", and run (almost) the same code. That should be cleaner. errorOnInputNodeType.hipnc EDIT : Here's the code to do the opposite, to keep only the nodes for which the type has been specified. goodTypes = ["add", "box"] node = hou.node(".").inputs()[0] nodeType = node.type().name() #print(nodeType) found = 0 for type in goodTypes: if nodeType == type: found = 1 break if found == 0: raise hou.NodeError("Node \"%s\" not compatible !" % nodeType)
  10. 1 point
    @archz2 I'm hobbyist so I have definitely wrong set of mind(thinking like Ladies and Dudes that work For movies advertising and other ) if you asking me for advice..I just Having Fun ..and I like It.. here its me and company ..I just combine knowledge from peoples from all over the world and learning on my way .. have fun READING THIS .. Funny that you didn't learn In Architect school About L-system ,Linden Mayer'system HM..Basically that its the point with that Mind of thinking and Design (biomorphic) I think ... hm..Nature
  11. 1 point
    Here is a basic setup to carve organic style tubes/hallways through a shape/mesh. ap_organic_tube_hallways_through_shape_091520.hiplc
  12. 1 point
    'To polar node' ended up being the trick! Thanks for the help guys. Here's what I've got after an hour or so, I think I can do the rest shader level.
  13. 1 point
    Hi Tom, i made a python script to "push" take values back to the root take. I find it rather handy - if you have an override you want to make global, right click and send it back to the main take. You'll need to save this into a "PARMmenu.xml" file somewhere on your houdini path (eg C:\Users\cgardner\Documents\houdini15.5\PARMmenu.xml). When you restart houdini, you *should* get a "push override" item in the parameter right-click menu when you're in a take. <?xml version="1.0" encoding="UTF-8"?> <menuDocument> <menu> <scriptItem id="pushOveride"> <label>Push Override</label> <context> <expression>hou.takes.currentTake() != hou.takes.rootTake()</expression> </context> <insertAfter>take_activate</insertAfter> <scriptCode><![CDATA[ parms = kwargs['parms'] if parms: parm = parms[0] pt = parm.tuple() ctake = hou.takes.currentTake() for p in ctake.parmTuples(): if p == pt: keyframes = {} for parm in p: if parm.keyframes(): keyframes[parm.path()] = parm.keyframes() else: if parm.parmTemplate().type().name() == 'String': if parm.unexpandedString(): keyframes[parm.path()] = parm.unexpandedString() else: keyframes[parm.path()] = parm.eval() else: keyframes[parm.path()] = parm.eval() rootTake = hou.takes.rootTake() updateMode = hou.updateModeSetting() hou.setUpdateMode(hou.updateMode.Manual) hou.takes.setCurrentTake(rootTake) for k in keyframes: hou.parm(k).deleteAllKeyframes() if type(keyframes[k]) is tuple: for key in keyframes[k]: hou.parm(k).setKeyframe(key) else: hou.parm(k).set(keyframes[k]) hou.takes.setCurrentTake(ctake) ctake.removeParmTuple(p) hou.setUpdateMode(updateMode) ]]></scriptCode> </scriptItem> </menu> </menuDocument> cheers, chrisg