Mesh tools and non-uniformly scaled objects

There are a couple mesh tools (bevel and inset are the ones that I can think of right now) whose behavior is unintuitive (some would say “buggy”) when used on objects that have been scaled non-uniformly (that is, different scale factor on some axes compared to others).

It is a very common confusion for newcomers why “bevel looks strange” on some object, whereupon some more experienced Blender user explains: “apply Scale”.

The reason for the strange behavior is that the tools operate on the geometry of the original, not the version with various transforms applied.

I remember running into this “bug” when first implementing bevel, and asking other developers, was told “this is working as intended”. Certainly inset was doing the same thing. I think I may have even tried some other software and found the same behavior, though my memory is fuzzy on that. So I left that behavior as is.

But I have recently been wondering whether that is really what we want? It certainly adds a little more unintuitiveness to Blender for new users. So should we change this behavior for 2.8?

The upside would be that people would have to spend less time learning and/or remembering to apply scale. Another upside is that in multi-object beveling, the bevels will not look strangely non-uniform when different objects have different scales. Yet another one would be that the ‘bevel amount’ or ‘inset amount’ would have absolute meaning that is understandable in the scene, rather than one that varies with the scale.

A downside would be that the bevel and inset tools would have to get more complicated: they’d have to (at least in the case where there’s non-uniform scale) apply the model transform matrix to all of the vertices before doing the operation, and then apply the inverse transform afterwards. Another downside is that this would not be backwards compatible so old files that have bevel modifiers on non-uniformly scaled objects would look different (this could be avoided with versioning code in Blender, but I’d rather not have to do that – I think it is very uncommon to have codepaths in Blender depend on versions - it’s usually just affecting file loading). A final downside might be that the current behavior (different bevel amounts on different faces either side of an edge) is actually useful in some modeling circumstances.

Also, would this just open a can of worms where other things that I’m not knowledgeable enough to think of right now also depend on scale being applied in order to work well? I could think of, for instance, texture coordinates, texture painting, physics effects, …

What do people think? Also, can people think of other mesh tools that behave differently when the scale is non-uniform?

1 Like

I understand your position, but in every 3D application I’ve ever used scale behaves this way. When I’m teaching 3D I always explain to my students that scale is just a factor applied to your objects dimensions.

The problem with doing it the other way around is that someone models something on a scaled object and maybe down the line resets the scale and their modeling work is all out of whack.
Applying a scale ie easier to make the modeling work than having to remodel everything because your object was scaled.

I think when your tools don’t behave normally (ie. bevel), it’s more clear to the user that they’re working on a deformed object and will cause less issues in the long run as they’re able to correct it when they start modeling.

It’s a tricky issue, but probably I would leave the behavior as is.

I think the deeper issue is that most of the time users non-uniformly scale an object, it would have been better to scale the mesh instead. I don’t have good ideas on how to avoid or communicate that though.

OK, happy enough to leave at status quo - less work for me!

I agree with you Brecht about what people should scale (mesh, not object, usually).

If Blender had an identified “beginner mode” for the UI, one could imagine putting in info messages that are warnings and helpful hints somewhere in a message bar. So when someone tried to bevel a non-uniformly scaled object then the warning message could pop up saying “bevel results will be distorted - apply scale to avoid this”.

1 Like

I find alot of students having trouble with this too. It usually takes a few weeks to understand the difference between scaling in object vs mesh mode.

Aside from the bevel modifier, I think the edit mode bevel tool (as well as all edit mode tools) could benefit from ‘ignoring’ object transforms. It would be a bit more foolproof for students.

@Howard_Trickey I love the idea of a beginner mode UI with warnings…and maybe a few common hotkeys?

1 Like

I’m guessing the fact that scale affects bevel width will be more appearant now with multi object editing?

Like beveling two edges next to each other on different objects which have different scale will not result in the same bevel size… let alone non uniformly scaled objects.

I was thinking if it would make sense to make only the bevel values respect the scale ( I know this won’t work on non uniform transformed meshes) - though I’m not sure how much sense such a crude workaround makes.

But to be honest I think other improvements on the bevel behaviour should be higher on the list, like better topology on intersections etc.

This is an interesting topic. I wouldn’t mind if bevel and inset etc would take the scale into account and create ‘normalized’ results.

Think of all the basic transform tools, they already do this. When moving vertices on a mesh that has been scaled, we still modify them as if they were normalized. Your movements are, thankfully, not scaled (That would be terrible :slight_smile: )

I can’t think of many use-cases where users would not want this?

1 Like

Modifiers affected by scale:
Bevel, Remesh, Skin, Solidify, Wireframe, Edge Split (yes)

AFAIK inset is not a modifier although honestly that has been on my wishlist for so long (parametric buildings). It is true though that on more than one occasion I was baffled in Edit Mode while bevelling or insetting without it doing a thing only to find out the scale was 0.001 from Rhino which uses milimeters. But I think that is only fair and good to realize.

