I've loaded the demo file from the 19.5 HoudiniHairProcedural help and have tried shoe-horning an existing groom (from another software package) into the hair_deformed lop setup. Having a bit of difficulty getting it to work (ie: have the high-density groom follow the low-density simulated guide curves).
According to the HUSK Procedural video here, it is possible:
https://www.sidefx.com/products/whats-new-in-195/character-fx/ [www.sidefx.com]
Is there any chance of getting a simple demo file showing how this can be achieved?
Husk Procedural hair example
15926 41 11- Hamilton Meathouse
- Member
- 195 posts
- Joined: Nov. 2013
- Offline
- Piledriver
- Member
- 99 posts
- Joined: Nov. 2018
- Offline
- robp_sidefx
- Staff
- 497 posts
- Joined: June 2020
- Offline
Piledriver
husk procedurals work only for hairs?
Hair has been our main focus for Houdini 19.5 and is currently the only documented and officially supported workflow using husk procedurals.
We do not yet have great tooling in place to make it a particularly pleasant user experience to develop custom procedurals. Further to this, we're also tracking Pixar's current exploration of Hydra-level procedurals to ensure our work is complementary and not competitive or redundant. Both of these factors have convinced us to proceed in measured steps, to ensure we don't paint ourselves into a corner by allowing customers to build production-dependent workflows around a technology we later decide requires fundamental changing in a future version of Houdini.
All that said...
While not documented, the husk procedurals framework is already more generic than just being able to generate hair. We aren't actively preventing anyone from exploring these waters, but I will point out that there is no lifeguard on duty and there might be sharks.
- robp_sidefx
- Staff
- 497 posts
- Joined: June 2020
- Offline
Hamilton Meathouse
Is there any chance of getting a simple demo file showing how this can be achieved?
If you open the help docs for the Hair Procedural node in LOPs there is an example file at the bottom which provides networks for both modes (generation and deformation). If this doesn't give you what you need, it would be useful for us to know more so we can improve these (or add new ones).
- elovikov
- Member
- 130 posts
- Joined: June 2019
- Offline
This stuff is so good!
For anybody interested I've created a simple procedural by kinda reverse engineering the hair one.
I've attached a minimal example of render time point scatter with number of points controlled by primvar.
As Rob said currently ux is very complicated and it looks more like a workaround, but still so much potential. It's like beginning of something completely new
So right now procedural is a python script(?) with
Now you already have a generic procedural there invokegraph.py used by hair one. It basically does what it says, it calls compiled graph via Invoke Graph SOP. It's a new feature from 19.0 when you can store any compilable subnetwork and then call it. You can see it like you can compile any network to some "executable form" and then load it and apply. I don't know, like dynamic linking in some sense.
Anyways, if you want to create your own procedural based on graph invocation, roughly you do this:
1. Create a compilable subnetwork like always in the editor (or compilable sop hda)
2. Fetch this networks as a geometry via Attribute From Parameters SOP with Points From Subnetwork method.
3. Blast points that represent inputs not in use
4. Save this network to a file as any native houdini format (bgeo, bgeo.sc)
Now you can use this file with invokegraph procedural on any prim with HoudiniProceduralAPI. Path should be @invokegraph.py@ and args dictionary should have these entries:
My main takeaways:
1. Authoring and saving procedurals are very cumbersome. We have now asCode if we'd have asUsd and fromUsd that would change everything
2. Probably connected to graph representation. Parameters overriding is also very complicated. I don't know even where to start, but basically you have to rely on undocumented (?) feature of node parameter overriding. You can check the example or some layout brushes network. Apparently you can override any parameter even inside compiled block with detail attribute from spare input by using special magic node property spare_parminputindex
3. Invokegraph procedural currently supports only points and curves. Haven't tested yet so not sure if you can generate other geometry. It depends on how generated geometry translated back to usd prim.
Example in the attachement. It has simple setup and also bgeo file with point scatter graph (I couldn't find a way to embed procedural network in hip, righ now it looks like it has to be an actual file on the disk)
For anybody interested I've created a simple procedural by kinda reverse engineering the hair one.
I've attached a minimal example of render time point scatter with number of points controlled by primvar.
As Rob said currently ux is very complicated and it looks more like a workaround, but still so much potential. It's like beginning of something completely new
So right now procedural is a python script(?) with
procedural
function taking prim and args from HoudiniProceduralAPI and returning hou.Geometry. Probably it's just a temporary solution, but right now for asset path you just use python script from $HFS/husdplugins/houdiniprocedurals
. Now you already have a generic procedural there invokegraph.py used by hair one. It basically does what it says, it calls compiled graph via Invoke Graph SOP. It's a new feature from 19.0 when you can store any compilable subnetwork and then call it. You can see it like you can compile any network to some "executable form" and then load it and apply. I don't know, like dynamic linking in some sense.
Anyways, if you want to create your own procedural based on graph invocation, roughly you do this:
1. Create a compilable subnetwork like always in the editor (or compilable sop hda)
2. Fetch this networks as a geometry via Attribute From Parameters SOP with Points From Subnetwork method.
Create Inputs and Outputs
and Create Implicit Wires
(?) should be checked3. Blast points that represent inputs not in use
4. Save this network to a file as any native houdini format (bgeo, bgeo.sc)
Now you can use this file with invokegraph procedural on any prim with HoudiniProceduralAPI. Path should be @invokegraph.py@ and args dictionary should have these entries:
- graph with the path to the file with the graph
- inputs with paths to stage prims that should be wired to the procedural (prims would be transformed via USD Unpack)
- overrides with parameter overrides that would be passed as the last input with the same dictionary detail attribute
My main takeaways:
1. Authoring and saving procedurals are very cumbersome. We have now asCode if we'd have asUsd and fromUsd that would change everything
2. Probably connected to graph representation. Parameters overriding is also very complicated. I don't know even where to start, but basically you have to rely on undocumented (?) feature of node parameter overriding. You can check the example or some layout brushes network. Apparently you can override any parameter even inside compiled block with detail attribute from spare input by using special magic node property spare_parminputindex
3. Invokegraph procedural currently supports only points and curves. Haven't tested yet so not sure if you can generate other geometry. It depends on how generated geometry translated back to usd prim.
Example in the attachement. It has simple setup and also bgeo file with point scatter graph (I couldn't find a way to embed procedural network in hip, righ now it looks like it has to be an actual file on the disk)
- robp_sidefx
- Staff
- 497 posts
- Joined: June 2020
- Offline
- dnegGeneric
- Member
- 47 posts
- Joined: Aug. 2018
- Offline
Great to see this Rob! I have had a look at the demo scene, and I can see the groom deforming with the skin/guides in LOPs when I display "/obj/HoudiniHairProcedural1/hair_deformed/houdinipreviewprocedurals", which is great, but I've tried changing the capture and deform parameters such as "Split clumps", "Pick Single Best Guide", "Max Split Passes" and "Edge Flip Passes" on "/obj/HoudiniHairProcedural1/hair_deformed/setup_deformation_procedural", but it doesn't seem to change the look of the deformed hair at all (still diplaying the houdinipreviewprocedurals LOP). Any idea if I need to do anything else to get these working? Cheers! Gabriel Arnold.
Edited by dnegGeneric - July 22, 2022 08:11:16
- Piledriver
- Member
- 99 posts
- Joined: Nov. 2018
- Offline
- robp_sidefx
- Staff
- 497 posts
- Joined: June 2020
- Offline
dnegGeneric
I've tried changing the capture and deform parameters ...
Hey Gabs! I'm trying to track down the source file for the hair deformation graph, but it does indeed look to me as though we haven't properly connected a bunch of the input parms. I'm going to turn this into a bug to make sure it doesn't slip off the radar. #123025 for your reference.
Sorry about this!
- robp_sidefx
- Staff
- 497 posts
- Joined: June 2020
- Offline
Piledriver
the hair proceudral also if i try to increase the hairs number he consider also the density attribute for instance?
I believe at present we do not take a density attribute into account when scattering the roots for hairs in generation mode. I'm going to log an RFE for this. #123027 for your reference.
I expect there will be a flood of similar requests. Inside the procedural are rather a lot of nodes, each of which has rather a lot of parameters. We didn't want to overwhelm users with hundreds or thousands of controls, but inevitably we will have missed some that provide a vital capability for certain users. Bear with us as we try to find the sweet spot that works for the most people.
- Piledriver
- Member
- 99 posts
- Joined: Nov. 2018
- Offline
- jsmack
- Member
- 8027 posts
- Joined: Sept. 2011
- Online
robp_sidefx
I believe at present we do not take a density attribute into account when scattering the roots for hairs in generation mode. I'm going to log an RFE for this. #123027 for your reference.
I expect there will be a flood of similar requests. Inside the procedural are rather a lot of nodes, each of which has rather a lot of parameters. We didn't want to overwhelm users with hundreds or thousands of controls, but inevitably we will have missed some that provide a vital capability for certain users. Bear with us as we try to find the sweet spot that works for the most people.
There's a few 'dealbreakers' that are currently missing:
- Density - while missing the global control in favor of total count isn't quite the dealbreaker, missing skin attribute and texture modifiers are
- Width ramp - Houdini's groom tools don't put width on the guides, so won't even render out of the box with the procedural as the width is 0. The hair generate node contains the curveu-width mapping control, therefore it should also be on the procedural.
- Move to limit surface/displace curves - This can be important for some very short hair grooms where even slightly out of register hairs will result in internpen issues/bald spots. I'm not certain what the procedural currently does as it doesn't mention it.
- robp_sidefx
- Staff
- 497 posts
- Joined: June 2020
- Offline
- gabriel_arnold_dneg
- Member
- 1 posts
- Joined: Jan. 2022
- Offline
robp_sidefxThanks a lot Rob!
s
I'm not sure how to track the bug support issue, as I tried to view https://www.sidefx.com/bugs/#/bug/123025 [www.sidefx.com] , but that doesn't seem to work. I'll check back here for any updates for now. Cheers! Gabs
- Hamilton Meathouse
- Member
- 195 posts
- Joined: Nov. 2013
- Offline
- jsmack
- Member
- 8027 posts
- Joined: Sept. 2011
- Online
Hamilton Meathouse
FYI I got it working with our proprietary grooming system (well, with the products it outputs anyway). Needed to kill some parms on the cfx skin cache and rest pose models, recalculate the skinprim and skinprimuv attrs etc.
was it deformed by skin or by guides? If by guides, how did you generate guides from a groom? Were there already usable guides from your system? I've found when trying to deform 3rd party grooms in Houdini, other systems don't use very many guides compared to Houdini and they aren't suitable for deforming the final groom, Xgen for example.
- robp_sidefx
- Staff
- 497 posts
- Joined: June 2020
- Offline
gabriel_arnold_dnegOh, yeah, I suspect our internally-facing and externally-facing bug DBs work with different IDs. Anyway, I'll get DNEG added to the bug.
Thanks a lot Rob!
I'm not sure how to track the bug support issue, as I tried to view https://www.sidefx.com/bugs/#/bug/123025 [www.sidefx.com] , but that doesn't seem to work. I'll check back here for any updates for now. Cheers! Gabs
- Hamilton Meathouse
- Member
- 195 posts
- Joined: Nov. 2013
- Offline
jsmack
was it deformed by skin or by guides? If by guides, how did you generate guides from a groom? Were there already usable guides from your system? I've found when trying to deform 3rd party grooms in Houdini, other systems don't use very many guides compared to Houdini and they aren't suitable for deforming the final groom, Xgen for example.
AFAIK it requires both Skin and Guides to deform. Are you able to choose one or the other and get different results?.
We have Rest Hair Guides and Simulated Hair Guides, and I was able to generate a Rest Full Groom from our internal tools. However, whilst the full groom is deformed accordingly, we lose all the clumping/detail.
Does anyone know if there are certain settings to control how it os deformed, or how things are interpolated that could potentially be destroying our clumping information?
- Hamilton Meathouse
- Member
- 195 posts
- Joined: Nov. 2013
- Offline
As Dneg noted above, none of the parameters on the Deform tab such as "Split clumps", "Pick Single Best Guide", "Max Split Passes" and "Edge Flip Passes" seem to do anything at all. Also, the help file only has info for the 'Generate' mode, and nothing for the 'Deform' mode. Would be great if this could be updated.
- goldleaf
- Staff
- 4195 posts
- Joined: Sept. 2007
- Offline
-
- Quick Links