Наклейка вокруг сетки - PullRequest
0 голосов
/ 04 марта 2019

Я работаю над программой симулятора татуировок, мне нужно знать, есть ли способ, чтобы наклейка (тату) обернула вокруг целевой сетки, например, татуировку, которая идет с одной стороны на другую сторону, скажем, ногиили событие за этим.

enter image description here

Ответы [ 3 ]

0 голосов
/ 14 марта 2019

Не во время выполнения, с использованием проецируемой декали, нет.

Вместо этого вам нужна процедурная тату-карта.Думайте об этом как о другой текстуре, как о карте света.Вам может понадобиться пользовательский шейдер, но это может быть сделано со вторым каналом альбедо стандартного шейдера.

Сложная часть заключается в записи в эту текстуру.Я опишу основной алгоритм, но оставлю на ваше усмотрение реализовать:

Первое, что вам нужно сделать, это развернуть треугольники меша в коде.Вам необходимо определить, какие ребра являются смежными на УФ-карте, а какие - отдельными.Далее вам нужен способ идентифицировать татуировку и начальную трансформацию.Во-первых, вы захотите определить источник на текстуре источника татуировки, вокруг которой он будет вращаться.Затем вы захотите определить структуру, которая ссылается на исходную текстуру, а также на позицию UV (Vector2) / вращение (float) / scale (float), чтобы применить ее в текстуре назначения.

Как только вы получитетатуировки хранятся в этом формате, тогда вы можете приступить к созданию текстуры маски татуировки для кожи.Если ваши скины имеют постоянную плотность пикселей, это намного проще, потому что вы можете работать в основном в ультрафиолетовом пространстве, но если нет, вам придется перепроектировать, чтобы получить масштаб для каждого три.Но, в основном, вы начинаете с треугольника тела, который содержит начало координат, и нормально рисуете на этом треугольнике.Оттуда вы знаете, где каждая вершина и край этого треугольника лежит на исходной текстуре татуировки.Итак, пройдитесь по каждому соседнему треугольнику (я рекомендую рекурсивный метод в ширину) и продолжите его с того края, который вы уже знаете.Если все три вершины находятся вне прямоугольника исходной текстуры, вы можете на этом остановиться.В противном случае продолжайте с соседями следующего треугольника.Убедитесь, что вы используете 3D-сетку при расчете соседей, чтобы не застрять в швах.

Этот алгоритм будет иметь крайний случай, с которым вам придется иметь дело, когда татуировка оборачивает всеи наоборот, но есть несколько разных способов справиться с этим.

После того, как вы написали все татуировки для текстуры татуировки, просто нанесите ее на материал кожи и вуаля!Это не только выведет все расчеты из рендеринга в реальном времени, но и позволит полностью контролировать применение татуировок.

0 голосов
/ 16 марта 2019

Я сделал нечто подобное с пользовательским шейдером.Я думаю, что это будет делать то, что вы хотите.Мой динамически отображает флаги в зависимости от ранга и типа юнита для прототипа игры для iPad.То, как вы будете это делать, немного зависит от того, как у вас настроены вещи в вашем проекте, но вот то, что у меня выглядит - первое изображение - это каркас, показывающий сетку, а второе - с включенными шейдерами и показывает, что они добавляют цвета иэмблема в зависимости от ранга и единицы.Я только что включил шейдер для верхнего флага, так как в него добавлена ​​эмблема отряда, похожая на то, как вы хотите, чтобы ваша татуировка была:

enter image description here enter image description here

Обратите внимание, что вы можете прикрепить несколько шейдеров к определенной сетке.

А эмблема - это просто изображение с прозрачностью, которое добавляется в шейдер и упоминается как текстура внутри шейдера.:

shader parameter setup - emblem

Вы можете видеть, что у нас также есть изображение с некоторой текстурой тени, которая используется в качестве фона для баннера.

Это мой первый шейдер, который был написан некоторое время назад, поэтому я уверен, что он неоптимален во всех отношениях, но, надеюсь, этого будет достаточно, чтобы начать работу (и он все еще работает в Unity 2018.3.x, хотя япришлось взломать некоторые изменения, чтобы заставить его скомпилироваться):

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
}}
}

Шейдеры немного сводят с ума, чтобы научиться делать, но довольно забавно, когда вы заставите их работать - как большинство программ:)

В моем случае текстура наложения былаон того же размера / формы, что и флаг, что делает его немного легче.Я думаю, вам нужно добавить некоторые параметры в шейдер, которые указывают, где вы хотите, чтобы наложение было нарисовано относительно меша, и ничего не делаете для вершин / фрагментов за пределами границ татуировки, как первая мысль.

0 голосов
/ 13 марта 2019

Вы можете использовать проектор для декалей, используя официальный инструмент предварительного просмотра Unity. Визуализация конвейеров - высокое разрешение.

Вот как я использовал его, чтобы спроецировать "татуировку" на ведро.Вы можете применить это к своей модели, конечно.(Дочерний проектор для наклеек, чтобы татуировка следовала за моделью)

enter image description here

Лучший способ импортировать пакет Render Pipelines - High Definition - используйте Unity Hub для создания нового проекта , выбрав его в качестве шаблона.Если это уже существующий проект, вам может помочь официальный блог .

После того, как вы успешно настроите пакет, следуйте этому руководству , и вы сможете проецировать татуировки на свои модели в любом месте.

...