Animation: Replacing bone layers + groups with bone collections #108941
Open
opened 2023-06-13 17:08:37 +02:00 by Sybren A. Stüvel
·
15 comments
No Branch/Tag Specified
main
blender-v4.0-release
temp-sculpt-dyntopo
blender-v3.6-release
universal-scene-description
blender-v3.3-release
asset-browser-frontend-split
brush-assets-project
asset-shelf
anim/armature-drawing-refactor-3
temp-sculpt-dyntopo-hive-alloc
tmp-usd-python-mtl
tmp-usd-3.6
blender-v3.5-release
blender-projects-basics
blender-v2.93-release
temp-sculpt-attr-api
realtime-clock
sculpt-dev
gpencil-next
bevelv2
microfacet_hair
xr-dev
principled-v2
v3.6.4
v3.6.3
v3.3.11
v3.6.2
v3.3.10
v3.6.1
v3.3.9
v3.6.0
v3.3.8
v3.3.7
v2.93.18
v3.5.1
v3.3.6
v2.93.17
v3.5.0
v2.93.16
v3.3.5
v3.3.4
v2.93.15
v2.93.14
v3.3.3
v2.93.13
v2.93.12
v3.4.1
v3.3.2
v3.4.0
v3.3.1
v2.93.11
v3.3.0
v3.2.2
v2.93.10
v3.2.1
v3.2.0
v2.83.20
v2.93.9
v3.1.2
v3.1.1
v3.1.0
v2.83.19
v2.93.8
v3.0.1
v2.93.7
v3.0.0
v2.93.6
v2.93.5
v2.83.18
v2.93.4
v2.93.3
v2.83.17
v2.93.2
v2.93.1
v2.83.16
v2.93.0
v2.83.15
v2.83.14
v2.83.13
v2.92.0
v2.83.12
v2.91.2
v2.83.10
v2.91.0
v2.83.9
v2.83.8
v2.83.7
v2.90.1
v2.83.6.1
v2.83.6
v2.90.0
v2.83.5
v2.83.4
v2.83.3
v2.83.2
v2.83.1
v2.83
v2.82a
v2.82
v2.81a
v2.81
v2.80
v2.80-rc3
v2.80-rc2
v2.80-rc1
v2.79b
v2.79a
v2.79
v2.79-rc2
v2.79-rc1
v2.78c
v2.78b
v2.78a
v2.78
v2.78-rc2
v2.78-rc1
v2.77a
v2.77
v2.77-rc2
v2.77-rc1
v2.76b
v2.76a
v2.76
v2.76-rc3
v2.76-rc2
v2.76-rc1
v2.75a
v2.75
v2.75-rc2
v2.75-rc1
v2.74
v2.74-rc4
v2.74-rc3
v2.74-rc2
v2.74-rc1
v2.73a
v2.73
v2.73-rc1
v2.72b
2.72b
v2.72a
v2.72
v2.72-rc1
v2.71
v2.71-rc2
v2.71-rc1
v2.70a
v2.70
v2.70-rc2
v2.70-rc
v2.69
v2.68a
v2.68
v2.67b
v2.67a
v2.67
v2.66a
v2.66
v2.65a
v2.65
v2.64a
v2.64
v2.63a
v2.63
v2.61
v2.60a
v2.60
v2.59
v2.58a
v2.58
v2.57b
v2.57a
v2.57
v2.56a
v2.56
v2.55
v2.54
v2.53
v2.52
v2.51
v2.50
v2.49b
v2.49a
v2.49
v2.48a
v2.48
v2.47
v2.46
v2.45
v2.44
v2.43
v2.42a
v2.42
v2.41
v2.40
v2.37a
v2.37
v2.36
v2.35a
v2.35
v2.34
v2.33a
v2.33
v2.32
v2.31a
v2.31
v2.30
v2.28c
v2.28a
v2.28
v2.27
v2.26
v2.25
Labels
Clear labels
This issue affects/is about backward or forward compatibility
Issues relating to security: https://wiki.blender.org/wiki/Process/Vulnerability_Reports
Apply labels
Interest
Alembic
Interest
Animation & Rigging
Interest
Asset Browser
Interest
Asset Browser Project Overview
Interest
Audio
Interest
Automated Testing
Interest
Blender Asset Bundle
Interest
BlendFile
Interest
Collada
Interest
Compatibility
This issue affects/is about backward or forward compatibility
Interest
Compositing
Interest
Core
Interest
Cycles
Interest
Dependency Graph
Interest
Development Management
Interest
EEVEE & Viewport
Interest
Freestyle
Interest
Geometry Nodes
Interest
Grease Pencil
Interest
ID Management
Interest
Images & Movies
Interest
Import Export
Interest
Line Art
Interest
Masking
Interest
Metal
Interest
Modeling
Interest
Modifiers
Interest
Motion Tracking
Interest
Nodes & Physics
Interest
OpenGL
Interest
Overrides
Interest
Performance
Interest
Physics
Interest
Pipeline, Assets & IO
Interest
Platforms, Builds & Tests
Interest
Python API
Interest
Render & Cycles
Interest
Render Pipeline
Interest
Sculpt, Paint & Texture
Interest
Text Editor
Interest
Translations
Interest
Triaging
Interest
Undo
Interest
USD
Interest
User Interface
Interest
UV Editing
Interest
VFX & Video
Interest
Video Sequencer
Interest
Virtual Reality
Interest
Vulkan
Interest: Wayland
Legacy
Blender 2.8 Project
Legacy
Milestone 1: Basic, Local Asset Browser
Legacy
OpenGL Error
Meta
Good First Issue
Meta
Papercut
Meta
Retrospective
Meta
Security
Issues relating to security: https://wiki.blender.org/wiki/Process/Vulnerability_Reports
Module
Animation & Rigging
Module
Core
Module
Development Management
Module
EEVEE & Viewport
Module
Grease Pencil
Module
Modeling
Module
Nodes & Physics
Module
Pipeline, Assets & IO
Module
Platforms, Builds & Tests
Module
Python API
Module
Render & Cycles
Module
Sculpt, Paint & Texture
Module
Triaging
Module
User Interface
Module
VFX & Video
Platform
FreeBSD
Platform
Linux
Platform
macOS
Platform
Windows
Priority
High
Priority
Low
Priority
Normal
Priority
Unbreak Now!
Status
Archived
Status
Confirmed
Status
Duplicate
Status
Needs Info from Developers
Status
Needs Information from User
Status
Needs Triage
Status
Resolved
Type
Bug
Type
Design
Type
Known Issue
Type
Patch
Type
Report
Type
To Do
No Label
Interest
Alembic
Interest
Animation & Rigging
Interest
Asset Browser
Interest
Asset Browser Project Overview
Interest
Audio
Interest
Automated Testing
Interest
Blender Asset Bundle
Interest
BlendFile
Interest
Collada
Interest
Compatibility
Interest
Compositing
Interest
Core
Interest
Cycles
Interest
Dependency Graph
Interest
Development Management
Interest
EEVEE & Viewport
Interest
Freestyle
Interest
Geometry Nodes
Interest
Grease Pencil
Interest
ID Management
Interest
Images & Movies
Interest
Import Export
Interest
Line Art
Interest
Masking
Interest
Metal
Interest
Modeling
Interest
Modifiers
Interest
Motion Tracking
Interest
Nodes & Physics
Interest
OpenGL
Interest
Overrides
Interest
Performance
Interest
Physics
Interest
Pipeline, Assets & IO
Interest
Platforms, Builds & Tests
Interest
Python API
Interest
Render & Cycles
Interest
Render Pipeline
Interest
Sculpt, Paint & Texture
Interest
Text Editor
Interest
Translations
Interest
Triaging
Interest
Undo
Interest
USD
Interest
User Interface
Interest
UV Editing
Interest
VFX & Video
Interest
Video Sequencer
Interest
Virtual Reality
Interest
Vulkan
Interest: Wayland
Legacy
Blender 2.8 Project
Legacy
Milestone 1: Basic, Local Asset Browser
Legacy
OpenGL Error
Meta
Good First Issue
Meta
Papercut
Meta
Retrospective
Meta
Security
Module
Animation & Rigging
Module
Core
Module
Development Management
Module
EEVEE & Viewport
Module
Grease Pencil
Module
Modeling
Module
Nodes & Physics
Module
Pipeline, Assets & IO
Module
Platforms, Builds & Tests
Module
Python API
Module
Render & Cycles
Module
Sculpt, Paint & Texture
Module
Triaging
Module
User Interface
Module
VFX & Video
Platform
FreeBSD
Platform
Linux
Platform
macOS
Platform
Windows
Priority
High
Priority
Low
Priority
Normal
Priority
Unbreak Now!
Status
Archived
Status
Confirmed
Status
Duplicate
Status
Needs Info from Developers
Status
Needs Information from User
Status
Needs Triage
Status
Resolved
Type
Bug
Type
Design
Type
Known Issue
Type
Patch
Type
Report
Type
To Do
Milestone
Set milestone
Clear milestone
No items
No Milestone
Projects
Set Project
Clear projects
No project
Assignees
Assign users
Clear assignees
No Assignees
9 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.
No due date set.
Dependencies
No dependencies set.
Reference: blender/blender#108941
Reference in New Issue
There is no content yet.
Delete Branch "%!s(<nil>)"
Deleting a branch is permanent. Although the deleted branch may exist for a short time before cleaning up, in most cases it CANNOT be undone. Continue?
This design describes the replacement of armature bone layers & bone groups with a new bone collections system.
Implementation is in #109976 and #112271.
Goals
Properties of the System
IDProperties
(aka Custom Properties) for use by add-ons.Operations
These operations can be performed on/with bone collections:
User Interface
For Blender 4.0 the UI is kept intentionally simple. I'm thinking of reusing the Bone Groups interface, with the addition of a few per-collection icons (visible, selectable, color palette) as well as an indicator of which collection(s) contain the selected bone(s).
Conversion from Old to New
Layer {NUM}
collections.{name}
collections.SelSet {name}
collections.Uses of the Current System
Bone Layers
Bone Groups
Edit Mode vs. Pose Mode
This describes Blender's current behavior:
¹⁾ The new system should allow these in Edit mode too.
²⁾ Bones can only be hidden, which is separated between edit mode & pose mode.
Future Work
These are ideas for future improvements / extensions:
Code Location
This work will kickstart a new module in
source/blender/animrig
. This will become the place for new animation/rigging related code. The intention is that also a subset of the already-existing animation-related code from bothblenkernel
andeditors
is going to move there, to help clean up the API and make it more consistent.Ongoing Work
Targets for 4.0-bcon1: tracked in #109976
Targets that could be pushed back to 4.0-bcon2:
83306754d4
).Potential push back to later:
if collections are used for coloring
and a bone can be in multiple collections
what defines the color of the bone
This all seems reasonable.
Some questions that spring to mind:
There's no current plan. That's more a personal fantasy of mine. Realistically, I doubt that will happen for Animation 2025.
I still have hopes that it could happen some time post-Animation-2025, but you're certainly right that there are trade-offs involved there that would need serious consideration.
As Nathan said, this would require quite a bit of design work, as we'd still want to keep the 'namespacing' aspects of armatures, as well as the reusability between different characters. What we are pondering on is more unification of tooling, and maybe expose new APIs to make such tooling easier, so that what's now limited to pose mode/bones (like 'blend to neighbour') can be applied to objects as well.
The animation workshop in 1½ weeks should end in a presentation about more concrete plans for the project, which should clear up confusions like this.
👍
I'll include that in the 'Future Works' section, as that's indeed something we've discussed, but not yet come to a concrete design/plan for yet.
We'll have a think about this, maybe before we actually get around to merging we rename things to 'bone sets' instead.
About the name, I just had a little back-and-forth with @JulianEisel and he made a good point: with face sets the hierarchy doesn't matter, it's just a flat list of 'this set contains these faces'. This 'there is no hierarchy' aspect for him maps to the term 'sets', whereas the intention here is to have (eventually) a hierarchy. This matches the existing 'collections' concept better. On top of that, the operations (set selectability, visibility) matches the scene collections.
So let's keep the 'bone collections' name.
After various discussions (mostly in A&R module meetings) we've come to the following changes:
@dr.sybren I have nothing really to offer except curiosity.
Grease Pencil use to have a way of assigning colors to layers (Not intuitive and kinda hidden). It was basically a simple swatch of color when clicked that would bring up a color picker menu. The Grease pencils feature didn't color the layer in properties, however, the color would show up in the dope sheet (was incredibly handy).
A similar system may be able to be used for bones simplifying the process. Users could select multiple bones then the user would alt-click the swatch to change the colour to change multiple bones colors at a time. Making the colors visible in the dopesheet and the curve editor as an option would be super handy as well.
@brecht having bones be a geometry would make setting up handles for rigs way easier to deal with. The user would be able to cut up their geometry, separate it by parts, and then join it to the bone. This would make the armature look like the bone. This might also improve weight painting as well because the bone is the mesh you are rigging. Still a lot of steps in the setup but handy to have around.
I wonder if Facemaps could be utilized in this area?
here is where you can find the grease pencil channel colors
I wonder how we can provide the ability for users to change the colors of a set of already similarly colored bones at the same time, like they can do today.
An operator to "force the selection" of bones with similar colors won't really do the trick, since bones can be unselectable.
So, a better solution would be a pop-up menu operator with color pickers that affect all bones with a similar color as the active bone at the time the operator is invoked. As we change the colors in the pop-up, we see live feedback in the 3D view. Hidden and un-selected bones are also affected. And this last sentence hurts a bit, because that is not really how Blender usually works, which makes this sound more like an add-on behaviour.
But I do think we should be able to have all the power of the old behaviour without having to enable add-ons, which is why I think this should be a built-in operator. Perhaps make it explicit in the operator UI that this is affecting all bones, not just the selected ones.
This is similar to today's "Select Similar (Shift+G) -> Layer" operator, which has a big problem: If your bone is in many layers, this operator will always select more things than you would ever intend.
I would propose this should instead provide a list of the collections that the bone is in, and have the user specify just one of those, which they want to select.
This could then have some settings; Do you just want to select the bones in this collection that are already visible? Or do you want to unhide the ones that are hidden (even if that means un-hiding some collections)? What about hiding bones that aren't part of this collection?
If all those options can be supported (and perhaps more), then we don't need SelectionSets anymore, either. And my sentiments from earlier apply here too: I hope these (imo basic) things can be a part of core Blender, instead of having to enable an add-on.
I attached a video of some custom UI that I've been using for years to manage my bone groups. May it inspire. I won't embed it since it's not really relevant, it really is just meant as a vague inspiration.
I've just committed support for 'Copy to Selected' behaviour. The bone colours aren't just a colour swatch though, but allow selection from a set of themable colours. That way individual artists can tweak the colours to their taste / needs (for example to compensate for colour blindness).
Altering what bones are & how they are stored is out of scope for this PR.
Those are good points, I'd have to think about a good solution here.
Sounds good.
Again, good points.
That looks pretty nice.
For now I'm trying to get the basics of the basics in, with the right data-model and versioning code to make sure files are converted properly. After that we can definitely do a less-vague inspiration session to see what kind of nice tooling we can build on top of this.
Some python API addition ideas:
bone.collections.clear()
to remove the bone from all collections (although it's redundant toset([])
).bone.collections.set([...])
to replace the collection list, mainly so you can dobone1.collections.set(bone2.collections)
instead ofbone1.layers = bone2.layers
, but obviously also allow a python list argument. Maybe also allowset([...], replace=False)
(orappend=True
) to support batch add.collection.bones
to retrieve all bones belonging to the collection - they seem to actually already have that data, although it's not up to date in edit mode (maybe check the mode and throw an exception then?..).Hello there! Thank you for the work on the new bone collections.
In blender 3.6 and earlier, you are able to hide all layers but the one you need by simply clicking on it, and you can make several layers visible or not with ctrl or shift.
However, I can't find a way to reproduce this behavior with the new system in 4.0
If I have 10 bone collections and I want to see only collection 6 for example, how do I hide all the others collections without having to click the eye for each and every one?
I know it is possible to slide the mouse over the eyes on all groups while holding click to disable them quickly, but this wouldn't really work when the groups I want to see are separated.
Good point, that was an oversight. It's there now:
In Pose mode Ctrl-~ (tilda) shortcut is still there for enabling all layers, but doesn't work on collections and expects old RNA.
I would also suggest changing it to other shortcut since Ctrl-~ is toggle gizmos in 3D viewport, and quite an useful shortcut, comes into conflict with this. Perhaps since Shift-M is for collections Alt-M could be the key, similar to Alt-H - reveal all.