Made general edits. I also realized I didn’t specify exactly how my proposed Orient to Surface option would work so I’ve added that now.
Okay, now I want to specifically bring up the stuff @DanielBystedt, @LudvikKoutny and @DanPool were talking about in the task comments: https://developer.blender.org/T57210
I really like most of Daniel’s proposed ideas. I love the idea for booleans and Draw on Selected, those things would really make this tool more than amazing.
However, I think that it’s viable to eliminate the need for most of the current tool options, which would include letting the tool automatically decide the drawing plane.
I’ll show what I think the tool’s options can be reduced to further down. I hope I can also demonstrate that automatic plane selection isn’t a magical feature that would somehow guess what the user wants to do, or a feature that limits the user’s control, but that it’s actually a fairly straightforward solution to several issues of the tool, and it wouldn’t make any common usage of the tool more difficult.
You could think of it as a solution to some problems which has the side effect of making the tool much simpler to use.
I’ll start with some problems of the tool.
For these first examples, Depth is set to 3D Cursor Plane, and Plane Axis is set to Z. Basically this means the drawing plane is set to be the grid floor.
I’ve also set the grid floor to be an opaque blue color so that it’s more visible.
At low view angles to the drawing plane you can’t reasonably see the dimensions of the object you’re adding (except the height). It takes very little mouse movement to stretch the object several kilometers out. Controlling X and Y dimensions here requires an unreasonable amount of precision. Note the dimensions of the added object:
I think it’s fair to say that the user will always orbit their view so they can better see and control the added object’s dimensions. This defines one situation where it would be reasonable to change drawing plane axis automatically.
If the operation starts above the drawing plane’s horizon, the result is very difficult to control. The tool has no way to ascertain depth in this situation and chooses an arbitrary depth as a fallback. Because the fallback depth most likely contradicts the user’s selected Depth setting, the user can’t reasonably determine the dimensions and placement of the object. Remember my Depth is set to 3D Cursor Plane, but because I’m making objects above the horizon, the tool cannot respect that setting:
If, during an operation, the cursor crosses over the horizon of the drawing plane, the operation will suddenly invert, no longer following where the cursor actually is.
In this video, I do two operations: one starting on the grid floor, and one starting up above it. Watch what happens in both cases when my cursor crosses over the horizon.
Because of these three issues, it’s not useful to make objects at a low view angle to the drawing plane, or above it.
In these cases, it would make sense for the tool to choose a more suitable drawing axis automatically.
This would allow the tool to more often respect the user’s selected Depth setting.
Automatic drawing plane selection would only affect these “problem areas” which are too difficult to control, actually invert the user’s control, or which otherwise disregard the tool settings.
Therefore automatic plane selection would not negatively impact the use cases that the tool can accomplish, it would just solve these problems and at the same time simplify the usage of the tool.
The next issue pertains more to the tool options:
- It’s difficult to control the result when Orientation is set to Surface but the Depth to something other than Surface.
You have to calculate in your head using the click location on the surface and the depth of the actual drawing plane in order to determine where the object will actually be made, which seems too difficult and imprecise to be useful.
It’s a bit easier to do if you’re facing directly at the surface that you click on. But when you do that, the height of the object is coming right at you or away from you, and then that becomes more difficult to control.
Depth is set to 3D Cursor Plane and Orientation set to Surface:
I don’t think this combination of settings is more useful than it is confusing. Especially in comparison to, say, a “surface offset” setting the user could change which would place the object an arbitrary distance above or below the drawing plane. Grease Pencil has that feature, in fact. But I’m not arguing for that feature here…
Related to this point, I made a mistake in a suggestion from my previous post. I said:
I retract that, because I’ve realized there are common use cases in which a user might want to add an object at a surface’s depth, but not oriented to the surface. For a small example, like this:
(I made some loop cuts on the original object for easy snapping points.)
This is also a factor in how I’m proposing to simplify the tool.
Proposal / Solution:
I think that Add Object’s options can be reduced down to these (considering the tool’s current functionality, so this isn’t including the features Daniel proposed):
☐ Place On Surface
☐ Orient to Surface
(and the origin stuff too)
I excluded Surface from the Depth settings and added a separate toggle called “Place on Surface”.
If Place on Surface is turned on, then Depth can still specify what to do when the user adds an object in empty space. That way, the user could leave Place on Surface turned on while adding objects on and off of surfaces, without having to change settings and still being in control of Depth.
Like Daniel in his comment on the task, I excluded 3D Cursor View from Depth and added World Origin. I’m personally not against the inclusion of 3D Cursor View, I just don’t really understand how it could be used in practice. But I don’t think it causes any issues either.
Most importantly, Plane Axis and Orientation are gone and the only orientation option is the Orient to Surface toggle.
If Orient to Surface is enabled, it would basically be the same as setting Orientation to Surface and Plane Axis to Z in the tool now. I also think that Orient to Surface should be grayed-out and disabled if Place on Surface is turned off. As I said before, I believe the combo of surface orientation but non-surface depth is more confusing than it is useful. This would ensure the user doesn’t need to disable both toggles in order to avoid this confusing behavior.
Now, what could substitute the manual selection of a drawing plane axis?
I think the first three issues I listed in this post demonstrate that whenever the horizon of the selected drawing plane is on the screen, there is a potentially very large area in the viewport where the Add Object tool doesn’t work in a clear and useful way.
In these cases, it’s not difficult to determine what plane axis would be preferable and give more useful results.
Using the user’s view angle and cursor location, an ideal drawing plane can be found.
- Here’s a mockup I made in Unity of the most simplistic approach, where the drawing plane is chosen based solely on how much it faces the view. In my mockups you can consider the white sphere to indicate the depth, pretend it’s the 3D cursor:
Quite simply, it just “activates” the plane that is most perpendicular to the view.
However, this simple approach has a problem: if each plane axis has equal precedence in the tool’s automatic selection, you have to look down much more than what feels natural in order to place objects on the Z axis, the ground plane. This wasn’t apparent to me until I started mocking-up how the automatic plane selection could work, comparing it with a couple 3D programs that have automatic plane selection with object-drawing tools. In trying to figure out why one of the programs felt much more natural and intuitive, I realized that it had a heavy bias to the Z plane.
This makes sense to me, considering gravity and all the implications that has. It’s probably why Blender has a grid floor and the view orbits around the Z axis.
- Here’s a refinement to the first mockup. It chooses the drawing plane by how much it faces the view, but it’s biased toward the Z plane.
I’m just sorting the planes based on an absolute dot product of the view direction and the plane axis. I just multiplied this value for the Z plane by 3 before sorting.
Also, if the cursor goes above the horizon of the active plane, it falls back to the next best plane:
Here’s the same thing without the huge planes, just a floor and placement preview grid:
This behavior is already quite good. In fact, I think it’s already good enough to replace manual orientation, and it’s simple too.
I think there are ways it can be improved, and I’ve come up with some theories on how to do so. But as it is, this would already solve the issues I’ve brought up here, and I think it’s the simplest and best way to solve those issues.
One thing it would need is a simple indication (and it could be very simple) of the drawing plane: Some kind of shape drawn at the user’s cursor (maybe a square, maybe a grid), with the plane axis color, and aligned with the plane. I think even just that would be clear enough to make automatic plane selection effortless for the user.
I think automatic plane selection like this is more than sufficient to replace manual orientation options, and would still leave the user capable of achieving all the same common use cases as with manual selection, but with greater ease and fluency.
But what does everyone else think? Did I miss some important factors?