Face-Map 2.8 Proposal
Open, NormalPublic

Description

Update

Currently this project is postponed until we have a working Python-Widget API which will use face-maps in a generic way.

After this face-maps can be used as just one of the possible inputs for manipulators.

This means we don't need to depend on each face-map referencing a bone.

There is now a working proof of concept addon in contrib:


This design task is to outline the design for face-map usage in Blender2.8.

Note that there are lots of possible uses of face-maps, where they could be used as programmable widgets but that's out of scope for this document which focuses on getting initial planning, so it can be merged into 2.8 branch for continued development.

Motivation

The aim in having face-maps is to allow people to manipulate the rig quickly without having to select objects & switch modes, select the correct bone layers... etc.

Instead, users can make immediate adjustments.

Who Would Use This?

Face-maps have a similar purpose control bones.
Where a rigger exposes only a subset of bones for animators.

These would typically be used by animators and layout artists.

Someone who isn't experienced with Blender should be able to open a character file and manipulate it easily.

Proposed Functionality

Face-maps can be accessed from Object Mode, so users don't need to first select armatures before posing them and can make adjustments.

  • Face-maps will be accessible in object mode for active or selected objects *.
  • Adjusting a face-map will edit the associated control bone.
  • Face-maps may also control shape-keys (or other values in future).

* Edit: we may end up changing the method used to detect which face-maps to display, the main goal is to allow tweaking face-maps from multiple objects at once - exactly how these are chosen may change.

Usage

  • Mode Switching

    While we want to avoid users mode-switching, its not useful to expose face-maps if users can *only* perform basic adjustments.

    Further, creating a new mode just for face-maps (with its own key-map and operators) is creating yet-another mode users have to learn.

    So face-maps that control bones will use pose-mode with face-maps bone set to active. This means its possible to insert key-frame, adjust a property - or any other typical pose operation.

    Edit: to be clear, this means that while you can click on a face-map in object mode, doing so will enter pose-mode for the associated bone.
  • Mixing Face-Maps With Pose Mode

    The rigger will control which bones are controlled as face-maps,

    A bone can be set to be shown only as a face-map, so a rigger may configure a rig to only use face-maps if they like.

    However this isn't a requirement, there may be mixed bones/face-maps in use.
  • Face-Map Associations

    Face-maps behave in much the same way as vertex-groups, where names will be matched for automatic association.
  • Face-Map Assignment

    Currently assigning face-maps is similar to assigning materials.

    Most likely we will want tools to create & assign face-maps from selected control-bones.
  • Displaying Face-Maps

    While it might be nice to have all face-maps as editable, there is some overhead in calculating which face maps to show and finding relationships between all objects which might potentially display face-maps.

    For this reason, the initial version will only use the active object.

    We should be able to cache the result, however there are many operations that would invalidate the cache *(renaming a bone, toggling a modifier, changing layers... etc)*.

    So we might need a way to limit which face-maps are displayed, or make this an option (which I rather avoid).

    There is no need to make a decision now, just noting that this adds some overhead if we want to use it by default in object-mode.

Development Plan

Currently an open topic - at which step would we consider merging into 2.8 acceptable.

  • Initial Working Version (done, only some glitches left)

    Only in Pose-Mode, face-maps are simply an alternative to accessing bones directly.
  • Implement Mode Switching

    Selecting face-maps without being in pose-mode or having the armature selected.
  • Feature Complete
    • Shape key support.
    • Basic tools (things I wanted when creating test files)
      • Re-Assign from selection.
      • Remove (from all face maps)
      • Select all un-assigned.
      • Face Map option for Select Grouped Faces.
    • Tool for automatic assignment.
    • Improve drawing?, currently drawing is xray only.
    • (Maybe) level of detail.

Open Topics

These are issues that can be addressed as we reach them, I don't think we need to make a decision now.

Noting the issues since it seems likely we will need to handle them before 2.8x release.

  • Armature Visibility

    There is a logical problems wanting only to edit face-maps where the armature may not be on a visible layer for example.

    Do we disable those face-maps in this case? Allow tweaking but not enter pose mode?
  • Face-Map Names

    There is some name-space conflict since face maps may be used by shape-keys or bones.

    We may want to have a type-selector for each face-map, or some other way to avoid ambiguous associations.
  • Face-Maps as General Controls

    We want to keep the option open for custom widgets with face-maps.
  • Level of Detail

    When zoomed out we might not want a characters eyelid to be editable, instead the head should be adjusted, wrist instead of bending finger ... etc.

    We would likely need a way to choose when a face-map is too small and a fallback face-map to use in its place. (perhaps fallback can be nearest face-map thats big enough, needs some testing)

    There are a few ways we could solve this, just noting it as something we may want to look into once face-maps are working.

Test File: for use with custom-manipulators branch.

Details

Type
Design

Hmm... it's a bit unclear atm what is intended here regarding what modes these will be available in. On one hand, it sounds like you're saying that facemaps will always be available in object mode, but then, in the next paragraph/section, you mention stuff about these activating corresponding bones and allowing tools like keyframing/breakdowner/pose-library/motion paths/etc. to be used as if the bone was selected.

Pros of Object-mode facemaps:

  • No extra modes to deal with
  • If animators are animating objects too (without rigs for those objects), then it's easy to go between those objects and the facemaps/controls.