So tbh I think the way it works now is great the only super massive issue I see is that when users want to solve it on linked mesh data they get the “scale can’t be applied on multi-user object”. It happens quite a lot because it’s always great to have linked data and you can’t teach someone Shift+D without telling them about Alt+D.

So the way to go around this is to U > Unique Object Data >> Apply Scale (you lose differences in scale between objects) > Ctrl+L to link Object Data again…

or alternatively the better but more mathematically complex method (the one Blender should perform for you imo) is to Shift+L to Select all linked Object Data, then you look at object properties and let’s say the scale is 10.5 so you need to scale down 0.0952 and then you snap cursor to active (Shift+S), go into Edit Mode and with Pivot set to Cursor you scale the object up 10.5x… You should be left with the same but doing this for multiple objects is quite a lengthy process so I usually do the first option that works in 90% of cases well and leaves you with scale 1/1/1 clean objects.

Other issue that revolves around all this is the fact that even adding modifiers that produce exactly the same results from object to object (edge split, bevel, solidify, remesh, etc) onto objects that have the same linked mesh data it then creates unique geometry and not instances for objects when rendering or exporting. I know that linked data is not considered to be exactly the same mesh and you should use groups (collections) for that but it is very unintuitive to create groups for everything because they are harder to edit.

This is a more complex topic altogether though because you can have objects with slightly different modifier stacks and I suppose it will get tackled later when linked modifiers are actually a thing (through nodes I guess) because right now linking modifiers is actually copying as with any change to one object you need to relink again.

1 Like

Hi! Im switching to Blender and yeah, this thing was so strange for me! I used cinema 4d (still using it with blender) and it implemented very simply in c4d. All scale operation in the viewport leaves mesh scale 1 by default. If you want to change it- you should type scale manually in the object attributes tab. Thats why I never had the issue with bad scale on my models in the game engine. But guys who work with me in Blender and 3DS Max always need to check it before export and pres reset XForm (in max… but we call it the same in every software) And I don’t know any reason why you would like to change object scale everytime when you scaling it. It’s so rare operation and it would be better if scaling in object mode will leave scale as 1 (if it’s possible… I understand that we can’t just copy everything from our previous softwares and do the same in blender)

2 Likes

But what if you have 2 trees that share mesh data but are different sizes? Then if you scale one of them, does the other one also get bigger? I wonder how this is sorted in Cinema4D when you have instances of the same mesh data.

1 Like

So we need to have 3 scale compensation options for tools and modifiers.

  1. No scale compensation (tools work as they do now).
  2. Normalized scale compensation (dividing each axis scale by the smaller axis, then using those numbers to compensate non-uniform scaling or something like this, so the smallest axis scale is treated like if it had scale of 1), so when you scale whole object, bevel size will stay the same relatively to object size. I guess this would be nice default.
  3. Full scale compensation, that will keep absolute bevel size constant when you scale it, and will compensate distortion of non-uniform scaling.

Yeah, C4D’s approach is the best. I never had scale problems there. :v:

In c4d all instances are exactly the same in scale as their original object and you can’t just scale them manually without affecting others. But because of very powerful MoGraph module you can change their scale independently in procedural way, or via some modificators(ffd for example). Maybe it’s not the best solution for Blender, I don’t know, but I’m sure there could be some good solutions for blender as well, that will not change logic and individuality of Blender)

Yes you can…

1 Like

wow) Didn’t know that, I used mograph for that) 5 years in software and still you can find something new, thanks!
So maybe it can push to idea how to make it in Blender.

1 Like

I like that idea alot. (C4D style)
Scaling in object mode actually scales the mesh, leaves object scale at 1. (This is what the user wants most of the time)
Rotation and Location in object mode work as they do currently so the user can adjust the object center.

Object scaling is done with a modifier or a different hotkey.

I think this would be pretty fool proof and work for the majority of users.

(i hope youil understand my english… isnt my native language).
If Im not wrong, there is some cases when the current scaling functionality is actually do necessary.
for example, you can see the beautiful workflow shown by Cédric Lepiller with is SpeedFlow addone. Because he use modifiers for modeling, if they wil not consider the object scale/the scaling operation will not change the bbject scale, each time that youill scale the object the mesh would ruin, and if i not wrong, this problem aplly also to the screw, solidify etc.
Maybe its would be better if each modifier will has a checkbox that change between - global value/local value.
for the tool, I agree that global value should be the defult

I feel like we’re over complicating things and the most important question is:

What is the more common need/expectation when creating a bevel? I think the answer is a uniform bevel that ignores mesh scaling. I am certain that someone can come up with a situation where he needs the opposite behavior but, once again, what is more commonly needed?

“How hard is it to code” or “this will break bevels for previous files” are all valid concerns, but if this is going to be implemented then it would seem right now is the ideal moment to make such a change.

The current behavior might be of little consequence by itself, but it’s all the little things combined that have made blender hard to get into for so many years, I say go for it now!

TLDR
Ignoring mesh scaling provides the more common and intuitive result.

3 Likes