Render.ru

Брать значение с кривой

dalek

Активный участник
Рейтинг
7
#1
На каждом маленьком круге такой код:
Код:
distance = length(transform.yPosition, thisComp.layer("cursor").transform.yPosition);
d2 = d;

if (distance>230) d2 = 230;

transform.xPosition = 750-(230-d2);
То есть находит расстояние между двумя объектами по y, а дальше убавляет x позицию, пока не уйдет слишком далеко (230)

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

Можно ли как-нибудь это контролировать? Например сделать что-нибудь на вроде easy ease?
Я подумывал над возможностью брать значения из кривой.
Если вы случайно работали в Unity, то возможно знаете как работают тамошние кривые – в коде просто вводится значение по X, а дальше находится точка по Y.
Я искал что-то похожее, но не нашел. Таким образом можно было бы просто найти конкретную цифру в зависимости от расстояния.
 

Вложения

M.O.Z.G

Знаток
Рейтинг
50
#2
Не, надо брать координаты чёрного круга как центр окружности, дистанцию как радиус, и высчитывать X координату белого кружка относительно Y на этой воображаемой окружности.
Но у такого подхода будет один минут, на краях переход будет резкий.

Другой вариант, это брать крайнюю левую точку как А и крайнию правую как B (* -1 для отрицательных значений), и написать формулу Ease графика, которая будет вычислять Y координату на отрезке AB плавно. По сути, то, что Ты и имеешь в виду, только формулу надо писать вручную. Погугли в интернете easing формулы на JavaScript, как раз подойдёт для AE.
Или вот здесь посмотри интерполяцию между двумя значениям, если глубокого контроля не нужно:
http://help.adobe.com/en_US/AfterEffects/9.0/WS3878526689cb91655866c1103906c6dea-7a06a.html
 
Симпатии: dalek

dalek

Активный участник
Рейтинг
7
#3
Интерполяция ease(t, value1, value2) идеально подходит :)


Код:
 distance = length(transform.yPosition, thisComp.layer("cursor").transform.yPosition);
d3 = 230;

e = ease(distance/d3, 600, 700);

if (distance>d3) d2 = d3;

e
 

Вложения

dalek

Активный участник
Рейтинг
7
#6
Они же все равноудалённые. Или я не понял вопрос.
Забыл упомянуть, что расстояние только по позиции Y :) Таким образом получается, что только один будет самый ближний.
 
Последнее редактирование:

M.O.Z.G

Знаток
Рейтинг
50
#7
Хм. Ну например - если Y маленького круга = Y пальца. Ну, и накинуть +/- дельту какую-нибудь,чтобы он какое-то время задерживался. Как я это понял, по крайней мере.

Я думал в сторону массивов, но не представляю как они работают.
Так же как и в любом языке. Но в After Effects нет глобальных переменных и референсных массивов. Со слоями проще работать обращаясь к ним по индексу.

Чтобы сильно не переделывать, то что уже напилил. Предложу такой вариант:
Сделай слайдер, который будет передавать индексы слоёв с белыми кружками. Условно, там от 1.00 до 30.00. Насчитай шаг (или возьми его из расстояния, между двумя первыми, например кружками, если там ещё что-то будет меняться, может будет удобно так) с которым они чередуються и свяжи с Y координатами кружка-пальца. В итоге у Тебя должен будет получится контроллер позиционирующий палец возле вполне конкретного индекса слоя, и ты точно будешь знать какого, потому что указываешь его слайдером.
После этого на курсор напиши выражение, которое будет забирать координаты у слоя и индексом n (получаемым от слайдера). Так как индекс - это целое число, и тебе нужно будет его округлять - получатся резкие скачки курсора с буквы на букву.
В этом случае, Ты естественно теряешь возможность анимировать палец независимо. Поэтому нужно продумать, также, как ты будешь дальше всё делать. Я обычно делаю несколько курсоров между программируемым и свободным перемещением, и меняю их видимость по ходу анимации.
 
Симпатии: dalek

M.O.Z.G

Знаток
Рейтинг
50
#11
Не соображаю как это делается.
Пока только понял, что нужно слайдер сделать))
Ну, смотри, допустим у тебя всё расстояние от верх до низа кружка-пальца это условно 0-320px. Кружки-буквы идут с шагом 10px. Таким образом, ты можешь связать слайдер с позишеном кружка-пальца следующим образом:

y = thisComp.layer("Controller").effect("Slider Control")("Slider")*10
[value[0], y]

Тогда когда ты выставишь, например слайдер на 2, палец переместить на Y 20px, и будет расположен напротив второго кружка.
Тогда выражение позишен курсора будет:

letterID = thisComp.layer("Controller").effect("Slider Control")("Slider");
letterID = Math.round(letterID);
letterVector = thisComp.layer(letterID).transform.position;

Числа, естественно, все условные.
 
Последнее редактирование:
Симпатии: dalek

dalek

Активный участник
Рейтинг
7
#12
Код:
letterVector = thisComp.layer("layerName[letterID]").transform;
последнюю строчку не очень понял. Нужно что-то написать вместо layerName[letterID]?
 

M.O.Z.G

Знаток
Рейтинг
50
#13
Код:
letterVector = thisComp.layer("layerName[letterID]").transform;
последнюю строчку не очень понял. Нужно что-то написать вместо layerName[letterID]?
Пардон. Исправил. Просто индекс.
letterVector = thisComp.layer(letterID).transform.position;
 
Последнее редактирование:
Симпатии: dalek

dalek

Активный участник
Рейтинг
7
#14
Нужно было еще .position добавить)
Код:
letterVector = thisComp.layer(letterID).transform.position;
 
Сверху