Страница 2 из 3

Re: Подскажите адекватную схему UV развертки треугольника в 3D

СообщениеДобавлено: 24 окт 2014, 21:16
bwolf88
У тебя все равно растянутые текстуры получаются.
Посмотри на полигоны с двумя нормалями, снизу вверх размеры больше, чем слева направо в одном варианте и наоборот в другом

Изображение

Re: Подскажите адекватную схему UV развертки треугольника в 3D

СообщениеДобавлено: 24 окт 2014, 21:42
Tolking
Видимо нашел неокончательную функцию. Прошу прощения! Полностью рабочего примера у меня уже нет т.к. забил на этот способ. Он навел меня на мысль, что даже если сделать на не вертикальных поверхностях текстуру не растянутой, то победить в реалтайме сдвиг сетки у меня не получится...

http://unity3d.ru/distribution/viewtopic.php?f=105&t=22728&view=unread#unread

3----------4---
/
/
1-----------2

то uv для стороны 1-2 будет, например,(0;0)-(0;1),
тогда 2-3 будет примерно (0;0)-(0;0.5),
а сторона 3-4 какая будет? (0;0.5)-(0;.../*если 1, то растянет текстуру)*/).

3-4 должна быть (0.5,1.5)

Re: Подскажите адекватную схему UV развертки треугольника в 3D

СообщениеДобавлено: 24 окт 2014, 21:45
bwolf88
Изображение

С двумя нормалями кажись решил.

А что значит победить сдвиг сетки ? на машинке тоже есть сдвиг сетки. Или имеются ввиду вот эти маленькие полоски (внизу например). То есть чтобы текстура на одном полигоне продолжала текстуру на другом.

Re: Подскажите адекватную схему UV развертки треугольника в 3D

СообщениеДобавлено: 24 окт 2014, 21:49
Woolf
Можете тупо присвоить УВ координаты вертекса и будет все работать

Проблема же с Z координатой. У UV две координаты, а просто так отбрасывать Z тоже нельзя. Но вы правы, надо плясать от координат вертекса, только надо как-то пересчитать их в планарные координаты. С налета чегой-то не выходит.

Вот что накопал, курите ))
https://ru.wikipedia.org/wiki/UV-%D0%BF ... 0%B8%D0%B5

потом нам расскажете, тоже заинтересовало.

Re: Подскажите адекватную схему UV развертки треугольника в 3D

СообщениеДобавлено: 24 окт 2014, 21:52
Tolking
9492d2d7d734.png


Я думаю на машинке в рамках конкретной единой сетки нет сдвига текстурных координат. Иначе сложно было-бы текстуру на нее рисовать...

Re: Подскажите адекватную схему UV развертки треугольника в 3D

СообщениеДобавлено: 24 окт 2014, 21:58
bwolf88
Так на машинке сдвиги тоже есть. Хотя вру, слвиги на других деталях есть, переход на кузове плавный.

Изображение

Re: Подскажите адекватную схему UV развертки треугольника в 3D

СообщениеДобавлено: 24 окт 2014, 22:05
Tolking
Хвались чего ты там насчитал. :)

Re: Подскажите адекватную схему UV развертки треугольника в 3D

СообщениеДобавлено: 24 окт 2014, 22:10
bwolf88
А вообще я смотрю на машинку - ведь там текстура рисуется одной развертной.
Модельки же режут по швам и потом разворачивают и разрисовывают материал.

Понять бы алгоритм такого рисования... Сейчас закончу с третьей нормалью и буду пробовать :D.

Для двух нормалей получается вот такая штука (пока громоздкая)

normalP - это нормаль
coord1, coord2, coord3 - координаты вертекса треугольника.

Синтаксис:
Используется csharp

else if ((normalP.z == 0 && normalP.x != 0 && normalP.y != 0)
|| (normalP.y == 0 && normalP.x != 0 && normalP.z != 0)
||(normalP.x == 0 && normalP.z != 0 && normalP.y != 0)){
if( Mathf.Abs(normalP.x) >= Mathf.Abs(normalP.y) && Mathf.Abs(normalP.x) >= Mathf.Abs(normalP.z) && normalP.z == 0 ){ //для normal.z == 0
    UVs.Add (new Vector2 (coord1.y*1.41f, coord1.z));
    UVs.Add (new Vector2 (coord2.y*1.41f, coord2.z));
    UVs.Add (new Vector2 (coord3.y*1.41f, coord3.z));
}
else if( Mathf.Abs(normalP.y) >= Mathf.Abs(normalP.x) && Mathf.Abs(normalP.y) >= Mathf.Abs(normalP.z) ) { // для normal.x == 0
    UVs.Add (new Vector2 (coord1.x, coord1.z*1.41f));
    UVs.Add (new Vector2 (coord2.x, coord2.z*1.41f));
    UVs.Add (new Vector2 (coord3.x, coord3.z*1.41f));
}else {
    UVs.Add (new Vector2 (coord1.x*1.41f, coord1.y)); //для normal.y == 0
    UVs.Add (new Vector2 (coord2.x*1.41f, coord2.y));
    UVs.Add (new Vector2 (coord3.x*1.41f, coord3.y));
}
}

 

Re: Подскажите адекватную схему UV развертки треугольника в 3D

СообщениеДобавлено: 24 окт 2014, 23:06
bwolf88
Не пойму как правильно развернуть текстуру, чтобы не было искривлений. Все размеры при 3 нормалях умножаем на 1.41f, тогда не будет общего увеличения маштаба текстуры, но все еще остается растяжение из-за искривления.

Распишите поподробее как свинуть вершины текстуры, а то я в матрицах не очень разбираюсь (уже лет 7 не решал).

