Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Decal wrap around mesh

I'm working on tattoo simulator program, i need to know if there's a way for the decal (tattoo) to wrap arond the target mesh, like having a tattoo that goes from one side to the other side of lets say leg, or event behind it.

enter image description here

like image 698
chakmeshma Avatar asked Sep 14 '25 04:09

chakmeshma


2 Answers

Not at runtime, using a projected decal, no.

What you need here instead is a procedural tattoo map. Think of it as another texture, like a lightmap. You may need a custom shader, but it could possibly be done with the secondary albedo channel of the standard shader.

The tricky part is writing to that texture. I'll outline the basic algorithm, but leave it up to you to implement:

The first thing you need to be able to do is unwrap the mesh's triangles in code. You need to identify which edges are contiguous on the UV map, and which are separate. Next, you need a way to identify the tattoo and the initial transform. First, you'll want to define an origin on the tattoo source texture that it will rotate around. Then you'll want to define a structure that references the source texture, and the UV position (Vector2) / rotation (float) / scale (float) to apply it to in the destination texture.

Once you have the tattoos stored in that format, then you can start building the tattoo mask texture for the skin. If your skin uvs have a consistent pixel density, this is a lot easier because you can work primarily in uv-space, but if not, you'll need to re-project to get the scale for each tri. But, basically, you start with the body triangle that contains the origin, and draw onto that triangle normally. From there, you know where each vertex and edge of that triangle lies on the tattoo source texture. So, loop through each neighboring triangle (I recommend a breadth-first recursive method) and continue it from the edge you already know. If all three verts fall outside the source texture's rect, you can stop there. Otherwise, continue with the next triangle's neighbors. Make sure you're using the 3D mesh when calculating neighbors so you don't get stuck at seams.

That algorithm is going to have an edge case you'll need to deal with for when the tattoo wraps all the way around and overlaps itself, but there are a couple different ways you can deal with that.

Once you've written all tattoos to the tattoo texture, just apply it to the skin material and voila! Not only will this move all the calculations out of real-time rendering, but it will let you fully control how your tattoos can be applied.

like image 55
Louis Ingenthron Avatar answered Sep 15 '25 18:09

Louis Ingenthron


You can use a decal projector using Unity's official preview tool Render Pipelines - High Definition.

Here's how I used it to project a "tatoo" onto a bucket. You can apply it to your model of course. (Child the decal projector so that the tatoo follows the model)

enter image description here

The best way to import Render Pipelines - High Definition package is to use Unity Hub to create a new project, choosing it as a template. If it's an existing project, this official blog might help you.

Once you succefully set up the package, follow this tutorial and you'll be able to project tatoos onto your models anywhere you want.

like image 27
ClarHandsome Avatar answered Sep 15 '25 19:09

ClarHandsome