Expressions

Универсальные экспрешены:

Если мы используем pick whip tool, для создания экспрешенов, то он часто привязывается к конкретному слою в конкретной композиции по его имени, то же самое и на счет самих параметров, к которым мы привязываемся.

Проблема:

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

Решение:

Использовать разные методы по универсализации ссылок в экспрешенах:

  1. Мы можем сделать привязку на основании parent объектов. Заменяя thisComp.layer("Layer Name"). на parent.
  2. Мы можем оперировать индексами (номерами самого слоя, по порядку от верхнего до нижнего). Заменяя thisComp.layer("Layer Name"). на thisComp.layer(index+1). Где index - это номер слоя, в котором мы пишем экспрешн, а +1 — это переход к следующему после него слою


Привязываясь к эффектам, нам нужно знать следующее. Многие эффекты для разных версий языка называются по разному. Например для слайдера:

effect("XYZ")("Slider") //English

effect("XYZ")("Schieberegler") //German

Для решения этого - есть универсальные коды эффектов:

effect("XYZ")(1) //Universal


Есть и другая форма записи универсального экспрешена, натыкаясь на которую раньше, я не совсем понимал, что это за крокозябры:

  • ("3D Point") = ("ADBE 3D Point Control-0001")
  • ("Angle") = ("ADBE Angle Control-0001")
  • ("Checkbox") = ("ADBE Checkbox Control-0001")
  • ("Color") = ("ADBE Color Control-0001")
  • ("Layer") = ("ADBE Layer Control-0001")
  • ("Point") = ("ADBE Point Control-0001")
  • ("Slider") = ("ADBE Slider Control-0001")

Источник информации: https://forums.adobe.com/thread/1851692


Экспрешены прыгающие по структуре, относительно параметра, в котором они написаны:

Для шейповых слоев и их эксрпешенов используется система переходов на разные группы параметров. Будет дописано позже...

thisProperty.propertyGroup(1).propertyIndex

propertyGroup(1) moves up one level from the propety the expression lives in, propertyGroup(2) moves up two levels, and so on. Hope that helps.

Движение по окружности:

radius = 300;
angle = time * 200;
x = radius*Math.cos(degreesToRadians(angle));
y = radius*Math.sin(degreesToRadians(angle));
z = 0;
center = [400,300,0]; //or wherever you want it to be
add(center, [x,y,z]);

Разбить имя слоя по символу / и ввывести первую часть имени слоя:

thisLayer.name.split("/")[0]  

Position — Linking | Положение слоя, независимо от привязки

n="Name your layer";

linkPosition=thisComp.layer(n).toWorld(thisComp.layer(n).anchorPoint);

lp=linkPosition;

Getting World Absolute 2d Rotation — Linking | Получение абсолютного вращение слоя, с учетом всех родительских слоев

r = rotation;

L = thisLayer;

while (L.hasParent){

r += L.parent.rotation;

L = L.parent;

}

r


Usability — Project — Sort | Символы для проброса пунктов в конец:

Ξ

3d — Scale — Compensation from Camera | Scale компенсация в 3D для паралакса:


1. Создаем две камеры2. Вставляем в скейл объектов

c = thisComp.layer("Camera 1");

point1 = position;

point2 = c.position;

d = length(point1, point2);

s = (d/c.zoom) * value[0];

[s, s, 100]

3d — Camera — Focus Distance — Layer | Linking camera's focus distance to layer

target = thisComp.layer("CAM INTEREST")

v1 = target.toWorld(target.anchorPoint) - toWorld([0,0,0]);

v2 = toWorldVec([0,0,1]);

dot(v1,v2)

Перевести текстовую строку в число:

n=parseInt(n);

Перевести число в текст:

n=n.toString();

Независимо от скейла и параметров привязки к другим объектам сохранить толщину строука вам поможет следующий экспрешн.

Закидываем в параметр строка шейпа Stroke Width:

L = thisLayer;
s = L.transform.scale;
while (L.hasParent){
  sp = L.parent.transform.scale;
  s = [s[0]*sp[0],s[1]*sp[1]]/100;
  L = L.parent;
}
value*100/s[0];

Экспрешен для обратной привязки к нулям паса, по имени слоя этого паса

var origPath = thisProperty; 
var origPoints = origPath.points(); 
var origInTang = origPath.inTangents(); 
var origOutTang = origPath.outTangents(); 
var getNullLayers = []; 
var getNullLayersIn = []; 
var getNullLayersOut = []; 
for (var i = 0; i < nullLayerNames.length; i++){ 
    try{  
        getNullLayers.push(thisComp.layer(nullLayerNames[i])); 
        getNullLayersIn.push(thisComp.layer(nullLayerNamesIn[i])); 
        getNullLayersOut.push(thisComp.layer(nullLayerNamesOut[i])); 
    } catch(err) { 
        getNullLayers.push(null); 
    }}