Cons of Object-mode facemaps:

  • How does a rigger/layout (scene setup) go about selecting the mesh from the viewport? Or do we assume that riggers and layout/scene setup artists will rarely need to do this, and will just end up using the outliner instead most of the time if they need to do so?
  • Tool access (as mentioned above). Most of the "really useful" animation tools are pose-mode only.

Except for pure shapekey-only rigs, you'll likely end up having some bones anyway as part of the charater's rig. So, unless facemaps is really useful for anything other than selecting parts of a character to animate it, I'd be tempted to make it so that:

  1. Facemaps can be used to select control regions on meshes when in pose mode (on an armature), with the ability to still select any bones that are visible/not represented by a facemap
  2. Each armature will include a list of links to geometry objects that can be used for facemap-selection/drawing when that armature is in pose mode.
  3. Facemaps can be assigned to geometry objects as described in your proposal unchanged
  4. If an armature (with facemaps turned on) is in pose mode, and the user clicks on another objects, the facemaps will continue to be usable, just like the current situation with mixed posebone + object selection when an armature is in posemode. But, if you exit posemode, facemaps will not be available.
  5. Just to be clear, facemaps do not need to only map to bones. if a facemap-providing mesh has facemaps that don't match up with bones in the pose-active armature, shapekey/custom property facemaps could be used too. How exactly that mapping works still needs to be decided/defined, but we aren't that far along with the current proposal either :)
  6. To make animating multiple characters easier, we can make it so that multiple armatures can have posemode enabled (i.e. select armature 1, enter posemode, then select armature 2 and enter posemode on that too). Then, facemaps will be available for both armatures. (NOTE: This doesn't have to be for the initial version, but I'm including this for completeness).

Anyway, that is just a dump of how I think this should work (though we'll probably need to have a good hard look at this object/pose mode split at some point in the future...)

Hmm... it's a bit unclear atm what is intended here regarding what modes these will be available in. On one hand, it sounds like you're saying that facemaps will always be available in object mode, but then, in the next paragraph/section, you mention stuff about these activating corresponding bones and allowing tools like keyframing/breakdowner/pose-library/motion paths/etc. to be used as if the bone was selected.

To the first point, face-maps will be available in object mode. Clicking on a face-map associated with a bone will activate that armature.

Pros of Object-mode facemaps:

  • No extra modes to deal with
  • If animators are animating objects too (without rigs for those objects), then it's easy to go between those objects and the facemaps/controls.

Cons of Object-mode facemaps:

  • How does a rigger/layout (scene setup) go about selecting the mesh from the viewport? Or do we assume that riggers and layout/scene setup artists will rarely need to do this, and will just end up using the outliner instead most of the time if they need to do so?
  • Tool access (as mentioned above). Most of the "really useful" animation tools are pose-mode only.

As for mesh selection, this could be handled as with existing manipulator widgets.

Left click to activate the manipulator, right click to select the mesh.

There is then a conflict with 3D cursor placement.

While I wanted to avoid adding more options, face-maps might end up needing to be a toggle if we can't co-exist well enough with other object mode operators.

Except for pure shapekey-only rigs, you'll likely end up having some bones anyway as part of the charater's rig. So, unless facemaps is really useful for anything other than selecting parts of a character to animate it, I'd be tempted to make it so that:

  1. Facemaps can be used to select control regions on meshes when in pose mode (on an armature), with the ability to still select any bones that are visible/not represented by a facemap

Right, this is currently the case. (no plans on changing)

  1. Each armature will include a list of links to geometry objects that can be used for facemap-selection/drawing when that armature is in pose mode.

Currently this is pre-calculated based on armature modifers, not sure there is much benefit to making the user manually set this up?

Even in the case of indirectly used armatures (armature -> mdef -> mesh), we could detect this.

  1. Facemaps can be assigned to geometry objects as described in your proposal unchanged
  2. If an armature (with facemaps turned on) is in pose mode, and the user clicks on another objects, the facemaps will continue to be usable, just like the current situation with mixed posebone + object selection when an armature is in posemode. But, if you exit posemode, facemaps will not be available.

By the sounds of it this means: All visible armatures in pose-mode will have their face-maps available, no matter their selection state.

Seems like it could work well - one downside is that you might end up needing to manually switch out of pose-mode when you'd otherwise just click away.

This particular aspect fo face maps is fairly open to change as we go AFAICS.

  1. Just to be clear, facemaps do not need to only map to bones. if a facemap-providing mesh has facemaps that don't match up with bones in the pose-active armature, shapekey/custom property facemaps could be used too. How exactly that mapping works still needs to be decided/defined, but we aren't that far along with the current proposal either :)

Yes, its noted in the proposal - even though we don't need to set-this in stone early on, we might want to choose how we would implement. (should the bone toggle the face-map, does the face-map choose the associated data type?)

  1. To make animating multiple characters easier, we can make it so that multiple armatures can have posemode enabled (i.e. select armature 1, enter posemode, then select armature 2 and enter posemode on that too). Then, facemaps will be available for both armatures. (NOTE: This doesn't have to be for the initial version, but I'm including this for completeness).

As long as we support multiple objects face-maps being active at once - exactly which are active at any time can be tweaked based on user-feedback.

Anyway, that is just a dump of how I think this should work (though we'll probably need to have a good hard look at this object/pose mode split at some point in the future...)

Edited the proposal to clarify some points you raised.

Thanks for the feedback!