Triplanar texture - projected from Local Space?

The unwanted results of using World aligned texture + rotation. (the textures on the sides also gets artifacts due to the triplanar blending)

Is there a way to keep the features of World aligned texture; like - the texture remains independent from the scaling of the object, but fix the limitations - such as when the object is rotated - the triplanar projection is not oriented with the original object and thus creates artifacts and the alignment with the object is broken?

Such texture could be VERY useful with cubic geometry - for creating all sorts of buildings and architecture.

I don’t know how to do this… but I am thinking - a triplanar texture that is projected in the local space of the object? thus making transformation like rotation of the object in the world - to have no effect on the positions of which the triplanar projection is made, or simply - triplanar projection fixed to the object itself and to its own local orientation.

I imagine something like this:
Subtract the origin world position from the vertex position.
Then, use TransformVector(WorldToLocal) on the VertexPosition and Normal.

I can’t follow really the Substract idea because I am missing too much info and I am bad at this.
But you give me an idea - because I didn’t know that TransformVector node can… transform from one space to another.
So I open up the Unreal’s World aligned texture function and modify the two transform nodes there like this:
15
19
Now I indeed have a local triplanar projection, and rotation now works… the problem now is that if I stretch the mesh - the texture stretches too… So this just replace the feature I wanted - for another that I wanted, but didn’t combine them…

Currently you’re executing TransformPosition on AbsoluteWorldPosition.

If you instead subtract the position of the object from AbsoluteWorldPosition first, then use TransformVector on the result it should ignore the local scale.

You can get the object position by transforming (0,0,0) from local to world.


Well, this is wrong, but I am posting it… Now the texture indeed seems to trying to scale independently when I scale the object, but it still continues to stretch with the object.

I am sorry, but all I can really do is to try to brute force the problem, and I doubt I can solve it like that. Could you post a solution if that doesn’t bother you?

You’re close, there’s two options.

If you use this exclusively with meshes, you can just connect object position straight into the subtract here.
image

Or if you want it to be slightly more flexible, you can connect 0,0,0 into the transform, then connect that into the subtract.
image

Problem is, I already try those and they didn’t work… Here is the result:
UE4Editor_Sc9F1lV02Y
The previous post gives no better results, but the scaling of the texture seems to at least trying to be independent from the object… although as well - fail.
UE4Editor_G4BfIuL68K

1 Like

Here’s a working Object Aligned Triplanar Material Function

The texture UVs scale with the object’s world dimensions, but stay aligned with the object’s local orientation. It also handles normal maps properly and mirrors the “back” axis projections.

7 Likes

Standing on the shoulders of giants applies full power here. I am speechless. This is some fine fine work. Thank you sir, this is game changing function, extremely useful.
Ok, again because that thing is incredible - thank you, respect!

Hello,

Your solution works well with static mesh but not with Instanced Static Mesh.
Do you have any solution for this

I am not sure if there’s a solution for that kind of stuff. Because it’s taking samples based on the original mesh, that’s the limitation of HISM

So how you go to actually use World Aligned texture with ISM?

Btw the difference happens only after the conversion of World Position & vertex Normal from “World” to “Local” (Look at the first image showing the vertex normal data for Static mesh and ISM)… So maybe if there is a way to sample instance transforms to mitigate that.