【AE脚本】原创图层锚点批量对齐脚本 | AE动画辅助脚本

【AE脚本】原创图层锚点批量对齐脚本 | AE动画辅助脚本文章源自狐狸影视城-https://fox-studio.net/37366.html

不想看内容请直接滑到结尾,下载 jsx 附件。文章源自狐狸影视城-https://fox-studio.net/37366.html

介绍

这个脚本是“毛坯”,你需要做一些“装修”。我已经写在注释中了,会用 AE 一看就懂。文章源自狐狸影视城-https://fox-studio.net/37366.html

用法:选中图层,执行脚本文件。即可设置图层锚点的位置居中。(文件 → 脚本 → 运行脚本)文章源自狐狸影视城-https://fox-studio.net/37366.html

描述:另外脚本的代码我已经封装好了,调整就可以设置 9 个方向的锚点对齐了。文章源自狐狸影视城-https://fox-studio.net/37366.html

故事

本来呢,motion 3 插件有锚点对齐的功能。之前用的很好的。可是最近更新 AE 到 2022 版本后,发现 motion 3 的锚点对齐功能无法使用了。文章源自狐狸影视城-https://fox-studio.net/37366.html

不知有没有朋友,遇见和我一样的问题!文章源自狐狸影视城-https://fox-studio.net/37366.html

【AE脚本】原创图层锚点批量对齐脚本 | AE动画辅助脚本文章源自狐狸影视城-https://fox-studio.net/37366.html

不知道是授权问题,还是兼容问题。头几次我手动调整,可是这都好几次了,心中很恼火。而且每次打开 motion3 ,都要等老半天,才出现界面。愁的我呀~~~~文章源自狐狸影视城-https://fox-studio.net/37366.html

然后!!!!!!!!文章源自狐狸影视城-https://fox-studio.net/37366.html

我就自己写一个锚点对齐的脚本,后来发现很好用。哈哈,这不就分享出来了。文章源自狐狸影视城-https://fox-studio.net/37366.html

本来是自己用,代码没有很多注释。不过既然想发出来。那么就把注释内容写的详细一些。我相信对于也会一些表达式 JavaScript 语言的朋友来说,你们会很喜欢的。哈哈。~文章源自狐狸影视城-https://fox-studio.net/37366.html

代码

jsx 文件下载:文章源自狐狸影视城-https://fox-studio.net/37366.html

链接: https://pan.baidu.com/s/1M5tFVgHGzx3_-JM-t8Fw3A?pwd=5mtj文章源自狐狸影视城-https://fox-studio.net/37366.html

提取码: 5mtj文章源自狐狸影视城-https://fox-studio.net/37366.html

当然,你也可以复制一下代码,创建一个文本文件,粘贴内容,并保存后缀为 .jsx 格式就行。文章源自狐狸影视城-https://fox-studio.net/37366.html

/**
 * 功能:图层锚点对齐 - 脚本
 * 描述:批量设置所选图层的锚点对齐方式,可以选择一个图层,也可以选择多个图层
 * 作者:千年骚狐
 * 主页:https://fox-studio.net
 * 创建时间:2022-4-13 22:00
 * 该脚本允许任何人免费分享和修改,但请保留此处的信息。
 */


// 声明数组变量
var parameters = new Array();

/**
 * 设置对齐方式,共有 9 个值。分别是下方内容
 * 左上对齐:leftUp
 * 左中对齐:leftCenter
 * 左下对齐:leftDown
 * 中上对齐:centerUp
 * 中心对齐:center
 * 中下对齐:centerDown
 * 右上对齐:rightUp
 * 右中对齐:rightCenter
 * 右下对齐:rightDown
 */
parameters['position'] = 'center';

// 脚本名称,用于 ctrl + z 撤销(编辑 → 撤销 的名称)
parameters['scriptName'] = 'Achor Point Align';

// 执行脚本
anchorPoint(parameters);
/**
 * 选中图层的锚点对齐,可以是一个层或多个层
 * 逻辑:
 * @since		1.0
 * @version	1.0
 * @DateTime 2022-04-13
 * @param		{[type]}	 parameters [需要传入的参数]
 * @return	 {[type]}							[description]
 */
