Adobe After Effects Forum
How to Bezier Path with no keyframes ?
How to Bezier Path with no keyframes ?
by Shai Benshoshan on Jan 7, 2019 at 9:38:50 am

Using the powerful ' Create nulls from paths ' script, I am writing a script that reads the Path from an external XML file.
The Path has no keyframes, but the points auto-created as linear :




How can I convert the path to bezier by script? or expression?
It can be done manually > select the path > alt+shift +click to convert the points to bezier :
Can AE do it automatically?


Thanks
Shai


Re: How to Bezier Path with no keyframes ?
by Oleg Pirogov on Jan 7, 2019 at 10:30:56 am

Since CC 18 you can directly access path nodes and their tangents in a manner like this:

comp("Comp").layer("Shape Layer").content("Shape").content("Path").path.points()[i] = [666, 666]
comp("Comp").layer("Shape Layer").content("Shape").content("Path").path.inTangents()[i] = [1, 0]
comp("Comp").layer("Shape Layer").content("Shape").content("Path").path.outTangents()[i] = [0,1]

Those "linear" nodes of yours are nodes with no tangent handles i.e. with In Tangent and Out Tangent both equal [0,0]. Changing those to something different than [0,0] will give you a Bezier curve.

Hope this helps you one way or another.


Re: How to Bezier Path with no keyframes ?
by Shai Benshoshan on Jan 7, 2019 at 4:55:13 pm

Thank you Oleg <:]

I'll try that ;
So ill need to know what is the next point is to figure out the direction and value of those tangents.
Since the path is created automatically

tnx
Shai


Re: How to Bezier Path with no keyframes ?
by Oleg Pirogov on Feb 2, 2019 at 3:30:30 pm

I've written a script which does the thing for every selected property of shape type (i.e. select the shape path and run the script):



//the script smooths (sets interpolation to Auto Bezier) selected shape properties

//smooths a shape path
function shapeSmoother(shape){
//create dummy composition and a text layer in it
var comp = app.project.items.addComp("Dummy", 100, 100, 1, 1, 1);
var pos = comp.layers.addText().transform.position;

//create key frames in null position for every shape vertex
var newKey;
for (var i=0; i newKey = pos.addKey(i);
pos.setValueAtKey(newKey, shape.value.vertices[i]);
}

//smooth text's motion path by setting spatial interpolation to Auto Bezier for every key frame
for (var i=1; i<=pos.numKeys; i++){
pos.setSpatialAutoBezierAtKey(i, true);
}

//create new shape add copy to it all text 's motion path properties
s = new Shape();

s.closed = shape.value.closed;

var vert = [];
var inTang = [];
var outTang = [];
for (var i=1; i<=pos.numKeys; i++){
vert.push([pos.keyValue(i)[0], pos.keyValue(i)[1]]);
inTang.push([pos.keyInSpatialTangent(i)[0], pos.keyInSpatialTangent(i)[1]]);
outTang.push([pos.keyOutSpatialTangent(i)[0], pos.keyOutSpatialTangent(i)[1]]);
}

s.vertices = vert;
s.inTangents = inTang;
s.outTangents = outTang;

//assign shape to the original shape property
shape.setValue(s);
//delete Dummy comp
comp.remove();
}

//recursive function to look for selected shape properties;
function selectedShapeSearch(thePropertyGroup){
for (var i=1; i<=thePropertyGroup.numProperties; i++){
currentProperty = thePropertyGroup.property(i);

//checking, if it's a property and not a property group
if (currentProperty.propertyType == PropertyType.PROPERTY){
//checking, if it's a shape property
if (currentProperty.propertyValueType == PropertyValueType.SHAPE){
//checking, if it is selected
if (currentProperty.selected){
shapeSmoother(currentProperty);
}
}
}
else{
selectedShapeSearch(currentProperty);
}
}
}

function main(){
var prj = app.project;

//searching in every comp...
for (i=1; i<=prj.numItems; i++){
if (prj.item(i).typeName == "Composition"){
currentComp = prj.item(i);

//...and in every layer
for (j=1; j<=currentComp.layers.length; j++){
selectedShapeSearch(currentComp.layer(j));
}
}
}

}

main();






© CreativeCOW.net