4
votes

Autocollant enveloppant la maille

Je travaille sur un programme de simulation de tatouage, j'ai besoin de savoir s'il existe un moyen pour le décalque (tatouage) de s'enrouler autour du maillage cible, comme avoir un tatouage qui va d'un côté à l'autre de la jambe, disons , ou un événement derrière.

 entrez la description de l'image ici


2 commentaires

Ne pas utiliser de système de décalcomanie standard.


Avez-vous une image de l'effet souhaité, pour que nous puissions mieux le comprendre?


3 Réponses :


1
votes

Vous pouvez utiliser un projecteur de décalcomanie à l'aide de l'outil de prévisualisation officiel de Unity Pipelines de rendu - Haute définition.

Voici comment je l'ai utilisé pour projeter un "tatoo" sur un seau. Vous pouvez bien sûr l'appliquer à votre modèle. (Enfant le projecteur de décalcomanie pour que le tatouage suive le modèle)

 entrez la description de l'image ici

La meilleure façon d'importer des pipelines de rendu - package haute définition consiste à utiliser Unity Hub pour créer un nouveau projet , en le choisissant comme modèle. S'il s'agit d'un projet existant, ce blog officiel pourrait vous aider.

Une fois que vous avez correctement configuré le package, suivez ce tutoriel et vous être capable de projeter des tatouages ​​sur vos modèles où vous le souhaitez.


2 commentaires

J'ai besoin de l'autocollant pour envelopper un objet, par ex. si la décalcomanie est assez grande, des portions de décalcomanie s'étendent derrière l'objet ...


Une fois que vous avez imbriqué le projecteur, c'est comme emballé. Vous pouvez déplacer et mettre à l'échelle le projecteur pour l'étirer.



3
votes

Pas au moment de l'exécution, en utilisant une décalcomanie projetée, non.

Ce dont vous avez besoin ici, c'est une carte de tatouage procédurale. Considérez-le comme une autre texture, comme une lightmap. Vous aurez peut-être besoin d'un shader personnalisé, mais cela pourrait être fait avec le canal d'albédo secondaire du shader standard.

La partie délicate est d'écrire sur cette texture. Je vais décrire l'algorithme de base, mais vous laisse le soin de l'implémenter:

La première chose à faire est de déplier les triangles du maillage dans le code. Vous devez identifier les arêtes contiguës sur la carte UV et celles qui sont séparées. Ensuite, vous avez besoin d'un moyen d'identifier le tatouage et la transformation initiale. Tout d'abord, vous voudrez définir une origine sur la texture source du tatouage autour de laquelle elle tournera. Ensuite, vous voudrez définir une structure qui référence la texture source et la position UV (Vector2) / rotation (float) / scale (float) à laquelle l'appliquer dans la texture de destination.

