Jump to content


  • Content count

  • Donations

    0.00 CAD 
  • Joined

  • Last visited

  • Days Won


toadstorm last won the day on January 17

toadstorm had the most liked content!

Community Reputation

170 Excellent

About toadstorm

  • Rank

Contact Methods

  • Website URL

Personal Information

  • Name
  • Location
    San Jose, CA

Recent Profile Visitors

4,222 profile views
  1. here's an actual .hip example. i'm also grabbing N and up from the curve, so if you were instancing geometry on the points, they'd follow the curvature. slide_along_curve_toadstorm.hiplc
  2. Does it have to be happening on the source curve itself? I feel like having a separate set of points sliding along a fixed curve would be much easier to control. MOPs Move Along Spline could handle this fairly easily... http://www.motionoperators.com If you want to do it manually, what you probably want to do is create a duplicate set of disconnected points via the Add SOP or whatever, and then use xyzdist() to determine their relative positions along the parametric U of the curve. This would be done in a point wrangle, with your disconnected points in input 0 and the original curve in input 1: int posprim; vector primuv; float dist = xyzdist(1, @P, posprim, primuv); f@u = primuv.x; Then after that's been established, you can use a second wrangle with a parameter to add to that starting @u value and lock each point to the position along the curve that matches the new parametric U value: float add_u = ch("add_u"); float new_u = (f@u + add_u) % 1.0; // wrap points if they go past 1.0 vector new_P = primuv(1, "P", 0, new_u); @P = new_P;
  3. Is it creating the 1 because another instance of that same OTL exists in the same scene path? If something else is causing this, you can always just go to the Type Properties > Scripts window, and enter the following in the OnCreated event: me = kwargs['node'] me.setName('MyNameWithoutA1AtTheEnd', True)
  4. Auto Roll

    sup bb I'm not sure how you could do this without a solver, since it's accumulating rotation over time based on the speed and direction of motion each frame. I could be all kinds of wrong, though. Here's my method... I'm using the distance traveled and a vector orthogonal to the direction of travel to build an angle/axis quaternion, and adding (qmultiplying) that quaternion to the existing orient for each timestep. It's not perfect but it seems to work pretty well. Since it's basing the rotation angle on cross(dir, up), it might freak out if the ball rolls straight down. Curious if any smart people have a better answer for that. AutoRoll01_toadstorm.hip
  5. vellum grains attributes

    You could use the Cluster Attribute on the Vellum Configure Grain node to make the glue constraints only occur between grains that have an identical attribute value. The Cluster SOP is useful for generating these, or you can create them manually. You can break the constraints manually, or use the Detach Chance / Break Threshold options on the Vellum Configure Grain node to control how the constraints can break during the simulation. http://www.sidefx.com/docs/houdini/dyno/vellumattributes.html
  6. vellum grains attributes

    The grains attributes you're trying to use are for POP Grains, not Vellum Grains. If you want Vellum Grains to clump, you'll need to set up a constraint network. vellum_grains_attributes_rd_toadstorm.hipnc
  7. Carve with randomize

    I like to do this with the Clip SOP instead of Carve. You just have to smash all your curves into UV space first, so that they're all lined up neatly along a single axis. The Resample SOP can get you the "curveu" attribute, which you can use to move all your curve points into a normalized UV space, and then the Clip SOP neatly trims them. To randomize, just move each primitive up or down before clipping. Then move the points back to their original space. Attaching an example. randomize_carve_toadstorm.hip
  8. Adding value from existing attribute

    Attribute Promote your "level" attribute to a Detail attribute in Maximum mode (without removing the original attribute), so you know what your highest extant level is, then you can just increment on top of that for your twigs... for example: if(s@name == "Twigs") { i@level = detail(0, "maxlevel")+1; }
  9. Deleting DOP objects in-sim

    Keep in mind that everything in your example DOPnet is a single Vellum object, not multiple objects. You can emit more points and constraints into the simulation if you like, but it's all data that's being added to a single Vellum object, "vellumobject1". There's a couple things that will make Houdini very angry when deleting geometry from a Vellum object. First, from my testing it seems that you don't want to delete individual points/prims from a Vellum patch... you want to delete the whole patch at once if you're going to take that route mid-simulation. Second, you absolutely need to delete the associated constraints as well. In DOPs, the actual Vellum mesh is "Geometry" data, but the constraints are "ConstraintGeometry". This means that you need a SOP Solver (or Geometry wrangle, depending on what you like to work with) for both of these data names to delete both the Geometry and the ConstraintGeometry so that you don't end up with constraints that no longer have anything to constrain. I'm attaching an example here... I modified the Vellum Source to change the Patch Name so that each generated sphere has a unique name (based on the frame number when they're emitted), then in the Solver SOPs I run a for/each over each patch, get the minimum P.y position, and delete entire patches at once when their minimum P.y is less than zero. vellum_culling_toadstorm.hip
  10. hou.pwd().geometry() gives an error

    hou.pwd() refers to the node that's currently being processed, such as when a callback script is running in an HDA. you don't currently have a SOP node that you're running the code on at all. first create a SOP network, then a node, then you can refer to its geometry(). for example: myNode = hou.node("/obj/geo1/box1") myNode.geometry()
  11. Help with Leaves on a Tree

    You can just take those attributes you were using during the growth process and map them directly to v@N and v@up before you scatter leaves... the Copy to Points SOP will use those attributes to determine orientation. Similarly, you can take your number of steps, find the maximum, then use the ratio between the current step of each point on the tree and the maximum to figure out where you want to scatter leaves to. You also don't need to use the Instance object anymore for instancing in Redshift... Redshift can read Packed Primitives now without a hitch. Attaching an example. sample_tree_toadstorm.hiplc
  12. Animation in material context not working?

    This is the correct answer... materials don't recompile themselves on a per-frame basis, so any parameters that are supposed to change over time need to be promoted in order to function.
  13. opname() will return the name of a node given its full or relative path
  14. Copy Stamp - outward rotation

    post your hip please
  15. Copy Stamp - outward rotation

    Yep, it's a bitch! A lot of older tutorials will encourage you to use Copy Stamping, but it's mostly a deprecated workflow as of Houdini 16. If you want more information about all this template point / copying business, take a look here: http://www.toadstorm.com/blog/?p=493