Different results when keyframing visual transforms and applying transforms manually on IK constraint #76791

Closed
opened 2020-05-15 21:06:26 +02:00 by sok0 · 24 comments

Blender Version
Broken: v2.82a and blender-2.90-f9d0f59bed4d-windows64
Working: never, tested with 2.75a and that even shows this issue.

Short description of error
There is a difference between using the insert keyframe menu to insert Visual LocRot compared to if you Apply Visual Transform to Pose and then use normal keyframe LocRot.

Exact steps for others to reproduce the error

keyframe-visual-root.blend

  • Open the attached blend file.
  • Set a VisualLocRot keyframe on the root bone.
  • See in the graph editor that the orientation is keyed with quaternion (1, 0, 0, 0), even though the bone was visually influenced by the IK constraint.
  • Disable the IK constraint, and see that the root bone moves.

Using Keyframe Menu (broken):

2020-05-15 11-24-58.mkv

Iterating Keyframe Insertion (Semi-working):
2020-05-15 12-02-32.mkv

Manually applying transforms to Pose (working):

2020-05-15 11-29-47.mkv

**Blender Version** Broken: v2.82a and blender-2.90-f9d0f59bed4d-windows64 Working: never, tested with 2.75a and that even shows this issue. **Short description of error** There is a difference between using the insert keyframe menu to insert Visual LocRot compared to if you Apply Visual Transform to Pose and then use normal keyframe LocRot. **Exact steps for others to reproduce the error** [keyframe-visual-root.blend](https://archive.blender.org/developer/F8547898/keyframe-visual-root.blend) - Open the attached blend file. - Set a VisualLocRot keyframe on the root bone. - See in the graph editor that the orientation is keyed with quaternion (1, 0, 0, 0), even though the bone was visually influenced by the IK constraint. - Disable the IK constraint, and see that the root bone moves. --------------------------------- Using Keyframe Menu (broken): [2020-05-15 11-24-58.mkv](https://archive.blender.org/developer/F8537522/2020-05-15_11-24-58.mkv) Iterating Keyframe Insertion (Semi-working): [2020-05-15 12-02-32.mkv](https://archive.blender.org/developer/F8537574/2020-05-15_12-02-32.mkv) Manually applying transforms to Pose (working): [2020-05-15 11-29-47.mkv](https://archive.blender.org/developer/F8537534/2020-05-15_11-29-47.mkv)
Author

Added subscriber: @sok0

Added subscriber: @sok0

#81302 was marked as duplicate of this issue

#81302 was marked as duplicate of this issue

Added subscriber: @mano-wii

Added subscriber: @mano-wii

Changed status from 'Needs Triage' to: 'Needs User Info'

Changed status from 'Needs Triage' to: 'Needs User Info'

Could you provide a simple .blend file demonstrating the problem?
Also videos should be used to quickly describe the problem and not as steps to reproduce the problem.
A guideline for making a good bug report can be found at https://wiki.blender.org/wiki/Process/Bug_Reports

Could you provide a simple .blend file demonstrating the problem? Also videos should be used to quickly describe the problem and not as steps to reproduce the problem. A guideline for making a good bug report can be found at https://wiki.blender.org/wiki/Process/Bug_Reports
Author

IK_constraint_keyframe.blend

Armature was keyframed with Visual LocRot
Armature.001 was keyframed after using Apply Visual Transform to Pose

Expected result should be the same. Instead the Visual LocRot does not properly keyframe the pose position of the IK constraint.

[IK_constraint_keyframe.blend](https://archive.blender.org/developer/F8543466/IK_constraint_keyframe.blend) Armature was keyframed with Visual LocRot Armature.001 was keyframed after using Apply Visual Transform to Pose Expected result should be the same. Instead the Visual LocRot does not properly keyframe the pose position of the IK constraint.

Changed status from 'Needs User Info' to: 'Needs Triage'

Changed status from 'Needs User Info' to: 'Needs Triage'

Added subscriber: @dr.sybren

Added subscriber: @dr.sybren

@sok0 Please test with older versions of Blender to see which version of Blender still worked properly. This will help developers in finding the root cause of the issue.

For videos, please use h.264 in an MP4 container, so that they can be directly played back in the browser. Re-encoding them after the recording will make them much smaller (I have them stored at a 1/35th the file size on my machine after locally re-encoding them).

@sok0 Please test with [older versions of Blender](https://download.blender.org/release/) to see which version of Blender still worked properly. This will help developers in finding the root cause of the issue. For videos, please use h.264 in an MP4 container, so that they can be directly played back in the browser. Re-encoding them after the recording will make them much smaller (I have them stored at a 1/35th the file size on my machine after locally re-encoding them).

Changed status from 'Needs Triage' to: 'Confirmed'

Changed status from 'Needs Triage' to: 'Confirmed'
Author

In #76791#936612, @dr.sybren wrote:
@sok0 Please test with older versions of Blender to see which version of Blender still worked properly. This will help developers in finding the root cause of the issue.

I tested with few older versions. As you go back in the versions it never seemed to work and at some point the Apply Visual Transform to Pose operation stops working as well so it's not possible to test further.

2.79b not working, same behavior
2.77a not working, same behavior
2.60 not working, apply pose as rest pose doesn't work either
Blender 2.5 doesn't work and apply pose as rest pose doesn't work either

For videos, please use h.264 in an MP4 container, so that they can be directly played back in the browser. Re-encoding them after the recording will make them much smaller (I have them stored at a 1/35th the file size on my machine after locally re-encoding them).

got it

> In #76791#936612, @dr.sybren wrote: > @sok0 Please test with [older versions of Blender](https://download.blender.org/release/) to see which version of Blender still worked properly. This will help developers in finding the root cause of the issue. I tested with few older versions. As you go back in the versions it never seemed to work and at some point the Apply Visual Transform to Pose operation stops working as well so it's not possible to test further. 2.79b not working, same behavior 2.77a not working, same behavior 2.60 not working, apply pose as rest pose doesn't work either Blender 2.5 doesn't work and apply pose as rest pose doesn't work either > > For videos, please use h.264 in an MP4 container, so that they can be directly played back in the browser. Re-encoding them after the recording will make them much smaller (I have them stored at a 1/35th the file size on my machine after locally re-encoding them). got it
Sybren A. Stüvel self-assigned this 2020-05-26 15:01:42 +02:00

@sok0 thanks for testing. I did some digging, and it's due to the way visual keying is implemented in Blender (visualkey_can_use() in keyframing.c). It will fall back to regular keying when there is no parent bone and no constraint on the bone either. This "no constraint" check does not consider IK-chains on child bones, which is why the root bone of the chain isn't keyed correctly. This has been pretty much been the situation since the code was ported to Blender 2.50 (6343d4e233) 11 years ago.

This can be resolved by simply always performing visual keying when a user chooses that from the keying set menu, regardless of whether there are any constraints. This would be a bigger change than is currently possible for Blender 2.83, though. First and foremost, this change in behaviour should be discussed with more animators, which I'll do.

@sok0 thanks for testing. I did some digging, and it's due to the way visual keying is implemented in Blender (`visualkey_can_use()` in `keyframing.c`). It will fall back to regular keying when there is no parent bone and no constraint on the bone either. This "no constraint" check does **not** consider IK-chains on child bones, which is why the root bone of the chain isn't keyed correctly. This has been pretty much been the situation since the code was ported to Blender 2.50 (6343d4e233) 11 years ago. This can be resolved by simply always performing visual keying when a user chooses that from the keying set menu, regardless of whether there are any constraints. This would be a bigger change than is currently possible for Blender 2.83, though. First and foremost, this change in behaviour should be discussed with more animators, which I'll do.

@sok0 Is visual keying part of your day-to-day workflow? Or is it just something you're trying out?

@sok0 Is visual keying part of your day-to-day workflow? Or is it just something you're trying out?
Author

@dr.sybren I came across the bug on a side project to write my own IK solver algorithm and wanted to compare my results to what Blender produced. I was creating an animation for a robot arm and wanted to see what the difference would be between joint interpolated motion and Cartesian interpolated motion of the end effector. Joint interpolated motion required visual keying of the start and ending frame rotations of each joint while Cartesian interpolation used the IK constraint and only keyed the IK target then letting the IK solver calculate new joint rotations on every frame. When I was not getting the expected results for the joint interpolated motion I realized there might be a bug and traced it back to visual keying. Hopefully that answers the question, let me know if there is any other way I can help.

@dr.sybren I came across the bug on a side project to write my own IK solver algorithm and wanted to compare my results to what Blender produced. I was creating an animation for a robot arm and wanted to see what the difference would be between joint interpolated motion and Cartesian interpolated motion of the end effector. Joint interpolated motion required visual keying of the start and ending frame rotations of each joint while Cartesian interpolation used the IK constraint and only keyed the IK target then letting the IK solver calculate new joint rotations on every frame. When I was not getting the expected results for the joint interpolated motion I realized there might be a bug and traced it back to visual keying. Hopefully that answers the question, let me know if there is any other way I can help.

Added subscribers: @wbmoss_dev, @Hjalti, @BassamKurdali

Added subscribers: @wbmoss_dev, @Hjalti, @BassamKurdali

The people I have talked with (@BassamKurdali , @Hjalti, @wbmoss_dev) have all expressed that they perceive Visual Keying as buggy, and that this is why they don't use it in their day-to-day workflow. It seems that Visual Keying, even though the idea looks nice, needs a redesign to become usable in practice.

As such, I'll mark this down as a known issue. In time we can create a design task and make this work properly.

The people I have talked with (@BassamKurdali , @Hjalti, @wbmoss_dev) have all expressed that they perceive Visual Keying as buggy, and that this is why they don't use it in their day-to-day workflow. It seems that Visual Keying, even though the idea looks nice, needs a redesign to become usable in practice. As such, I'll mark this down as a known issue. In time we can create a design task and make this work properly.

Added subscribers: @netricsa, @iss

Added subscribers: @netricsa, @iss

Added subscriber: @0xb

Added subscriber: @0xb
Philipp Oeser removed the
Interest
Animation & Rigging
label 2023-02-09 14:36:13 +01:00

was there a design task created for this? Just wondering how it's going.

was there a design task created for this? Just wondering how it's going.

@dr.sybren you mentioned above that the people you spoke with don't use visual keying. I'm wondering, what's the alternative if you're wanting to transition from IK to FK?

I'm using visual keying to key the position of the bones post IK constraints, so that when I disable the IK constraint the FK bones will remain in the same location. Really interested to know which alternative method is possible.

@dr.sybren you mentioned above that the people you spoke with don't use visual keying. I'm wondering, what's the alternative if you're wanting to transition from IK to FK? I'm using visual keying to key the position of the bones post IK constraints, so that when I disable the IK constraint the FK bones will remain in the same location. Really interested to know which alternative method is possible.

actually, I think I realise now they must be applying visual transform to pose and then inserting a standard keyframe (not visual), as I now understand that all 'apply visual transform to pose' does, is move the selected bones to the constrained position they're in, so that when you insert standard location rotation (not visual) keyrframes, the keyframes are created in the visual location. Very odd how keyframing this way works, but inserting a visual location rotation keyframe doesn't.

Perhaps instead of a full redesign (which appears to not be happening based on the 3 year elapsed time), just make inserting a visual location/rotation keyframe do the following:

apply visual transform to pose
insert standard location rotation keyframe.

actually, I think I realise now they must be applying visual transform to pose and then inserting a standard keyframe (not visual), as I now understand that all 'apply visual transform to pose' does, is move the selected bones to the constrained position they're in, so that when you insert standard location rotation (not visual) keyrframes, the keyframes are created in the visual location. Very odd how keyframing this way works, but inserting a visual location rotation keyframe doesn't. Perhaps instead of a full redesign (which appears to not be happening based on the 3 year elapsed time), just make inserting a visual location/rotation keyframe do the following: apply visual transform to pose insert standard location rotation keyframe.
Member

Wow this has been around a while, and I am in agreement at least that I am not clear at all now on why/what visual keying is doing if it isn't applying the visual transform and keying that.
I think now is a good time to see if a small change can make this intuitive to use and we can update the documentation as well.

Wow this has been around a while, and I am in agreement at least that I am not clear at all now on why/what visual keying is doing if it isn't applying the visual transform and keying that. I think now is a good time to see if a small change can make this intuitive to use and we can update the documentation as well.

With what I said in my earlier comment in mind, this might be fairly doable to address for Blender 4.0.

With what I said in [my earlier comment](https://projects.blender.org/blender/blender/issues/76791#issuecomment-326910) in mind, this might be fairly doable to address for Blender 4.0.
Sybren A. Stüvel added this to the 4.0 milestone 2023-05-16 12:24:35 +02:00

A few notes while I'm investigating this:

Diving into history

The behaviour (of not visual keying when requested) can be traced back to the behaviour of the visualkey_can_use function (as I described above). I did some digging to figure out more about the underlying design choices..

876cfc837e ("Visual Keying refactor") back in 2007 refactored the visual keying system. The author writes:

By much request, several semi-bug reports and discussion with production animators, visual keying is now used automatic for objects and bones that have constraints that cause them to ignore their Ipos (CopyLoc, TrackTo, etc.). In those cases, visual keying is used instead of the normal Ipo insertion method. This "auto" functionality is toggled from the "Use Visual Keying" button found along with "Needed" and "Available" in the Edit Methods prefs.

Note that Ipo-curves where the precursor to F-curves.

Designed workflow

So it would seem that the design goal was to support a workflow where animators always have visual keying preference enabled, which would then automatically decide when and where to use visual keys. This matches the current (4.0-alpha) description of the preference ("Use Visual keying automatically for constrained objects").

This workflow can still be supported, and I suspect that it will be enough to extend the visualkey_can_use function to also detect constraints that influence the current bone but are defined on children (i.e. IK constraints).

That workflow vs. explicitly asking for visual keys

I do see a difference between the above workflow, and a workflow where you press I and explicitly choose "Visual Rotation", "Visual
Location", etc. In that case I feel that Blender should just do what you asked it to, and use visual keying regardless of whether there's a constraint or not.

More possible confusion

Finally there is another source of possible confusion. Inserting a visual key only does that: it stores a set of keys in the Action. What it does not do, is re-evaluate the animation data. The result is that after visually keying the rotation, the bone's actual rotation properties are still set to their previous value. In the example blend file, this means it's set to the quaternion (1, 0, 0, 0). Changing the scene frame will do this, and you'll see that the rotation properties are then set to the visually kceyed values.

If Blender would re-evaluate after setting a visual key, it means that you can no longer change the rotation of two bones, and visually key them one after the other -- the first would be keyed, but it would trigger a re-evaluation and the second bone would pop back to its previous orientation. Of course we could try to limit this to the keyed properties, but that would mean that drivers, constraints, etc. that depend on those properties are themselves not re-evaluated, which would IMO be even more confusing to work with.

In the end I think Blender's current behaviour is acceptable, even though it can cause some confusion at first. At least it is not a destructive operation, in that it doesn't discard any unkeyed changes until you actually change the scene frame.

A few notes while I'm investigating this: ### Diving into history The behaviour (of not visual keying when requested) can be traced back to the behaviour of the `visualkey_can_use` function (as I described above). I did some digging to figure out more about the underlying design choices.. 876cfc837e2f065fa370940ca578983d84c48a11 ("Visual Keying refactor") back in 2007 refactored the visual keying system. The author writes: > By much request, several semi-bug reports and discussion with production animators, visual keying is now used automatic for objects and bones that have constraints that cause them to ignore their Ipos (CopyLoc, TrackTo, etc.). In those cases, visual keying is used instead of the normal Ipo insertion method. This "auto" functionality is toggled from the "Use Visual Keying" button found along with "Needed" and "Available" in the Edit Methods prefs. Note that Ipo-curves where the precursor to F-curves. ### Designed workflow So it would seem that the design goal was to support a workflow where animators always have visual keying preference enabled, which would then automatically decide when and where to use visual keys. This matches the current (4.0-alpha) description of the preference ("Use Visual keying automatically for constrained objects"). This workflow can still be supported, and I suspect that it will be enough to extend the `visualkey_can_use` function to also detect constraints that influence the current bone but are defined on children (i.e. IK constraints). ### That workflow vs. explicitly asking for visual keys I do see a difference between the above workflow, and a workflow where you press `I` and explicitly choose "Visual Rotation", "Visual Location", etc. In that case I feel that Blender should just do what you asked it to, and use visual keying regardless of whether there's a constraint or not. ### More possible confusion Finally there is another source of possible confusion. Inserting a visual key only does that: it stores a set of keys in the Action. What it does *not* do, is re-evaluate the animation data. The result is that after visually keying the rotation, the bone's actual rotation properties are still set to their previous value. In the example blend file, this means it's set to the quaternion (1, 0, 0, 0). Changing the scene frame will do this, and you'll see that the rotation properties are then set to the visually kceyed values. If Blender would re-evaluate after setting a visual key, it means that you can no longer change the rotation of two bones, and visually key them one after the other -- the first would be keyed, but it would trigger a re-evaluation and the second bone would pop back to its previous orientation. Of course we could try to limit this to the keyed properties, but that would mean that drivers, constraints, etc. that depend on those properties are themselves not re-evaluated, which would IMO be even more confusing to work with. In the end I think Blender's current behaviour is acceptable, even though it can cause some confusion at first. At least it is not a destructive operation, in that it doesn't discard any unkeyed changes until you actually change the scene frame.
Blender Bot added
Status
Resolved
and removed
Status
Confirmed
labels 2023-09-25 14:39:11 +02:00
Sign in to join this conversation.
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
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
Overlay
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
Interest
Workbench
Interest: X11
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
No Milestone
No project
No Assignees
7 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#76791
No description provided.