Skip to content
McDowell Blog

Rotating between protein states in Houdini

Jul 1, 2025 — Proteins, Houdini

The Problem

When using blendshapes to animate two states of a protein you can get nasty artefacts where the protein crosses itself. Each aminoacid (point) is travelling on a linear path, paying no attention to it’s surroundings. It looks bad. The animation will be floaty and feel off in a way that’s hard to put your finger on.

This is where the Rotatotron comes in. It rotates part of the protein and is guaranteed to hit the locations from the .pdb. It’s a bit hacky but it works and can look nice.

Setup

Select a cluster of points to treat as a whole (usually done by eyeballing). The cluster should more or less stay together as a whole. This can be a whole chain, part of a chain, or multiple chains.

Use Extract Rotation from position A to position B and vice versa. This wil give you two points with two quaternions. It works because Houdini’s Extract Rotation isn’t very fussy, it isn’t bothered by the deforming geo, just as long as the point count is the same.

Place the geometry of position B exactly over position A, with a copytopoints. If you’re doing it right, Position A and B should now look roughly the same, no big rotations. Doing a linear blendshape between these two looks fine, just a little wiggle on the spot.

On this wiggly unit you perform a quaternion slerp. This will look like a rotation around it’s centre. At the same time blend the two points from the Extract Rotation nodes. It’ll give a good result if you trigger the blendshape and slerps with the same 0-1 bias. The blendshape creates a straight line. You could fancy this up by making it a nice curve, but you run the risk of exacerbating floatiness.

If you’re just using part of a chain, the border between rotating and non-rotating part can look funny. I’ve found it looks best if you use multiple sequential groups rotating seperately on a chain.

Final Result

BONUS 1: You can also use this to align two states of a protein. Eyeball which bit looks to stay in place, blast the rest away and do an Extract Rotation comparing A and B. Use the point this gives you on a copytopoints for the full geometry of B. Tadaa! They are now aligned.

BONUS 2: Add a wee bit of anticipation/follow-through with CHOPS. I connect the positional bias directly, and then feed it through a Jiggle CHOP to use as rotational bias. The protein will clunk into place and have a bit of rotational overshoot.

If you have any questions feel free to send me an email (opens in a new window).

Download example file (opens in a new window)
Expects the following pdbs: 5ARA (opens in a new window), 5ARH (opens in a new window), 5FIK (opens in a new window)