I've wanted a Simple Transform modifier for ages.. using an Axis/Origin object, by vertex weight. I'm thinking Geometry Nodes will make it possible to construct our own.

I would like to have been able to answer this question with Geometry Nodes.

Is there a reasonable way to rotate or scale mesh vertices / points about an arbitrary origin, without effectively composing your own transform matrix? Point Rotate gives each point an orientation about itself, but I'm looking to rotate their positions. Vector Rotate doesn't distribute across another vector attribute.

Unless I'm missing something, someone else has done it, or there are plans, I'll start rolling-my-own node groups.

  • $\begingroup$ Just to give you a general idea, without a full answer, you can rotate (or scale) about arbitrary centers by first translating your origin of rotation to 0,0,0, then rotating, then doing the inverse of your translation (just multiplying the original translation vector by -1.) This is a useful technique elsewhere, like shader nodes, as well. $\endgroup$
    – Nathan
    Apr 23 at 15:46
  • $\begingroup$ @Nathan For sure! I just hoped someone had done / was planning to do that behind the scenes, in C, or however the nodes are implemented, so we wouldn't have to do a ton of plumbing. You don't happen to know whereabouts the code is, do you? Probably not useful, anyway, unless I build Blender, and familiarize myself with all that plumbing.. I'm not sure I want that commitment. $\endgroup$ Apr 23 at 15:55
  • $\begingroup$ @Robing Betts Well, the transform is all of four nodes-- 3 transform and 1 vector math. Not sure offhand what you need to do to VG limit it, 2.92 doesn't really seem to support that yet. If you want to node group it, then it's pretty easy to use. Your "simple transform" modifier, btw, is just a single bone armature. $\endgroup$
    – Nathan
    Apr 23 at 16:08
  • $\begingroup$ @Nathan On the bone (or hook) yes, I get that, now. Can't help thinking like a modeller. :) 4 nodes? I don't get that.. must be dim. Maybe I'm trying to be too general.. I was thinking of clobbering together a vector-matrix multiply group, and maybe dupe that into a matrix-matrix multiply, but only if I had to. $\endgroup$ Apr 23 at 16:29
  • $\begingroup$ @Robit Betts Okay, then you made me figure out how to VG limit in 2.92 and you get a full answer :) Four nodes for the transformation, everything else is to VG limit. $\endgroup$
    – Nathan
    Apr 23 at 17:11

Interesting question!

enter image description here

The blend file above contains a moving weight modifier and two rotating pivot points. The mesh is rotated around the pivot points influenced by the weight value by geometry nodes.

enter image description here enter image description here

Add the weighted_rotation node network to your target, provide it a object as pivot point and you're done. The weight group is optional; if it's not available the modifier just rotates around the pivot point.


  • $\begingroup$ Wow! You've gone and done it! At first sight, that is composing the matrix, to all intents and purposes? I'll check it out tonight. Thanks! $\endgroup$ Apr 23 at 15:44
  • $\begingroup$ Well, I was trying to avoid all the work you've put in, hoping for slick-trick.. :D. But I don't think there is one, yet, and you've done it .. I hope this group will be useful to others. Thanks, too, for the consideration, making it readable! $\endgroup$ Apr 25 at 7:31

Okay, you get a full answer :)

enter image description here

We're making a backup copy of our original positions in a new vector-type attribute. Then we're rotating our regular geometry, by first translating our center of rotation to 0,0,0, then rotating, then translating by the inverse of our original rotation. That's the basic technique for rotating or scaling about any arbitrary position.

We've rotated our geometry successfully, but we want to limit it by vertex group. So we find the difference between our new position and our old position, multiply that difference by the inverse of our vertex group, and add it back in. We're interpolating between our original position and our new position on the basis of our vertex group.

This is like rotating an armature without volume preservation, by the way. Because we're interpolating linearly between two positions, 0.33 weight at 90 degrees rotation doesn't actually mean 30 degrees rotation, and there can be some volume loss. Volume preservation would add considerably to the complexity, and I can't think of a single out-of-the-box modifier that doesn't act this way; even a VG limited armature mod with volume preservation causes this kind of behavior, it's only the bones' VGs that preserve volume, not the modifier's VG.

This would probably be easiest to use by dividing it up into two different node groups: a rotate about group, and an interpolate attribute group. Because geometry needs to be calculated serially, it's probably necessary to backup your position outside of those groups.

To answer your reasons for wanting this, I'm sorry that you waited for geometry nodes, because a single bone armature or a warp modifier (with no falloff) can do any arbitrary transformation, limited by vertex groups. Either is probably a better solution, because they're simpler to set up, more optimized, and easier to control.

  • $\begingroup$ Aaaah! Thank you! I had the wrong end of the stick about the Transform node, not really appreciating it worked in Object space.. (Edit mode). So your linear, shape-key style interpolation copes with scaling and translation just fine, doesn't it? So all that's missing is a true Attribute Rotate equivalent.. which does take a bit of plumbing, as @null has done. The 'reasons' are really to compose deforming modifiers, dependent on attributes not accessible through the built-ins.. which I can see my way to much more easily now. Don't know who to tick, now. Both helped a lot. $\endgroup$ Apr 23 at 20:47
  • $\begingroup$ @Robin Betts Thinking a bit more, volume preservation probably would be possible, and I haven't looked at null's solution. It would add considerably to the complexity, and (almost?) all existing Blender modifiers interpolate this way when using VGs anyways-- which most people are fine with, they don't even ever realize it. $\endgroup$
    – Nathan
    Apr 23 at 21:45
  • $\begingroup$ I download the example blend from Chris. I open it 3.0a (Aug 10th build). I switch to geometry nodes. NO geometry nodes. Where are they hiding? What am I missing? I try creating a new file and appending from the download - same result. $\endgroup$
    – unkerjay
    Aug 11 at 23:45
  • $\begingroup$ This, by comparision works. I don't understand the difference. : blend-exchange.com/b/NAXXzAZA $\endgroup$
    – unkerjay
    Aug 12 at 0:06

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.