Jump to content


  • Content count

  • Donations

    0.00 CAD 
  • Joined

  • Last visited

  • Days Won


haki last won the day on January 17

haki had the most liked content!

Community Reputation

16 Good

About haki

  • Rank
  • Birthday 06/25/1988

Contact Methods

  • Website URL

Personal Information

  • Name
    Hristo Arabadzhiyski
  • Location
    The Netherlands

Recent Profile Visitors

217 profile views
  1. I love the curve capture idea! I adapted your VEX a bit to control front and back of the wave. Do you know how to stack those rotations? I mean, chain them so that you get 2-3 waves with 2-3 extra curves? See my v1 geo - I do like the xform matrix approach there although matrices confuse me to hell most of the time. Anyway, I appreciate you help. Cheers! wavelike_deform.hiplc
  2. Insane! Thanks! Wrote the vop sop to a wrangle: matrix xform = detail(1, "xform"); matrix rot = ident(); float z_bias = chf("z_bias"); float range = chf("range"); float angle = radians(chf("angle")); @P *= invert(xform); vector domain = set(@P.x, @P.y, @P.z * z_bias); float dangle = length(domain) / range; dangle = exp(-dangle) * angle; rotate(rot, dangle, 4); @P *= rot; @P *= xform; I'll see how to build on top of that. wavelike_deform.hiplc
  3. Very interesting! Thanks for the hip. I'm looking at the VOP and to be honest I'm not good at 'reading' vop networks. I'll convert it to a wrangle see if I can get a better understanding of what's going on. The wavy lines aren't coming out of that vop, are they? Cheers!
  4. Hey everybody, I want to get better at maths and houdini seems like a fun way to do that. So, (ocean) waves are interesting and I want to make a tool that can draw stylized waves. Alright, I think I got the a classic cycloid: float x = @P.x + cos(2 * PI / wave_length * @P.x) * scale; float y = sin(2 * PI / wave_length * @P.x) * amplitude; float z = @P.z; @P = set(x, y, z); And now it gets interesting: Well, how about barrel waves? What should I be looking at to make the peaks curl, parametrically? Fourier? - which I find fascinating, but know nothing in practice. I graphed a squared cosine and my intuition is that if the blue line function were to be known... (and here it gets fuzzy) do something to the wave. Done. :)) Wave and trigonometry experts out there? A little help? Cheers!
  5. Thanks, skybar. It works great on rigid parts when you pick them by hand. I'm looking for a way to automate the detection of digid parts in a character (or characters which have both soft deforming and rigid meshes) and separate those. I've just discovered that the string abcanim primintrinsic may be what I need. It seems that abcanim on my character is set to "attribute" for the props (which are all rigid) and "transform" for all parts which are soft point-deforming, although the latter is questionable really. Anyway, I tested the 4 steps I had described. It seems it could work especially when one may not necessarily care for tiny point-deformations and would rather treat them as digid. I'll see if I can post a scene or a more accurate description these days.
  6. Hey folks, would there be a way to identify and extract, procedurally, animated rigid pieces from soft point deforming pieces? Say, you have a character alembic cache and several meshes on that character are rigid (i.e. their points don't change positions relative to each other). For example: the weapon of a warrior, or the plate armour, the shield... etc. I want to find those meshes procedurally and extract their transformations (and of course replace their point deformations with object-level transformations, duh...) Would you have a clue how to approach that? There wouldn't be a node for it already, would it? I'm thinking what heuristic to employ to differentiate between pieces which points do change positions relative to each other vs such that don't. Maybe just maybe... extract transformation matrices for every piece for some arbitrary prim, be it rigid or not multiply by the inverse to set each piece to the origin and... compute velocity in the result? all inversely tranformed points of rigid pieces have 0 velocity, some points (other than the points on the arbitrary prim from #1) of soft deforming pieces have v>0. tag them.
  7. Creating VEX libraries

    Resurrecting again: I was playing with VS Code the other day. There's a VEX extentsion for it (which seems to have not been updated in a while, but it works ok). There's one for Sublime Text which is more up to date and you can configure Sublime to compile your vfl. Would anybody have a clue how to configure a task in VS Code for that?
  8. Ok, getting there: (A) and (B), still making my mind between the two. Lists of strings: (A) node = kwargs["node"] multi_parm = node.parm("filters") instances = multi_parm.multiParmInstances() menu = [] for p in range(len(instances)): token = str(p); value = "Filter {}".format(p+1) menu.append(token) menu.append(value) return menu returns: ['0', 'Filter 1', '1', 'Filter 2', '2', 'Filter 3', '3', 'Filter 4', '4', 'Filter 5'] There's something a bit confusing here: What would I be calling for to get the multiparm instance corresponding to the currently selected token? Or is that just my flawed logic: Current token -> Corresponding multiparm instance - > Push string to other node (B) menu = [] token = -1 for filter in instances: token += 1 value = filter.eval() menu.append(str(token)) menu.append(value) return menu returns: ['0', '/shop/risnet1/pxrgradedisplayfilter27', '1', '/shop/risnet1/pxrgradedisplayfilter28', '2', '/shop/risnet1/pxrgradedisplayfilter29', '3', '/shop/risnet1/pxrgradedisplayfilter30', '4', '/shop/risnet1/pxrgradedisplayfilter31'] This one seems a bit less confusing. After all the string value I need to push to the other node is right there...i can see it. And then the documentation: def get_selected_token(parm): # Read which item is currently selected selected = parm.eval() # Get the list of menu tokens from the parameter template tokens = parm.parmTemplate().menuItems() # Return the token corresponding to the selected item return tokens[selected] Which gets me: 'tuple index out of range' for the dropdown menu parm. (selected = parm.eval() returns the correct token, indeed) Perplexing... [Edit] I think I got it: evaluate the button strip/dropdown menu and use the token as the index for .multiParmInstances() evaluated as a string. If there were say, not 1 but 2 "Add Filter" buttons, is there a way, inside the Script New Filter, to know which button was clicked? Pushin on. It seems there may be some benefits of turning this into a digital asset and using a python module... I might be tottally ignorant here, but it seems to me functions from a python module make more sense..
  9. Ok, I think the push and pull terms are starting to make me see the bigger pucture. Thanks!! I'd say the node ralationship is non deterministic as the ris1 has no clue about my CONTROLS at all. And it never will as its HDA is not to be messed with. (Btw I've no intention to package this little null (CONTROLS) into an HDA and I've just realized the Null ROP is in fact an HDA itself.) As for the menu like parm, i hope i'm not getting this totally wrong: 1. Click a button to create a node 2. Set above node's op path in the multiparm string field (at this point i'm starting to think I may even get away without multiparm if I list the children of shop/risnet and get the filters directly into the menu parm (3)) 3. Populate menu parameter with new path (or rather, all paths) from multiparm and push selected to ris1 (4.) Alright. Scripting time.
  10. A python newbie here... I'm working on a small script to make a certain workflow of swapping operator paths for filters a bit less clunky in the context of rendering (with Renderman in this case). The idea: 1. Click a button (New Filter) to create a new filter node in the shop context - I got this working. 2. That will add a multiparm toggle+operator path. Set the operator path to the newly created filter. - Also done and working. 3. Use toggles to set (and swap) Display Filter operator path parm on the ROP node (ris1) - Far from working I suspect this will have to do with ParmTupleChanged events? and here things become very fuzzy... how do I match the toggle to the operator path to evaluate the correct parm (Filter 1/2/3...)? From a tupple? I guess I need to def a function for that. But how do I prevent more tan 1 toggle be on at a time... I'm totally stuck. I hope that makes sence and if anyone could point me in the right direction, that'd be awesome!
  11. Here's the beta. Give it a try. https://gum.co/SOpPT
  12. Debugging - Fixed scaling for anything outside the unit circle. - Fixed curve framing with extreme angles by using dihedral to minimize rotation (thanks to Entagma for the theoretical insight on this one) Features - Added point sampling mode switch (cone cap or cone volume) - Added twist control - Added per connected mesh UVs using Toraku's "Get correct uvs with a sweep sop" fix - http://www.tokeru.com/cgwiki/index.php?title=Houdini#Get_correct_uvs_with_a_sweep_sop Some practical results with it here (and one of my first ever tutorials, haha): Give it a try and if you have suggestions, feel free. Cheers! grass_n_stuff_gen_18_4b.hiplc
  13. Hey folks, back with an update here, I took care of the curve framing: Thanks to Entagma's Parallel Transport tutorial I understood the core concept here. I adapted it to my curves generator. I tried 2-3 alternatives, including the slideframe() function and the dihedral()*v0. Seems I got the best result by crossing vectors only. The slideframe and the dihedral seemed somewhat off, probably because I didn't do something right. Here's the file if you wanna give it try: rand_dir_propagating_points_3.hiplc [Edit] - With width and pscale attributes: Debugging and adding some features:
  14. Eureka! (No need for point arrays after all...) So, from what I originally intended to be a grass generator... it will be a multi-purpose generator (including the effect on hair that electrocution has according to popular cartoon depictions) Still to figure out a way to control the up angle at every sample... and to orient the points correctly based on the starting points (polyframe the prims I guess...) [Edit] - With some finetuning below: rand_dir_propagating_points_2.hiplc
  15. Ta-da! I got the point arrays exactly in the correct order for the point number pattern I was getting. Alright, it's going to be smooth sailing from here on… (doing a little dance) Wait, what!? Addprim didn't do what you imagined? Documentation, here I come.