175、AE指令碼-簡單聊聊預合成(三)
古水生:174、AE指令碼-簡單聊聊預合成(二)
接著上次的分享繼續往下講。這個系列中的第一次分享,考慮的就是圖層預設屬性全部都沒有更改,最特殊的一類情況怎麼預合成。第二次分享,主要考慮了對於不同的圖層(文字圖層和AVLayer相同)預合成的寬和高的處理情況,並考慮了圖層縮放和旋轉以及預合成新增進當前合成中的位置恢復至原圖層。
這次分享先從描點開始講起。
當有了遮罩以後,重置圖層描點至中心情況就變的複雜了起來。當然還有一種方式可以實現重置描點至圖層中心。
古水生:050、AE指令碼-呼叫選單命令callMenuCommand()
這個命令存在一個問題,就是你必須得啟用合成以後才可以呼叫此命令重置合成中的圖層。視覺效果上來講,不是很美觀。我們簡單演示一下:
古水生:003、AE指令碼-獲取當前啟用合成getComp()
//獲取專案面板中選中的第一個元素
var
item
=
$
。
getItem
();
//合成視窗中開啟此元素
item
。
openInViewer
();
//獲取當前啟用合成
var
comp
=
$
。
getComp
();
//獲取啟用合成中索引為3的圖層
var
layer
=
comp
。
layer
(
3
)
//描點重置為圖層中心
$
。
callMenuCommand
(
layer
,
10312
)
//圖層位置重置為合成中心
$
。
callMenuCommand
(
layer
,
3819
)
不知道你看到了沒有,如果你在另一個合成中新增預合成,它會在視覺上跳到你需要處理的當前合成中,視覺上會有閃跳的過程。所以我排除了這個方法。
那怎麼辦呢?還是回到文章最開始的時候,既然描點和遮罩有關,那麼我們不考慮遮罩不就完了麼?我先把所有的遮罩模式儲存起來然後再設為none,待重置了圖層描點中心,再把它切換回來就好了麼。
/**
* @description 獲取並儲存遮罩和遮罩模式並更改遮罩模式為none
* @param {Object} layer 目標圖層
*/
function
saveMaskModeAndSetNone
(
layer
)
{
var
maskMode
=
[];
if
(
!
(
layer
instanceof
LightLayer
||
layer
instanceof
CameraLayer
))
{
var
i
=
1
,
num
=
layer
。
property
(
“ADBE Mask Parade”
)。
numProperties
;
while
(
i
<=
num
)
{
var
mask
=
layer
。
property
(
“ADBE Mask Parade”
)。
property
(
i
);
maskMode
。
push
([
mask
,
mask
。
maskMode
]);
mask
。
maskMode
=
MaskMode
。
NONE
;
++
i
;
}
}
return
maskMode
}
/**
* @description 復原圖層遮罩模式
* @param {Array} 圖層遮罩和遮罩模式的複雜陣列[[layer。property(“ADBE Mask Parade”)。property(1),6814]]
*/
function
restoreMaskMode
(
maskMode
)
{
for
(
var
k
=
0
;
k
<
maskMode
。
length
;
++
k
)
{
maskMode
[
k
][
0
]。
maskMode
=
maskMode
[
k
][
1
]
}
}
當前選擇圖層這樣操作後,圖層描點就置於圖層正中了,無論描點屬性它有沒有關鍵幀。
然後將此圖層移動至預合成中,只需要重置它的位置至預合成中心就好了。
古水生:001、AE指令碼-全域性函式isValid()和has()函式
/**
* @description 移動單個圖層至合成中心
* @param {Object} layer 目標圖層
*/
function
moveLayer
(
layer
)
{
var
layer
=
has
(
layer
)
?
layer
:
getLayer
();
var
comp
=
layer
。
containingComp
;
var
time
=
comp
。
time
;
var
pos
=
getTrans
(
layer
)。
pos
;
var
numKeys
=
pos
。
numKeys
;
if
(
numKeys
<
1
)
{
pos
。
setValue
([
comp
。
width
/
2
,
comp
。
height
/
2
]);
}
else
{
pos
。
setValueAtTime
(
time
,
[
comp
。
width
/
2
,
comp
。
height
/
2
]);
}
}
當然了,你還得考慮當前選擇圖層的開始時間不在合成最開始的情況:
preLayer
。
label
=
selLayer
。
label
;
preLayer
。
startTime
=
selLayer
。
inPoint
;
selLayer
。
copyToComp
(
comp
);
var
inLayer
=
comp
。
layer
(
1
);
alignComp
(
inLayer
);
預合成圖層的標籤顏色和原選擇圖層一致,預合成圖層的開始時間對齊至原選擇圖層的入點時間。當把當前選擇圖層放入預合成中後,對齊此圖層至預合成開始。
/**
* @description 對齊圖層至合成開始
* @param {Object} layer 目標圖層
*/
function
alignComp
(
layer
)
{
layer
。
startTime
=
layer
。
startTime
-
layer
。
inPoint
;
}
就這樣,說的已經非常詳細了,考慮了幾乎所有情況,但此預合成只針對當前時間線所處時間的情況,沒有考慮整個工作區有動畫的這種情況。如果你有這個需求,請自行完善。感謝您的耐心閱讀,我們下次分享再見。
古水生:042、AE指令碼-開始你的第一個AE指令碼AE指令碼