Re: Подскажите адекватную схему UV развертки треугольника в 3D

СообщениеДобавлено: 24 окт 2014, 23:07
waruiyume
ИМХО: не развернёте Вы идеально, никак- всегда, будут либо искажения либо швы (посмотрите на персонажей из игр, зря у них, что-ли, уши оторваны?)
Поищите трипланар шейдеры- вам понравится.
Синтаксис:
Используется glsl
Shader "Custom/TriplanarSimple" {
        Properties {
                _MainTex ("Base (RGB)", 2D) = "white" {}
        }
        SubShader {
                Tags { "RenderType"="Opaque" }
                LOD 200
               
                CGPROGRAM
                #pragma surface surf Lambert

                sampler2D _MainTex;

                struct Input {
                        float2 uv_MainTex;
                        float3 worldNormal;
                        float3 worldPos;
                };

                void surf (Input IN, inout SurfaceOutput o) {
                        half4 up = tex2D (_MainTex, IN.worldPos.xz/7);
                        half4 right = tex2D (_MainTex, IN.worldPos.yz/7);
                        half4 frnt = tex2D (_MainTex, IN.worldPos.yx/7);
                       
                        IN.worldNormal = normalize(IN.worldNormal);
                        IN.worldNormal = abs(IN.worldNormal);
                        IN.worldNormal = saturate(pow(IN.worldNormal*1.3, 5));
                       
                        //half4 result = up * IN.worldNormal.y;
                        half4 result = up;
                        result = lerp(right, result, 1-IN.worldNormal.x);
                        result =  lerp(frnt, result, 1-IN.worldNormal.z);
                        result =  lerp(up, result, 1-IN.worldNormal.y);
                       
                        o.Albedo = result.rgb;
                        o.Alpha = 1;
                }
                ENDCG
        }
        FallBack "Diffuse"
}

 

Re: Подскажите адекватную схему UV развертки треугольника в 3D

СообщениеДобавлено: 24 окт 2014, 23:13
bwolf88
Обясните, вот это ---"IN.worldPos.xz"--- как читать: как произведение векторов или сумму ?

Re: Подскажите адекватную схему UV развертки треугольника в 3D

СообщениеДобавлено: 24 окт 2014, 23:25
waruiyume
Это называется "свизл"(чёт, я Поттера вспомнил :p )
Если у вас есть вектор с 3-мя компонентами, и вы Вы обращаетесь(читаете) к двум из них, то на выходе получается вектор с 2-мя, теми самыми компонентами.
Что-то в духе: vector3.xy=>vector2; vector2.x == vector3.x, vector2.y == vector3.y
Рекомендую viewtopic.php?f=96&t=1642&p=184309#p85110

Re: Подскажите адекватную схему UV развертки треугольника в 3D

СообщениеДобавлено: 24 окт 2014, 23:32
bwolf88
За ссылку благодарю, сейчас буду знакомиться. Н все же пока не понятно еще кое что. Вся вот эта конструкция используется для одного вертекса или для полного треугольника ? И если для одного вертекса, то как получить значение развертки для треугольника :-\.

half4 up = tex2D (_MainTex, IN.worldPos.xz/7);
half4 right = tex2D (_MainTex, IN.worldPos.yz/7);
half4 frnt = tex2D (_MainTex, IN.worldPos.yx/7);

Пойду почитаю, чего ж такое шейдеры.

И еще один вопрос немного не по теме (я не очень разбираюсь в архитектуре).
Получается что шейдеры обрабатываются напрямую на GPU, тем самым разгружая CPU ? То есть сейчас у меня идет обработка развертки в общем вычислительном потоке, будет ли разгрузка Main потока если все это перенести в шейдеры.

Помню в середине 200-х выпускали миниигрушки с вычислениями на чистом GPU по каким то алгоритмам (kkreger или как то так назывались). Весила такая игрушка или ролик 50-60 кб.

PS. извиняюсь если чего то не то наворотил.

Re: Подскажите адекватную схему UV развертки треугольника в 3D

СообщениеДобавлено: 24 окт 2014, 23:35
Tolking
.jpg

Синтаксис:
Используется csharp
        Vector2 CalcUV (Vector3 v, Vector3 n)
        {
                Vector2 uv = new Vector2 (v.x, v.z);
               
                if (Mathf.Abs(n.y) == 0.0f) {
                        uv= new Vector2 (v.y, v.z);
                        if (Mathf.Abs(n.x)== 0.0f)
                                uv= new Vector2 (v.x, v.y);
                }
               
               
                if (Mathf.Abs(n.x+n.y+n.z)==1) return uv;
               
                if (n.x*n.y*n.z!=0.0f) {uv.x*=1.41f;uv.y*=1.41f;}else
                {
                if (Mathf.Abs(Mathf.Abs(n.x)-Mathf.Abs(n.y))<=0.1f) uv.x*=1.41f;
                if (Mathf.Abs(Mathf.Abs(n.x)-Mathf.Abs(n.z))<=0.1f) uv.y*=1.41f;
                if (Mathf.Abs(Mathf.Abs(n.y)-Mathf.Abs(n.z))<=0.1f) uv.y*=1.41f;
                }
               
                return uv;
        }
 


Я уже писал выше что избавиться от швов не получится никак в принципе... Нельзя обернуть листом бумаги шар без складок.

Re: Подскажите адекватную схему UV развертки треугольника в 3D

СообщениеДобавлено: 24 окт 2014, 23:45
bwolf88
Ну пусть будет пока со швами.
Вот только чистый угол - все равно искажается.

Изображение