function anchorPoint(parameters) {
	// 定义当前项目
	var proj = app.project;

	// 当前项目必须存在
	if (!proj) {
		alert("请打开一个项目使用该脚本!");
	}

	// 获取激活的合成
	var myComp = app.project.activeItem;

	// 激活合成必须存在
	if (myComp != null && (myComp instanceof CompItem)) {

		// 撤销起点。ctrl + z 的点
		app.beginUndoGroup(parameters['scriptName']);

		// 当前选中的图层
		var myLayers = myComp.selectedLayers;

		// 未检测到选中的图层
		if (!myLayers[0]) {
			alert('请选择需要对齐锚点的图层!');
			return false;
		}

		/**
		 * 遍历选中的所有图层,为每一个图层执行 for 中的命令
		 */
		for(z=0; z<myLayers.length; z++){

			/**
			 * 获取当前选中图层的变换属性下的 边界框、位置、锚点、缩放属性
			 */

			// 获取当前选中图层的边界信息
			var thisLayerInfo = myLayers[z].sourceRectAtTime(myComp.time, true);

			// 获取当前选中图层的【位置】属性
			var thisLayerPosition = myLayers[z].transform.position;

			// 获取当前选中图层的【锚点】属性
			var thisLayerAchorPoint = myLayers[z].transform.anchorPoint;

			// 获取当前选中图层的【缩放】属性
			var thisLayerScale = myLayers[z].transform.scale;

			// 当前选中图层的【缩放】属性的值
			var thisLayerScaleSave = thisLayerScale.value;

			/**
			 * 如果所选择的图层缩放属性不为默认值:[100,100]
			 * 则需要创建一个空对象,用于
			 */
			if(thisLayerScale.value[0] != 100 || thisLayerScale.value[1] != 100 ){

				// 获取当前选中图层的父级层对象。存为变量,最后再返回。因为过程中需要解除父子级关系。
				var oldParentObj = myLayers[z].parent;

				// 创建一个 空对象
				var tempNull = myComp.layers.addNull();

				// 设置 空对象 不可见
				tempNull.enabled = false;

				// 设置 空对象 名称
				tempNull.name = '锚点对齐临时文件 - ' + index;

				// 设置 空对象位置 = 所选择图层的位置
				tempNull.transform.position.setValue(thisLayerPosition.value);

				// 设置 空对象 中心点 = 选择图层的值
				tempNull.transform.anchorPoint.setValue([0,0]);

				// 设置 空对象 缩放 = 选择图层的值
				tempNull.transform.scale.setValue([100,100]);

				// 将所选图层的父级绑定到新创建的空对象上
				myLayers[z].setParentWithJump(tempNull);

				// 设置当前所选图层的位置属性值为[0,0]。因为绑定了父级,所以和父级位置是相同的
				thisLayerPosition.setValue([0,0]);

				// 设置当前图层的缩放属性值为[100,100]
				myLayers[z].transform.scale.setValue([100,100]);
			}

			/**
			 * 根据变量中描述的对齐方式,将边界框的信息,计算出偏移量,并赋予变量 setAnchorPoint 中。
			 * 偏移量之后会用于计算中心点的位置。
			 */
			if (parameters['position'] == "leftUp") {
				// 边界框的 左上 位置
				var setAnchorPoint = [thisLayerInfo.left, thisLayerInfo.top];
			} else if (parameters['position'] == 'leftCenter') {
				// 边界框的 左中 位置
				var setAnchorPoint = [thisLayerInfo.left, thisLayerInfo.height/2 + thisLayerInfo.top];
			} else if (parameters['position'] == 'leftDown') {
				// 边界框的 左下 位置
				var setAnchorPoint = [thisLayerInfo.left, thisLayerInfo.height + thisLayerInfo.top];
			} else if (parameters['position'] == 'centerUp') {
				// 边界框的 中上 位置
				var setAnchorPoint = [thisLayerInfo.left + thisLayerInfo.width/2, thisLayerInfo.top];
			} else if (parameters['position'] == 'center') {
				// 边界框的 中心 位置
				var setAnchorPoint = [thisLayerInfo.left + thisLayerInfo.width/2, thisLayerInfo.height/2 + thisLayerInfo.top];
			} else if (parameters['position'] == 'centerDown') {
				// 边界框的 中下 位置
				var setAnchorPoint = [thisLayerInfo.left + thisLayerInfo.width/2, thisLayerInfo.height + thisLayerInfo.top];
			} else if (parameters['position'] == 'rightUp') {
				// 边界框的 右上 位置
				var setAnchorPoint = [thisLayerInfo.left + thisLayerInfo.width, thisLayerInfo.top];
			} else if (parameters['position'] == 'rightCenter') {
				// 边界框的 右中 位置
				var setAnchorPoint = [thisLayerInfo.left + thisLayerInfo.width, thisLayerInfo.height/2 + thisLayerInfo.top];
			} else if (parameters['position'] == 'rightDown') {
				// 边界框的 右下 位置
				var setAnchorPoint = [thisLayerInfo.left + thisLayerInfo.width, thisLayerInfo.height + thisLayerInfo.top];
			}
			
			// 计算:绝对位置 = 所选图层的位置属性 - 所选图层的锚点位置 + 偏移量相对值
			var setPosition = thisLayerPosition.value - thisLayerAchorPoint.value + setAnchorPoint;

			/**
			 * 判断当前所选图层的【位置】属性,是否有关键帧。
			 * 如果没有关键帧,则设置当前所选图层的位置,为计算后的绝对位置
			 */
			if (thisLayerPosition.numKeys == 0) 
					thisLayerPosition.setValue(setPosition);

			/**
			 * 判断当前所选图层的【锚点】属性,是否有关键帧
			 * 如果有关键帧,则在当前时间线位置,设置锚点位置,为计算后的绝对位置
			 * 如果没有关键帧,则直接设置锚点值为,计算后的绝对位置
			 */
			if (thisLayerAchorPoint.numKeys > 0) thisLayerAchorPoint.setValueAtTime(myComp.time, setAnchorPoint);
			else thisLayerAchorPoint.setValue(setAnchorPoint);
			
			/**
			 * 如果创建的空对象存在。
			 * 设置空对象的缩放属性,为最早期所选图层的缩放值。
			 * 设置后,删除空对象。
			 */
			if( tempNull ){
				tempNull.transform.scale.setValue(thisLayerScaleSave);
				tempNull.remove();

				// 如果所选图层早期有父级对象,则创建父子级关系为原先的样子。
				if( oldParentObj ) myLayers[z].setParentWithJump(oldParentObj);
			}
		};

		/**
		 * 保持最初的选择状态。
		 */
		for(z1=0; z1<myLayers.length; z1++ ){
			myLayers[z1].selected = true;
		};

		// 撤销终点
		app.endUndoGroup();
	} else {
		alert("请选择并激活一个合成来使用脚本!");
	}
}

亲,滑过了。脚本下载地址,在代码的上面。文章源自狐狸影视城-https://fox-studio.net/37366.html

weinxin
千年骚狐
  • 本文由 发表于 2022年4月13日
  • 除非特殊声明,本站文章均为原创,转载请务必保留本文链接
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定