Yunus Balcioglu

animatrix_

About Me

Senior FX Technical Director @ Industrial Light & Magic | Feature film credits include The Lord of the Rings: The Rings of Power, Marvel's Eternals, Star Wars: The Rise of Skywalker, X-Men: Dark Phoenix, X-Men: Apocalypse, Aquaman, Alien: Covenant, Pirates of the Caribbean, Justice League and many m...  more
EXPERTISE
Technical Director
INDUSTRY
Film/TV

Connect

LOCATION
Singapore, Singapore

Houdini Skills

ADVANCED
Procedural Modeling  | Digital Assets  | Mantra  | Pyro FX  | Fluids  | Destruction FX  | VEX  | Python
INTERMEDIATE
Realtime FX

Availability

Not Specified

My Tutorials

obj-image Advanced
Pragmatic VEX: Volume 1

My Talks

obj-image HIVE
Adaptive Fracture Synthesis and Propagation in VEX
obj-image HIVE
Face Peeling Using KineFX
obj-image HUG
Retiming Ocean Spectra & The Pragmatic Approach to Solving Technical Problems in VFX

Recent Forum Posts

How can you read parametric UVs in vex? Aug. 24, 2026, 12:27 p.m.

stereocolor
I just ran into an issue when trying to use pointprimuv on a nurbs grid, I only the first component, v is all 0.

I managed to work around it by first storing the u value in a wrangle, then swapping the U and V using a primitive properties sop, storing the "new u" value in another wrangle, then swapping it back again.

Am I missing something obvious or is this a bug?

NURBS have poor support in Houdini, especially in VEX, so I would not be surprised if this is a bug.

For example, if you start using functions like xyzdist() on NURBS geometry, the performance will tank compared to polygonal geometry.

As for pointprimuv() specifically, I had actually implemented my own version of this and submitted it to SideFX as an RFE before the function was later added to Houdini.

I also showed my original implementation in this Tokyo HIVE presentation if you want to see a practical use case:

[VEX] Using "nearpoint" function WITHOUT including itself? Aug. 24, 2026, 12:13 p.m.

Hi,

You can just remove the current point from the returned array using the removevalue() function, then take the first remaining point:

int pts[] = nearpoints ( 0, @P, 10 );
removevalue ( pts, @ptnum );

int nearpt = pts [ 0 ];

It is better to explicitly remove @ptnum rather than assume the first returned point is always the point itself. With point cloud functions like nearpoints(), pcfind(), pcopen(), etc., that is not guaranteed with coincident points or equal-distance cases.

Pragmatic VEX: Volume 1 [4K] [H20] Aug. 17, 2026, 3:45 p.m.



https://www.patreon.com/animatrix/posts/flow-of-swirl-166952784?pr=true [www.patreon.com]

Following up on my previous Swirl COP filtering tests, this update focuses on the deformation model itself: how multiple overlapping swirls are combined.

The Houdini 22 implementation processes its point-driven swirl maps sequentially. Each map receives the position produced by the previous map, giving an ordered composition:
p_out = F_n    F_1(p)

Because nonlinear maps do not generally commute, changing the point order can change the resulting deformation.

The custom implementation instead constructs a stationary velocity field by summing the contribution from every swirl at the same current position:
v(x) = Σ v_i(x)

The output position is the time-one flow of that combined field, obtained by solving:
dx/dt = v(x)

All swirl contributions therefore interact during integration rather than being applied as completed transforms one after another. Reordering the swirl points does not change the mathematical field, apart from floating-point accumulation differences.
The flow is solved primarily with adaptive Dormand–Prince 5(4), using an embedded error estimate to control the integration step size. Fixed-step RK4 remains available as a reference and as an explicitly reported recovery path if the adaptive step budget is exhausted.

Each swirl contribution uses a compact C2 quintic support falloff, while the center singularity is regularized relative to the swirl radius. These choices keep the combined field smooth across influence boundaries and independent of output resolution.
This is an implementation comparison rather than a strict one-variable A/B: the stock node uses sequential map composition, while the custom node integrates the flow of a superposed velocity field.