I've got this fairly complex setup of a tom-tom drum here. My goal is to be able to scale the drum to different sizes and have the models around it scale and move into position as required, so that a simple scale operation gives me different sizes of drum that don't look out of proportion.

Here is the main body of the drum (called a drum shell in real life). It is parented to an empty plain axes which is positioned at the centre of the drum itself. The body of the drum and the plain axes have their origin points at the centre of the drum too.

body of drum with plain axes element at the centre

And the following is one of the drum lugs on the outside of the drum shell. drum lug

There is just one object here, but it is duplicated using an array and a mirror modifier. The array modifier creates the duplicates around the body of the drum, and the mirror modifier creates a duplicate set of those for the bottom of the drum. This way I can model a single lug and place it around the drum multiple times.

The lug is parented to a plain axes object (called the lug multiplier point in my scene), which is at the centre of the drum with a origin that is also at the centre of the drum. The array modifier for the lug also uses this as an object offset. This way, I can rotate this plain axes object in order to better position the lug duplicates around the drum - by dividing their count by 360 to get the Z-axis rotation value.

All of those elements are here: all lugs with rotational plain axes object

The same thing happens with the lug tension rod, and the lug holes on the drum hoop, as in the following image: lug tension rod and hoop hole, with rotational plain axes

Finally, I have the drum shell, drum skin, and drum hoop all parented. The hoop and skins are mirrored also, to create their relevant counterparts on the bottom of the drum.

Main drum elements

So all of this works pretty well. I can change the number of lugs, tension rods, and hoop lug holes easily enough. I can also scale the drum and change the size of the hoop and skins along with the shell.

What I now want to do is be able to change the positions of the outer elements when scaling the drum, so that everything maintains it's proportion - the outer elements should not scale their size, they should just change position. I can't quite get this to work.

I've tried parenting the lug to the drum shell using object parenting but that just links position and scale. I've also tried parenting the lug to a vertex on the drum body. But I get a very odd result where the lug positions are completely out of whack. I think that's to do with the array modifier. I just can't figure this out.

Anyone got any advice on how to essentially shift the original lug elements across the X axis, away from it's origin point so that it maintains its distance from the outer shell? I'd like to do this based on scaling the shell if possible.

If I edit the lug in edit mode and shift the vertices manually across the X axis, then I get the repositioning behaviour I want.


2 Answers 2


You can actually parent to a vertex to achieve something like this.

I would probably parent empties to the vertices where you want to add a child object and you can then use constraints (such as 'Copy Location', 'Copy Rotation') or make that empty a parent of your child object to link your child object to there.

To achieve this, create the empty and move it to the location of the vertex. Select the empty, hold Shift and select the 'parent' object. Hit Tab to go into Edit mode (you should now be in Edit mode with both the 'parent' object and the empty selected). Select just the vertex and press Ctrl+P to Make Vertex Parent. The empty should now be linked to that vertex.

Next simply add a 'Copy Location' constraint to the 'child' object to copy the Empty's location (this is similar to parenting) and a 'Copy Rotation' to the 'child' to copy the rotation of the 'parent' object. This way it will stay at the location of the vertex but with the rotation of the parent object, ignoring all scale.

I hope this makes sense - only limited time to submit this answer. I can add more detail if this seems helpful (unless someone else wants to add a more detailed answer along similar lines).

  • $\begingroup$ Is it worth mentioning with copy location constraint can target a vertex group $\endgroup$
    – batFINGER
    Jun 23, 2020 at 12:12
  • $\begingroup$ It's a good point @batFINGER. I did think that but I believe you need to create a vertex group for each child object... I thought that might be too cumbersome... it's a good suggestion though. $\endgroup$ Jun 23, 2020 at 12:21
  • $\begingroup$ Lol was thinking adding empties was cumbersome. IMO Much of a muchness choose vert, assign to vert group vs add empty parent to vert. $\endgroup$
    – batFINGER
    Jun 23, 2020 at 12:30
  • $\begingroup$ Hey guys, thanks very much. I understand all this and have done a couple of tests with cubes to make sure I do indeed get it. It works great, but I don't understand how to do it in tandem with array and mirror modifiers. $\endgroup$
    – DrewTNBD
    Jun 23, 2020 at 12:40
  • 1
    $\begingroup$ @DrewTNBD I think you’ll need to resort to scripting to be a le to cope with mirror and array modifiers. In theory it should be possible to have a script process each of the modifiers and clone the child object(s) to the mirrored/arrayed location and set rotation. I imagine it would be quite an undertaking though. $\endgroup$ Jun 23, 2020 at 13:19

If you create a Child Of constraint for the child objects, you will have the option to decide which transforms come along with the parent and which are left independent. Below is a cube parented to another cube in this way. The Scale checkboxes have been unticked.

enter image description here

And the result is that the child moves when the parent moves... enter image description here

... but the child doesn't scale when the parent scales.

enter image description here


You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .