Design discussion: Add object instancing to support transforming linked objects? #93010

Open
opened 2021-11-11 13:20:14 +01:00 by Julian Eisel · 22 comments
Member

This is an initial task to start discussion on this topic. More details would have to be looked into for an actual design.

Motivation

Linking objects in Blender has the inherent design limitation that it also links the object's transform, which means you can't transform an object that was linked. This is a very basic and important operation. With library overrides, that issue is mitigated; however IMO we should look at this as a feature for production use-cases, not as something for more informal, low-overhead usages. This would be a complex solution for the user to manage for a simple problem. They need rather deep understanding of how Blender data-management works to manage library overrides.

Especially for the Asset Browser, it would be good to have a simple solution that behaves as users expect. Apparently what they do expect is that they can simply link objects, while being able to transform them still. Not being able to edit other object properties seems fine.

Possible Solutions

For collections we have actually addressed this issue by supporting linked collection instances. That means, while the collection and its contents are linked, the collection is placed relative to an emtpy that is local to this file. So by transforming the empty the entire collection is transformed. The idea of instancing can be brought to objects so transforming linked objects becomes possible in effect.

Some ideas on how object instancing could be supported on linking:

  • Object is made local, the mesh, materials, etc stay linked Simple to implement - downside is that object properties, modifiers, constraints, physics and the like would not be linked anymore.
  • Instancing via empty. This would be very similar to collections. An empty can instance an object which means it acts as a parent of the object.
  • Wrap into collection instance. Effectively the same as instancing via an empty, but the user would see an intermediate collection. It's simple to add this, but kind of forces an implementation detail onto users.

Other Approaches

Instead of trying to support object instancing, other things could be done on linking:

  • Automatically create library overrides for transforms. Another simple solution technically and at least saves the user from having to know about or setup the library overrides when linking. But obviously pushes users towards using library overrides, which they sooner or later will still have to deal with.
This is an initial task to start discussion on this topic. More details would have to be looked into for an actual design. ### Motivation Linking objects in Blender has the inherent design limitation that it also links the object's transform, which means you can't transform an object that was linked. This is a very basic and important operation. With library overrides, that issue is mitigated; however IMO we should look at this as a feature for production use-cases, not as something for more informal, low-overhead usages. This would be a complex solution for the user to manage for a simple problem. They need rather deep understanding of how Blender data-management works to manage library overrides. Especially for the Asset Browser, it would be good to have a simple solution that behaves as users expect. Apparently what they do expect is that they can simply link objects, while being able to transform them still. Not being able to edit other object properties seems fine. ### Possible Solutions For collections we have actually addressed this issue by supporting linked collection instances. That means, while the collection and its contents are linked, the collection is placed relative to an emtpy that is local to this file. So by transforming the empty the entire collection is transformed. The idea of instancing can be brought to objects so transforming linked objects becomes possible in effect. Some ideas on how object instancing could be supported on linking: * **Object is made local, the mesh, materials, etc stay linked** Simple to implement - downside is that object properties, modifiers, constraints, physics and the like would not be linked anymore. * **Instancing via empty.** This would be very similar to collections. An empty can instance an object which means it acts as a parent of the object. * **Wrap into collection instance.** Effectively the same as instancing via an empty, but the user would see an intermediate collection. It's simple to add this, but kind of forces an implementation detail onto users. ### Other Approaches Instead of trying to support object instancing, other things could be done on linking: * **Automatically create library overrides for transforms**. Another simple solution technically and at least saves the user from having to know about or setup the library overrides when linking. But obviously pushes users towards using library overrides, which they sooner or later will still have to deal with.
Author
Member

Added subscriber: @JulianEisel

Added subscriber: @JulianEisel
Julian Eisel changed title from Design discussion: Support transformable instances of linked objects? to Design discussion: Add object instancing to support transforming linked objects? 2021-11-11 14:07:47 +01:00
Member

Added subscriber: @lichtwerk

Added subscriber: @lichtwerk
Member

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

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

Added subscriber: @rav89

Added subscriber: @rav89

IMO "automatically create library overrides for transforms" is the best solution - simple and at the same time future-proof due to continuous development of library overrides system. Additionally, I would consider extending it to materials, because in the architectural industry experimenting with materials is a norm. There are of course add-ons that provide this functionality, but it would be nice to have it in a package.example materials and transform library overrides.JPG

