Search the Community
Showing results for tags 'vex'.
-
After more than 5 months of unimaginable amount of work, I am proud to release my first in-depth Houdini course on VEX More details in the video description and the website. Active Patreon members will receive additional discounts proportional to their lifetime support (25% of their lifetime support). Message me on Patreon for your discount coupon. Enjoy! 01 - Introduction [Point Clouds] 02 - Introduction [pcopen() vs pcfind() vs nearpoints()] 03 - Introduction 04 - Implementation 05 - pcfilter() Implementation for pcfind() 06 - pgfind() 07 - pcfind_radius() 08 - Excluding the Current Point & Ad-Hoc Groups 09 - Finding Min & Max Neighbour Points [Unique Pair Matching] 10 - Concept 11 - Implementation [Camera Based Occlusion with Variable Pscale] 12 - Concept 13 - Implementation [Uniform Point Distribution Over Polygonal Surfaces [Point Relaxation]] 14 - Concept 15 - Implementation 16 - Decoupling Operators [Convolution Kernels] 17 - Introduction 18 - Border Handling [Connectivity & k-Depth Point Neighbours Using Edges] 19 - Introduction 20 - Concept 21 - Implementation [Connectivity & k-Depth Point Neighbours Using Primitives] 22 - Concept 23 - Implementation [Extending k-Depth Point Neighbours Using Edges] 24 - Introduction 25 - Concept 26 - Implementation [Extending k-Depth Point Neighbours Using Primitives] 27 - Concept 28 - Implementation [smoothstep() [Cubic Hermite Interpolation]] 29 - Concept 30 - Implementation [Shaping Functions] 31 - Introduction 32 - Implementation 33 - Blurring Attributes [Sharpening Attributes Using Unsharp Mask] 34 - Concept 35 - Implementation [Generalizing the Kernel Code to Handle All Attribute Types] 36 - Concept 37 - Implementation [Attribute Gradient] 38 - Introduction 39 - Concept 40 - Implementation [Gradient Ascent & Descent] 41 - Planar Geometry - Introduction 42 - Planar Geometry - Concept 43 - Planar Geometry - Implementation 44 - 3D Geometry [Contour Lines] 45 - Introduction 46 - Concept 47 - Implementation 48 - Heightfields [Geometric Advection - Orthogonalization & Flowlines] 49 - Introduction 50 - Concept 51 - Implementation [Clustering & Quadtrees] 52 - Concept 53 - Implementation [Adaptive Subdivision] 54 - Introduction 55 - Implementation 56 - Hashing [Adaptive Subdivision] 57 - Improving OpenSubdiv Catmull-Clark Subdivision Surfaces Algorithm 58 - Half-Edges [Adaptive Subdivision] [Aggressive Performance Optimizations] 59 - Eliminating Groups 60 - Custom Fusing In VEX 61 - Recreating Proximity Structures In VEX 62 - Get Unshared Edges In VEX 63 - Final Optimizations [Limit Surface Sampling] 64 - Introduction 65 - OpenSubdiv Patches 66 - Moving Points to the Subdivision Limit Surface 67 - Scattering Points on the Subdivision Limit Surface 68 - Generating a Point Cloud on the Subdivision Limit Surface 69 - Pre-Generating a Point Cloud on the Subdivision Limit Surface 70 - Creating Isolines on the Subdivision Limit Surface [Adaptive Subdivision] 71 - Computing Surface Normals from the Subdivision Limit Surface [Custom Subdivision Surfaces] [Splitting Edges [Edge Divide]] 72 - Concept 73 - Converting Edges to Primitives 74 - Creating New Edge Points [Rebuilding Polygons] 75 - Concept 76 - Implementation 77 - Preserving & Interpolating Attributes 78 - Multithreading by Connectivity 79 - C++ vs VEX 80 - Preserving Groups 81 - Final Optimizations [Implementing Bilinear Subdivision] 82 - Introduction 83 - Concept 84 - Modeling Test Geometry 85 - Starting from Edge Divide 86 - Creating New Face Points 87 - Creating New Edge Points [Creating New Closed Polygons] 88 - Concept 89 - Implementation [Creating New Open Polygons] 90 - Concept 91 - Implementation 92 - Preserving Primitive Groups & Interpolating Primitive Attributes [Preserving Vertex Groups & Interpolating Vertex Attributes for Closed Polygons] 93 - Concept 94 - Implementation 95 - Preserving Vertex Groups & Interpolating Vertex Attributes for Open Polygons 96 - Implementing Iterations 97 - Preserving Literal Groups 98 - Creating Neighbour Primitives 99 - Final Changes 100 - Testing On Complex Geometry [Implementing Catmull-Clark Subdivision] 101 - Introduction [Closed Surfaces] 102 - Rules [Gathering Edge & Face Points] 103 - Concept 104 - Implementation [Computing Weights for New Edge Points] 105 - Concept 106 - Implementation [Computing Weights for Original Points] 107 - Concept 108 - Implementation [Attribute Interpolation] 109 - Concept 110 - Implementation [Boundary Interpolation Rules for New Edge Points] 111 - Concept 112 - Implementation [Boundary Interpolation Rules for Original Points] 113 - Concept 114 - Implementation 115 - Open Surfaces - Handling Corner Points 116 - Handling Non-Manifold Topology [Open Polygons] [Computing Weights for Original Points] 117 - Reverse Engineering OpenSubdiv 118 - Implementation [Computing Weights for New Edge Points] 119 - Reverse Engineering OpenSubdiv 120 - Implementation 121 - Handling Open Polygonal Curves [Handling Mixed Topology] 122 - Full Geometry 123 - Sub-Geometry 124 - Testing On Complex Geometry [Performance] 125 - Profiling [Grouping Boundary Edges from Primitive Group] 126 - Concept 127 - Implementation 128 - VEX vs C++ [Caustics] 129 - Introduction 130 - Sea Caustics 131 - Pool Caustics [Enhancing Gradient Ascent, Descent & Contour Lines] 132 - Introduction 133 - Implementation 134 - Tracing Both Directions [Updating Distances Properly] 135 - Concept 136 - Implementation 137 - Looping Streamlines Problem 138 - Adding Trace Parameter [Evenly Spaced Gradient Ascent, Descent & Contour Lines] 139 - Introduction 140 - White Paper 141 - Concept 142 - Constructing the For Loop Network 143 - Improving Seed Points Selection for Tighter Packing 144 - Implementing Separation [Enforcing Separation Using Self Proximity] 145 - Concept 146 - Implementation 147 - Optimization 148 - Final Tweak 149 - Applying to 3D Geometry [Custom Subdivision Surfaces] [Extreme Performance Optimizations] 150 - Introduction 151 - Establishing Baseline for Performance 152 - Updating Attribute Interpolate Nodes 153 - Interpolation vs Copying 154 - Optimizing Input Group 155 - Caching Geometry Data 156 - pointedge vs pointhedge 157 - Getting Primitives from Half Edges 158 - Eliminating Edge Groups 159 - Parallelizing Geometry Creation for New Primitives [Unrolling Loops] 160 - Parallelizing Geometry Creation for New Edge Primitives [Unrolling Loops] 161 - Finalizing the Network 162 - Performance Profiling the Latest Version 163 - Conclusion
- 57 replies
-
- 15
-
-
-
Quick one. Scattering rocks (or any asset) on terrain and every copy comes out facing the same way at the same size — that fake, stamped-out look. The fix is a proper orient setup so each instance gets its own rotation and scale without flipping. The tricky part is the orient quaternion — do it from N alone and instances flip. The clean way is a full stable orient (Shoemake uniform rotation) plus a random uniform scale, exposed as sliders: // Point Wrangle between Scatter and Copy to Points, run over Points int seed = chi("seed"); float smin = ch("scale_min"); float smax = ch("scale_max"); vector u = rand(set(@ptnum, seed, 0)); float r1 = sqrt(1.0 - u.x); float r2 = sqrt(u.x); float t1 = 2.0 * PI * u.y; float t2 = 2.0 * PI * u.z; p@orient = set(sin(t1)*r1, cos(t1)*r1, sin(t2)*r2, cos(t2)*r2); float s = rand(set(@ptnum, seed, 1)); @pscale = fit01(s, smin, smax); I made a short video walking through it end to end (build the scatter, hit the problem, generate the VEX, paste, done): https://www.youtube.com/watch?v=0FxEAaKmLBU The VEX in the video was generated by a Houdini skill I built for AI agents — it's on my Gumroad if useful, but the code above is the whole fix, free. Feedback welcome.
-
Missing motion blur on cached geometry is one of the most-asked questions in Houdini's history — and when it's not missing, it often overshoots into long streaks at every impact. Here's the complete method, plus a free kit if you want the code ready to paste. Why per-frame caches lose blur Per-frame caches (.bgeo.sc, per-frame Alembic, VDBs) throw away the between-frame info. To create blur the renderer needs either a velocity attribute v to extrapolate along, or two or more time samples to interpolate between. Changing topology (particle birth/death, fractures, fluid meshes) makes interpolation impossible — those cases must use velocity blur. The decision table Particles / changing point count → velocity blur (v) Deforming mesh, constant topology → time samples / Cache LOP Volumes (pyro, smoke) → velocity blur from vel Camera / transform animation in LOPs → Cache LOP + matching camera shutter The fix — if v got stripped, rebuild it before the cache (Trail SOP → Compute Velocity), or by hand in a Solver SOP: vector prevP = point(1, "P", @ptnum); v@v = (@P - prevP) / f@TimeInc; Then enable velocity blur on the renderer. In Karma/Solaris it's read from v automatically on most geometry; animated transforms need a Cache LOP so the USD stage carries multiple time samples. When blur overshoots at impacts, clamp velocity in the render branch only — never touch the raw cache: float maxspeed = ch('max_speed'); // ~2x your hero speed float spd = length(v@v); if (spd > maxspeed) v@v *= maxspeed / spd; Works on Houdini 19.5 / 20.0 / 20.5 / 21.0. In H21's Karma (Hydra 2) these rules are unchanged. That's the full method. I packaged it into a free kit that adds the clean copy-paste VEX + Python files, a third fix (neighbour-smoothing for impact spikes), a one-click batch-render tool, and a printable reference card: Free on Gumroad (secure checkout): https://worldvfx.gumroad.com/l/motion-blur-fix-kit It's a slice from a larger Houdini Automation Cookbook I'm building. Feedback welcome.
- 2 replies
-
- 1
-
-
- motion blur
- rendering
-
(and 3 more)
Tagged with:
-
I have a kineFX spine that i deform with a point deform and use capture proximity + bone deformer to kind of rig flat proxy geometries. This works great, the issue is that if the plane i use to drive shrinks, so does the spine. I fixed this in vex before feeding the line into the bone deform and it does great, the one issue is that it creates an offset as its restoring the segment length. Any idea how to keep the fixed length line closer to the "squashed" geometry without shrinking? Thanks all! Screen Recording 2026-06-27 122559.mp4 geo_fix_stretch.hip
-
Hey, hopefully someone can help me or give me some advice for an issue I am having while following a tutorial. While following they use this script in a point wrangle. -------- float rand = rand(@copynum); float weight = chramp('curveu', f@curveu + rand + (@Time * fit01(rand, .1, 1) * chf('speed'))%1); @anim = weight; -------- However when I recreated this my version was very different (see attached screenshot). But when I tried the exact same script in H19 and it works perfectly (I included a screenshot for this too). Does anyone know what has changed between these versions to cause this effect? Or have any advice on how I could recreate it in Houdini 21? (I had a similar problem before with @Alpha not working and @alpha working instead, could it be a simple change like that? I've tried several changes like that to no avail) RBL_WEEK08_Cloud_01.hip
-
In solaris I have a material library with materials that match the name property of each primitive mesh in the scene graph. I can use use the material assignment node to assign one material to one primative. This works and in the scene graph you can see the material binding. see attached image below: However I want to do this with a wrangle and assign all materals to matching prims. in a wrangle : string name = usd_name(0, s@primpath); string mats = "/materials/"+name; usd_addrelationshiptarget(0, s@primpath, "material:binding", mats); as shown in this tutorial in the scene graph it looks like it has assigned the material relationship but the materail doen't show up in the viewport. If there is an obvious mistake or if there is a beter way to assign all materials with the same names as prims in solaris please let me know. Thanks you for your attention.
-
Please help me, how should I approach this geo effect? Let’s take a single line as a base geometry. From this line, generate a new geometry composed entirely of dots. The dot pattern is inspired by fake Morse code: it follows the visual logic of Morse, but only consists of dots with different density. Only dots are used - no dashes. What would normally be a dash is represented as a region of higher dot density (clusters of tightly packed points). Pauses or separations are represented by lower-density or empty gaps - something like that. Any ideas?
-
VM_Promo.mp4 VEX Manager 1.0 Snippet manager and code editing tool for H20.5+ The VEX Manager is a user-friendly tool for managing and editing VEX code as well as saving notes all within Houdini. It simplifies loading, creating, editing, and organizing VEX expressions, making it essential for artists working with VEX scripts. Download it here https://shirmanor.gumroad.com/l/vex_manager_v1
-
- store
- store data
- (and 20 more)
-
Introducing the VEX Manager, a user-friendly tool which is an alternative from the existing Recipes, Gallery or Preset Dropdown Menu within Houdini. This tool is built solely for managing and editing VEX expressions while also storing notes within a light-weight python shelf tool. Simply click the VEX preset title and instantly view your expression outside of your current wrangle, Edit, Create, Load, Group, Save Variations and Apply your VEX expressions or append small saved snippets to different sections of your current wrangles code. You can also load a vexpressions.txt file from anywhere on your PC including a cloud to enable you to bring the snippets anywhere! This out of wrangle workflow makes it a handy companion for artists working with VEX looking for a non destructive and easy to predict process. For more details click the link. https://shirmanor.gumroad.com/l/vex_manager_v1
-
Hello, im a student learning houdini and i wanna know if theres a simple solution for the title. My tree goes Filecache>GroupExpression>Blast>popnet>(insert aging/shrinking solution)>Copy to points>attribute wrangle(Color)>null So the longer a point is "Alive" for the smaller itll get until it "Dies". Thanks for any help!
-
Hey all, I'm attempting to find the number of unique values across the intrinsic:typename attribute for incoming geometry, but I'm having no luck in getting the uniquevals() function to detect any intrinsics. Originally I assumed that this was just a limitation of the function, but I then realized that the docs explicitly state that you're able to provide the name of 'any attribute (or intrinsic) to read.' For context, let's say I've got a polygonal box and a NURBs curve, which both have unique values for their typename. If I try and access those values in a wrangle, I just get an empty array. I've tried setting the attribute class to 'primintrinsic' instead of 'prim', I've tried removing the 'intrinsic:' prefix from the attribute name, and any number of other gotchas that come to mind. I get the same results when trying to use nuniqueval() and uniqueval() as well. It isn't the end of the world since there are ways to do something similar in python, but if anyone's got some secret sauce to get these VEX functions in particular to play nicely with intrinsics, I'd appreciate the help. Thanks in advance.
-
Hi everyone, I'm working with a point cloud and trying to select the boundary (or inverse boundary) points using VEX, similar to the image below. My code works well when the points are not too close to each other, but I encounter issues when the points are very close, like in the image shown. int handle = pcopen(0, "P", @P, chf("Max_Radius"), chi("Max_Points")); v@getPositions = pcfilter(handle, "P"); float var = length(v@P - v@getPositions); if(f@density = var > chf('threshold')) { i@group_boundry = 1; } Does anyone have suggestions on how to address this? Thanks for helping. Select Boundary Points 02.hip
-
My whole end goal is essentially just trying to take a Transform SOP's pivot rotation (visually shown in the viewport as the transform pivot handle) and extract it as a vector. This way I can then apply this rotation pivot vector to future transform SOPs to effectively copy the rotation pivot across. Note that I'm not talking about the rotation of the geometry, I'm talking about the pivot since I've already figured out the geometry rotation successfully. At first this sounds simple but, unless I've gone down the wrong path, it seems to be very difficult. This is because the pivot's rotation is affected by three different parameters in the Transform SOP. When you rotate with the Transform SOP, it has three different vector parms to enter rotation data for: pre-rotate, pivot rotate, and rotate. If you play around with them, you'll realize the node combines them in order like this: pre-rotate --> pivot rotate --> rotate. The resulting rotation is then applied to the geometry/pivot. That's all handy dandy and all. But I for the life of me can't get my VEX to mimic this behavior using matrix math. This is down to that pesky order in which rotations are combined. Currently my logic is to relative reference the 3 rotation parms into a detail wrangle, convert them to matrices, multiply them with eachother in the order explained above, then finally convert the resulting matrix back into a euler vector. But rotating some geo with this new vector shows an incorrect rotation in certain cases (again, all down to the order in which the rots are used). I can tell its incorrect since I'm just doing a direct comparison of the viewport handle I'm calculating (visualized on a Transform SOP) to a second Transform SOP that's being used as my ground truth. Basically after studying transform matrices and how to combine them for rotation calculations I'm getting stuck in this instance and I simply can't figure this out anymore (my brain is too small). But maybe there's just a simpler way to extract the euler rotation of the pivot handle. Can anyone give me any ideas, or even better some simple working solution/VEX for this problem that I can go off of? Much appreciated, thanks everyone.
-
Trying to reproduce this noise pattern from the MPM Advanced Avalanch example (left part of image circled in green) I think the issue might simple be one of scale. This is the vexpression @Cd = abs(float(snoise((@P*0.02+snoise(@P*0.02,5,0.5,1)),5,0.5,1))); What parameter should I be changing to get it working at a smaller scale for my head mesh?
-
Hi) Can I somehow get the maximum(and the minimum) value of an attribute in VEX? I want to use them in a FIT function.
-
Hi, I have a box with uv on it and bunch of points with different scale attribute on each point. Box size is (1,1,1). After copy to point operation, boxes resizing and uv stretching as expected. My question; is there any way to correct stretched uvs using present scale attribute without running computational heavy operation? adjust_uv_by_scale.hipnc
-
Hi, I have recently created a set of 70+ HDAs called the IPOPs that aim at creating AOVs, Mattes & features for rendering. IPOPs are operator workflows designed to streamline shaders and AOV development in Houdini. With our toolset, artists can easily standardise their networks and access specially developed nodes for various renderers and presets, increasing efficiency and creativity. Get the IPOPs here! Renders in Karma & Mantra. 1. The Standard Library: Set of HDAs that help artists create quick shaders and AOVs and contain useful Utility Nodes such as Fresnel for Karma (CPU & XPU), Mask Falloffs in Shaders etc. The HDA library is constantly updated with new nodes to assist artists in speeding up their workflow and creating a streamlined system thereby increasing efficiency and creativity. 2. The Geometry AOVs: A set of remade common geometry AOVs for artists to quickly generate AOVs, Mattes & Utility Passes for Compositing. 3. The Particles AOVs: A set of remade useful particle AOVs for artists to quickly generate AOVs, Mattes & Utility Passes for Compositing. 4. The Volumes AOVs: A set of remade volume AOVs for artists to enhance their FX using AOVs, Mattes & Utility Passes for Compositing. We have a wide range of Bundles available for various workflows & we support both Houdini Apprentice & Houdini Indie! For any enquiries please email support@chakshuvfx.com I will be posting constant updates and developments here. IPOPs Master bundle: 1. Houdini Apprentice 2. Houdini Indie IPOPs Geometry AOVs bundle: 1. Houdini Apprentice 2. Houdini Indie IPOPs Particles AOVs bundle: 1. Houdini Apprentice 2. Houdini Indie IPOPs Volumes AOvs bundle: 1. Houdini Apprentice 2. Houdini Indie
-
Hi all. I made something a few weeks ago that I thought might be useful, so I somewhat tutorialised it here: http://www.pixelninja.design/manhattan-voronoi-approximation/ Basically it's a method of achieving something close to a Manhattan-distance voronoi diagram. I hope someone out there finds this useful If anyone knows of a better method, or a method of achieving an actual Manhattan voronoi I'd love to hear it! ManhattanApproximation_01.hiplc
-
A noob grains upres question here… I created a massive fracturing grains sim with Vellum at a low-ish resolution, and I'm using the grains' velocities to drive smaller dumber particles. When using the POP Advect by Volume, the particles are pushed around correctly as expected, but when they exist the Velocity field they slow down dramatically almost to a halt. This is because I am using "Treat as Wind" with very high "Air Resistance" values, to counteract the Gravity force. How can I sample the Density of the same volume, and use that to influence the "Air Resistance"? This way the core of the volume will stick to the Velocity, and as we get further away from the core, the Velocity will have less and less influence, with gravity taking over... I spent hours on this yesterday, trying to find a way to bring the volume Density into the DOPNet as a sort of falloff for the POP Advect by Volume node… I even tried transferring the volume density to the Grain source points in SOPs as a float value, hoping I could hook strength data out of them that way, but again, just not luck at all! I’m aware this must be incredibly simple to do, but I just cannot figure it out at all. There doesn’t seem to be any kind of masking options available in the nodes I’m using. One kind Facebook user on the Houdini Artists group told me this VEXpression could be pasted into the POP Advect by Volume node: @airresistance *= fit(length(volumevelocity), 0, value, 0, 1); value = the speed value where you want the resistance to be full. However, this is not referencing density, and so far, isn't working anyway - but I get the idea.... Can anyone advise on the best steps to do this?
-
I'm trying to create a Vector parameter using VEX on an Attribute Wrangle. None of the channel functions, including chv() seem to work. Does anyone know why?
-
I'm leaving this file here in case you want to sort the point order of a triangle sphere. Its not particularly usefull but I was tasked with that challange and thats what I came up with... Hope it helps, and if any of you has a better method feel free to share! sorting_a_triangle_sphere.hip
-
- sort
- point sort
-
(and 3 more)
Tagged with:
-
-
These are some basic ideas that I used when creating the Saliva for movies like Hellboy (2019) and Manikarnika: Queen of Jhansi (2019). The main goal was to be able to Art Direct everything anytime as there were over 14 shots where the Supervisor and Director had very specific notes. Visit my blog for more articles on Houdini Blog: https://sharanvaswani93.wixsite.com/s... Email: sharan.vaswani93@gmail.com