Une fois que vous avez stocké les tatouages ​​dans ce format, vous pouvez commencer à créer la texture du masque de tatouage pour la peau. Si les uv de votre peau ont une densité de pixels cohérente, c'est beaucoup plus facile car vous pouvez travailler principalement dans l'espace uv, mais sinon, vous devrez re-projeter pour obtenir l'échelle de chaque tri. Mais, fondamentalement, vous commencez par le triangle du corps qui contient l'origine et vous dessinez normalement sur ce triangle. À partir de là, vous savez où se trouvent chaque sommet et chaque bord de ce triangle sur la texture source du tatouage. Alors, parcourez chaque triangle voisin (je recommande une méthode récursive en largeur d'abord) et continuez à partir du bord que vous connaissez déjà. Si les trois verts tombent en dehors du rectangle de la texture source, vous pouvez vous arrêter là. Sinon, continuez avec les voisins du triangle suivant. Assurez-vous que vous utilisez le maillage 3D lors du calcul des voisins afin de ne pas rester coincé au niveau des coutures.

Cet algorithme va avoir un cas particulier que vous devrez gérer lorsque le tatouage s'enroule tout autour et se chevauche, mais il existe plusieurs façons de gérer cela.

Une fois que vous avez écrit tous les tatouages ​​sur la texture du tatouage, appliquez-le simplement sur le matériau de la peau et le tour est joué! Non seulement cela déplacera tous les calculs du rendu en temps réel, mais cela vous permettra de contrôler entièrement la façon dont vos tatouages ​​peuvent être appliqués.


0 commentaires

1
votes

J'ai fait quelque chose de similaire avec un shader personnalisé. Je pense que ça ferait ce que tu veux. Le mien est un rendu dynamique des drapeaux en fonction du rang et du type d'unité pour un prototype de jeu iPad. La manière exacte dont vous allez le faire dépend un peu de la façon dont vous avez configuré les choses dans votre projet, mais voici à quoi ressemble le mien - la première image est le filaire montrant le maillage et la seconde avec les shaders activés et les montre en ajoutant les couleurs emblème basé sur le rang et l'unité. Je viens d'inclure le shader pour le drapeau supérieur, car l'emblème de l'unité a été ajouté de la même manière que vous voulez que votre tatouage soit:

 entrez la description de l'image ici entrez la description de l'image ici

Notez que vous pouvez attacher plusieurs shaders à un maillage particulier.

Et l'emblème est juste une image avec transparence qui est ajoutée au shader et référencé comme texture dans le shader:

shader parameter setup - emblem

Vous pouvez voir que nous avons aussi une image qui en a texture d'ombre qui est utilisée comme arrière-plan de la bannière.

Ceci est mon premier shader et a été écrit il y a quelque temps, donc je suis sûr qu'il est sous-optimal de toutes sortes de façons, mais il devrait l'être assez pour vous aider à démarrer (et cela fonctionne toujours dans Unity 2018.3.x, même si j'ai dû pirater quelques modifications pour le faire compiler):

Shader "Custom/TroopFlagEmblemShader" {

Properties {
    _BackColor ("Background Color", Color) = (0.78, 0.2, 0.2)       // scarlet  
    _MainTex ("Background (RGBA)", 2D) = "" {}
    _EmblemTex("Emblem (RGBA)", 2D) = "" {}
    _Rank ( "Rank (1-9)", Float ) = 3.0
}

SubShader {


Pass {

CGPROGRAM
#pragma exclude_renderers xbox360 ps3 flash
#pragma target 3.0
#pragma vertex vert
#pragma fragment frag

#include "UnityCG.cginc"

struct appdata {
    float4 vertex: POSITION;
    float4 texcoord: TEXCOORD0;
};

struct v2f {
    float4 pos: SV_POSITION;
    float2 uv: TEXCOORD0;
};


uniform sampler2D _MainTex;
uniform sampler2D _EmblemTex;
uniform float3 _BackColor;
uniform float _Rank;

v2f vert( appdata v ) 
{
    v2f o;

    o.pos = UnityObjectToClipPos( v.vertex );
    o.uv = v.texcoord.xy;

    return o;
}


float4 frag( v2f IN ) : COLOR
{
    float4 outColor;
    float4 backTextureColor = tex2D( _MainTex, IN.uv.xy );
    float4 emblemTextureColor = tex2D( _EmblemTex, IN.uv.xy );

        // not drawing the square at all above rank 5
    if ( _Rank >= 6.0 )
        discard;

    if ( _Rank < 5 )                                    // 4 and below 
    {           
        outColor = float4( (emblemTextureColor.rgb * emblemTextureColor.a) + 
                            (((1.0 - emblemTextureColor.a) * backTextureColor.rgb) * _BackColor.rgb) , 1 );

        // float4(_BackColor.rgb, 1 ));
    }
    else if ( _Rank >= 5.0 ) // but excluded from 6 above
    {
        // 5 is just solid backcolor combined with background texture
        outColor = float4( backTextureColor.rgb * _BackColor.rgb, 1 );
    }

    return outColor;
}
ENDCG
}}
}

Les shaders sont un peu exaspérant d'apprendre à faire, mais assez amusant une fois que vous avez Ils fonctionnent - comme la plupart des programmes :)

Dans mon cas, la texture de superposition était de la même taille / forme que le drapeau, ce qui le rend un peu plus facile. Je pense que vous devrez ajouter des paramètres au shader qui indiquent où vous voulez que la superposition soit dessinée par rapport au maillage et ne rien faire pour les sommets / fragments en dehors des limites de votre tatouage, comme une première pensée. P >


1 commentaires

il me semble que vous devrez également tenir compte de l'échelle; Vous aurez probablement ces images de tatouage à une certaine échelle, mais l'utilisateur de votre logiciel voudra pouvoir ajuster cela. Vous devrez donc inclure cet ajustement d'échelle dans vos calculs de shader avec la position. Et cela, bien sûr, signifie que vous devrez également prendre en compte la rotation car ils peuvent également faire pivoter l'image. Donc certainement ce qui précède n'est qu'un point de départ.