IMO **"automatically create library overrides for transforms"** is the best solution - simple and at the same time future-proof due to continuous development of library overrides system. Additionally, I would consider extending it to materials, because in the architectural industry experimenting with materials is a norm. There are of course add-ons that provide this functionality, but it would be nice to have it in a package.![example materials and transform library overrides.JPG](https://archive.blender.org/developer/F11807969/example_materials_and_transform_library_overrides.JPG)
Contributor

Added subscriber: @AndresStephens

Added subscriber: @AndresStephens
Contributor

Agree, with a user prop as an option, allow automatically adding the override if the data is linked to a clear and hassle free UX (drag and drop then use - not drag, drop, override, then use)

Agree, with a user prop as an option, allow automatically adding the override if the data is linked to a clear and hassle free UX (drag and drop then use - not drag, drop, override, then use)

Added subscriber: @igiornotigi

Added subscriber: @igiornotigi

In the asset browser why not create multiple otpions to choose the way the user can instance the linked object? I think that different scenarios requests different approaches.
In my case (archviz) I make the object local after linking, to be albe to edit trasformation, material (changing the slot from data to object) and modifiers (es GN LODs). In my case making the object local is the easiest and convenient method because I don't need to mantain the object property linked (I use "globals" libraries (vegetation, forniture...) in different projects) and if I need tho change es. the "chair model", I can select all the chairs objects and linking to another mesh.
In a different scenario, the empty or collection instancing method can be convenient to preserve the object properties...(es project related library)

In the asset browser why not create multiple otpions to choose the way the user can instance the linked object? I think that different scenarios requests different approaches. In my case (archviz) I make the object local after linking, to be albe to edit trasformation, material (changing the slot from data to object) and modifiers (es GN LODs). In my case making the object local is the easiest and convenient method because I don't need to mantain the object property linked (I use "globals" libraries (vegetation, forniture...) in different projects) and if I need tho change es. the "chair model", I can select all the chairs objects and linking to another mesh. In a different scenario, the empty or collection instancing method can be convenient to preserve the object properties...(es project related library)

In a similar way, I used a local object with linked meshes in archviz. This solution is used by almost all existing asset management add-ons like Asset Wizard, Simple Asset etc. But automatic create library overrides looks like a successor to this solution and will probably be more versatile in other industries. Unless I'm wrong. I have already tested it in archviz and it also works without any problems. Maybe in the future it would be good to have more solutions for different scenarios, but at the moment we do not have any and I guess it is better to have something than nothing.

In a similar way, I used a local object with linked meshes in archviz. This solution is used by almost all existing asset management add-ons like Asset Wizard, Simple Asset etc. But automatic create library overrides looks like a successor to this solution and will probably be more versatile in other industries. Unless I'm wrong. I have already tested it in archviz and it also works without any problems. Maybe in the future it would be good to have more solutions for different scenarios, but at the moment we do not have any and I guess it is better to have something than nothing.

Added subscriber: @nicolas.coderre

Added subscriber: @nicolas.coderre

Chiming in with my use case.

I was somewhat successfully using linked libraries with collections that I could instance into my scene. Important for my use-case that changes to the libraries would be reflected in all files that used the assets. The main downsides were that i had to cleverly organize these so that i didn't have to re-link added assets all the time. (either by creating a master collection, or by linking in the scene instead). The other downside is that there are no thumbnails.

The asset Browser seemed like a great solution for both. But then I have the above problem. I honestly don't know who would link in an object from a library if they can't move it.

Chiming in with my use case. I was somewhat successfully using linked libraries with collections that I could instance into my scene. Important for my use-case that changes to the libraries would be reflected in all files that used the assets. The main downsides were that i had to cleverly organize these so that i didn't have to re-link added assets all the time. (either by creating a master collection, or by linking in the scene instead). The other downside is that there are no thumbnails. The asset Browser seemed like a great solution for both. But then I have the above problem. I honestly don't know who would link in an object from a library if they can't move it.

Added subscriber: @Michael-Drake

Added subscriber: @Michael-Drake

Added subscriber: @MaciejMorgas

Added subscriber: @MaciejMorgas

Removed subscriber: @MaciejMorgas

Removed subscriber: @MaciejMorgas

Added subscriber: @MaciejMorgas

Added subscriber: @MaciejMorgas

Added subscriber: @thinsoldier

Added subscriber: @thinsoldier

They need rather deep understanding of how Blender data-management works to manage library overrides.

I would like to suggest that you first reach out to the hundreds of blender tutorial making youtubers and ask them why they never make in-depth tutorials about library overrides.

I remember a year ago every override I made would disappear the next time I opened the file. I think BlenderBob mentioned that in a video a week ago but I also remember reading something in the blender wiki a few weeks ago that made me think such problems were fixed ( I haven't tested yet because of the PTSD of how hard those problems screwed me the last time I tried to use overrides )

With my limited understanding of that area of blender I don't have a problem making override on linked objects so I can move them, it's the one thing in my Quick Favorites menu of the Outliner.

the collection is placed relative to an emtpy that is local to this file. So by transforming the empty the entire collection is transformed.

The community desperately needs to be educated about how you can move the origin point of collections and at least 1 minor improvement to the Blender UI needs to happen to make it faster and easier to do that. https://blender.community/c/rightclickselect/Dqjx/

The idea of instancing can be brought to objects so transforming linked objects becomes possible in effect.

Does this add any extra complications/work for the user to later override more than just the position of the linked object?

Automatically create library overrides for transforms. Another simple solution technically and at least saves the user from having to know about or setup the library overrides when linking. But obviously pushes users towards using library overrides, which they sooner or later will still have to deal with.

What I would like is when I drop a linked object in the scene I get a little menu next to my mouse that says something like "make moveable" which makes a library override.

In some situations an asset is sub-component of a larger configurable piece made of many assets and I want each of the assets brought in with their original locations from the original file. When I've customized the combination of assets I put them in a collection and then use a collection instance to move everything around.

For example a candlestick holder than holds 4 candles. The final result I want is some candles are more melted than the others and only 1 of them is currently lit. In the original file I have several variations of candles placed in the 4 candle holder spots and I have a flame positioned for each candle variation. Each flame and each candle is an asset. I bring in just the objects I want to get the desired configuration and have no need to move the objects individually. I put them in a collection and then use a collection instance to move everything around.

I beg you to ask the people educating the community to make more videos explaining the basics of the override system and Blender data-block management and most importantly all the things about collections many people still have no clue about.

> They need rather deep understanding of how Blender data-management works to manage library overrides. I would like to suggest that you first reach out to the hundreds of blender tutorial making youtubers and ask them why they never make in-depth tutorials about library overrides. I remember a year ago every override I made would disappear the next time I opened the file. I think BlenderBob mentioned that in a video a week ago but I also remember reading something in the blender wiki a few weeks ago that made me think such problems were fixed ( I haven't tested yet because of the PTSD of how hard those problems screwed me the last time I tried to use overrides ) With my limited understanding of that area of blender I don't have a problem making override on linked objects so I can move them, it's the one thing in my Quick Favorites menu of the Outliner. > the collection is placed relative to an emtpy that is local to this file. So by transforming the empty the entire collection is transformed. The community desperately needs to be educated about how you can move the origin point of collections and at least 1 minor improvement to the Blender UI needs to happen to make it faster and easier to do that. https://blender.community/c/rightclickselect/Dqjx/ > The idea of instancing can be brought to objects so transforming linked objects becomes possible in effect. Does this add any extra complications/work for the user to later override more than just the position of the linked object? > Automatically create library overrides for transforms. Another simple solution technically and at least saves the user from having to know about or setup the library overrides when linking. But obviously pushes users towards using library overrides, which they sooner or later will still have to deal with. What I would like is when I drop a linked object in the scene I get a little menu next to my mouse that says something like "make moveable" which makes a library override. In some situations an asset is sub-component of a larger configurable piece made of many assets and I want each of the assets brought in with their original locations from the original file. _When_ I've customized the combination of assets I put them in a collection and then use a collection instance to move everything around. For example a candlestick holder than holds 4 candles. The final result I want is some candles are more melted than the others and only 1 of them is currently lit. In the original file I have several variations of candles placed in the 4 candle holder spots and I have a flame positioned for each candle variation. Each flame and each candle is an asset. I bring in just the objects I want to get the desired configuration and have no need to move the objects individually. I put them in a collection and then use a collection instance to move everything around. I beg you to ask the people educating the community to make more videos explaining the basics of the override system and Blender data-block management and most importantly all the things about collections many people still have no clue about.

@thinsoldier Very interesting workflow. However, I have a question, what if I want to have several such sets of candlesticks in different colors in the scene? The collection instance does not have access to make library override for materials, right? In the architectural industry, experimenting with materials is an important part of a designer's job.

@thinsoldier Very interesting workflow. However, I have a question, what if I want to have several such sets of candlesticks in different colors in the scene? The collection instance does not have access to make library override for materials, right? In the architectural industry, experimenting with materials is an important part of a designer's job.

It's not a great workflow. A much better workflow will hopefully soon be possible via geometry nodes and/or drivers working/not breaking when linked/appended.

In my example all the of parts imported to the scene are objects so they can have library overrides. The collection instance is created locally in that work file just to make it easier to move around multiple copies of the candlestick.

It's not a great workflow. A much better workflow will hopefully soon be possible via geometry nodes and/or drivers working/not breaking when linked/appended. In my example all the of parts imported to the scene are objects so they can have library overrides. The collection instance is created locally in that work file just to make it easier to move around multiple copies of the candlestick.

Added subscriber: @pauanyu_blender

Added subscriber: @pauanyu_blender

Why not add a new Link (Override) option? So it would be like this:

  • Link
  • Link (Override)
  • Append
  • Append (Reuse Data)

I think that Link (Override) should add a library override to the object and also its mesh, so that way the position and material can be immediately changed. If it doesn't override the mesh, then dragging a material onto the linked object doesn't work.

It would also be useful to have an Instance option as well, which could be used to easily create instances of objects.

Why not add a new `Link (Override)` option? So it would be like this: * Link * Link (Override) * Append * Append (Reuse Data) I think that `Link (Override)` should add a library override to the object and also its mesh, so that way the position and material can be immediately changed. If it doesn't override the mesh, then dragging a material onto the linked object doesn't work. It would also be useful to have an `Instance` option as well, which could be used to easily create instances of objects.
Bastien Montagne added this to the Pipeline, Assets & IO project 2023-02-09 15:40:39 +01:00
Philipp Oeser removed the
Interest
Pipeline, Assets & IO
label 2023-02-10 08:54:07 +01: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 Assignees
10 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#93010
No description provided.