Any manual transformation done to the object messes up the Vector Displacement

For example,
here, the imported object was a cube, I vector displaced it into a sphere as you can see:


as I manually transformed the cube (in Object Mode) like scaling it up, you see nothing happens…

…but as soon as I updated the scene by touching the nodes, the effects from the manual transformation is updated instantly, so you see, it is not a sphere anymore:


So,
How do I get manual transformations to leave my Vector Displacement alone?
I’m gonna combine Vector Displacement and Geometry Nodes in my workflow but any transformation by Geometry Nodes is going to destroy the Vector Displacement.

Please note that, materials don’t get harmed after manual transformations at all, only Vector Displacement.


Thank you so much!

the problem seems to be, that displacement output socket expects a vector in world space, while the texture coordinates all work in object space. Since scaling does not change the object space vectors, they are too short if the scale is bigger than 1.
You can either use a “Vector Displacement” node or a “Vector Transform” node to transform your vectors into the world space

1 Like

Amazing, it works! Thank you.

I am curious about what’s happening. Please help me with the intuition if you don’t mind. Thank you.


First Question, is “World Space” the 3D Coordinate System that all objects imported into the scene, work inside?
And is the “Object Space” the 3D Coordinate System that each imported object works inside correspondingly and independently?
I learnt in Math that there’s only 1 Coordinate System, which I assume in this case, is the “World Space”.

Second question, am I understanding you correctly:
Manual transformations of object (i.e. scale, rotate, translate) works on the object’s World Space, but my Texture Coordinates work in Object Space, therefore the data corrupt?

Third question, why does it still work even though the option of the Vector Displacement node is “Object Space”, whereas you said that it needs to be in “World Space”?

To Question 1:

Yes, world space refers to the overarching coordinate system, the same one the gizmo in the top right is refering to.also the coordinates
image

Also Yes, each object has its own “local” or “object space” coordinate system. This Coordinate System is always centered at the origin of the object. The position of vertices of a mesh are defined in this coordinate system. So the coordinates you see by default while editing dont change when you transform an object in object mode.


what you see in Viewport then is in World Space. You get from Object Space to World Space when you apply the transform applied to each vertex that forms the object.

To Question 2

Essentially you are correct. Since the Object Space Positions (the data you get from the Texture Coordinate Node) don’t change if you transform (translate/rotate/scale) the object, but the World Space Positions (the position the Displacement Output operates on) do change, the data does not match any longer.

I would not say its corrupt, because its still meaningful vectors, they is just a conversion missing that takes applies the transform values.

to Question 3

The dropdown refers to what you intend to the input* or what you plug into the left side. The output will always be in World Space, since that is the space the displacement operates in.

On small note to The" Generated" Coordinates you are using right now: They work great for your specific case, because it hapens to be one where “Generated” Coordinates and “Object” Coordinates are very similar. But in most cases you will not get good results that way. This is because “Generated” constructs a new space where all values are in a range between Zero and One, regardles of the shape of the object. So if you make adjustments in edit mode, it can happen that you change the “Generated Coordinates” for the whole mesh.
The more robust way is to use the “Object” option of the Texture Coordinate Node, because it represents the unaltered Object Space/local coordinates

“Generated” Coordinates
displacement generated

“Object” Coordinates
displacement object

2 Likes

I hope thats helpfull and not just confusing :smiley:

1 Like

It is helpful and does make sense. Thank you so much!

But in most cases you will not get good results that way. This is because “Generated” constructs a new space where all values are in a range between Zero and One, regardless of the shape of the object.

Got it. Generated Texture Coordinates use Bounding Box whose Range is between [0,1] starting from bottom left corner, right? I actually tried to mimic the look of Object Coordinate by…

…subtracting all vectors by 0.5, so that [0,1] becomes [-0.5,0.5], and then scaled the Range by 2: [-0.5 * 2,0.5 * 2] = [-1,1], and now it’s a usual local Coordinate System whose Origin is now in the middle of the object instead of at the corner.

I mainly use Generated instead of Object because Object does not stick the texture to the object’s surface whenever I displace the vectors, luckily, Generated solves this problem by using a Bounding Box.