Страница 1 из 1

Изогнуть прямоугольник по дуге

СообщениеДобавлено: 30 авг 2017, 18:40
alt3d
Подскажите пожалуйста формулу преобразования UV-координат из прямоугольника в дугу/арку

Изображение

Re: Изогнуть прямоугольник по дуге

СообщениеДобавлено: 03 сен 2017, 20:45
Cr0c
Чтобы по uv бралось из сегмента, а не прямоугольника?

Re: Изогнуть прямоугольник по дуге

СообщениеДобавлено: 04 сен 2017, 16:06
alt3d
У меня есть кваратный плейн и квадратная текстура.
Хочу шейдером на этом плейне рисовать текстуру не квадратом, а аркой.
Для этого нужно как-то рассчитать новые UV-координаты.
Ну если есть еще какой-то способ - буду рад услышать.

Скрытый текст:
Изображение

Re: Изогнуть прямоугольник по дуге

СообщениеДобавлено: 04 сен 2017, 17:33
bojlahg
Просто поменять координаты не выйдет - для этого надо субдивайтить полигон несколько раз либо писать свой шейдер с выборкой нужных пикселов.

Re: Изогнуть прямоугольник по дуге

СообщениеДобавлено: 04 сен 2017, 17:35
seaman
Хочу шейдером на этом плейне рисовать текстуру не квадратом, а аркой.

А остальная часть плейна прозрачная, черная, или еще что-то?

Re: Изогнуть прямоугольник по дуге

СообщениеДобавлено: 05 сен 2017, 09:01
alt3d
bojlahg писал(а):Просто поменять координаты не выйдет - для этого надо субдивайтить полигон несколько раз либо писать свой шейдер с выборкой нужных пикселов.

Так я и пишу шейдер.

seaman писал(а):
Хочу шейдером на этом плейне рисовать текстуру не квадратом, а аркой.

А остальная часть плейна прозрачная, черная, или еще что-то?


Этот прямоугольник/арка должна быть маской в шейдере.
Мысль была какая - взять текстуру (черный квадрат с белыми краями), сделать ее НЕтайловой, изогнуть и использовать как маску.
В идеале вообще обойтись без текстуры, просто считать координаты и красить все что попадает внутрь арки черным, а снаружи белым.
Сейчас я конечно нарисовал нужную маску в фотошопе, но хотелось-бы сделать ее нестатичной, а изгибать в зависимости от каких-то параметров.

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

Re: Изогнуть прямоугольник по дуге

СообщениеДобавлено: 05 сен 2017, 11:51
Cr0c
Партиклами сделать?

Re: Изогнуть прямоугольник по дуге

СообщениеДобавлено: 05 сен 2017, 12:00
alt3d
Cr0c писал(а):Партиклами сделать?

Я с партиклами не особо плотно знаком. Как определять какие партиклы удалять?
С ходу могу предложить только делать их физичными. Но мне кажется слишком жирно будет партиклами такую вещь делать.

Пока вот так получается.
Маска по цветам вершин меша

Re: Изогнуть прямоугольник по дуге

СообщениеДобавлено: 05 сен 2017, 13:15
jetyb
Неужели так сложно перевести евклидовы координаты на плоскости в полярные, а потом просто проверить
(R, phi) на принадлежность нужному интервалу.
Функции Cg тут
http://developer.download.nvidia.com/Cg ... dix_e.html

Re: Изогнуть прямоугольник по дуге

СообщениеДобавлено: 05 сен 2017, 13:42
alt3d
jetyb писал(а):Неужели так сложно перевести евклидовы координаты на плоскости в полярные, а потом просто проверить
(R, phi) на принадлежность нужному интервалу.
Функции Cg тут
http://developer.download.nvidia.com/Cg ... dix_e.html


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

Re: Изогнуть прямоугольник по дуге

СообщениеДобавлено: 05 сен 2017, 13:58
jetyb
Синтаксис:
Используется csharp
fixed4 GetColor(float2 uv)
{
//константы \ шейдерные постоянные
float2 center = float2 (0.5, 0.3);
float rMin = 0.3;
float rMax = 0.5;
float degToRad = 3.1415926 / 180.0;
float phiMin = 45 * degToRad;
float phiMax= 135 * degToRad;


float dr = uv - center;
float r = length(dr);
float phi = atan2(dr.y, dr.x);


//нормализация до 0 - 1
r = (r - rMin) / (rMax - rMin);
phi = (phi - phiMin)/(phiMax - phiMin);

if(r < 0 || r > 1 || phi < 0 || phi > 1) return 0;
return tex2D(_MainTex, float2(r, phi));
}
 

Re: Изогнуть прямоугольник по дуге

СообщениеДобавлено: 05 сен 2017, 15:31
alt3d
jetyb писал(а):.


Очень круто. Спасибо большое.
Не ожидал прям рабочий код получить.

Изображение