您當前的位置:首頁 > 繪畫

175、AE指令碼-簡單聊聊預合成(三)

作者:由 古水生 發表于 繪畫時間:2022-04-16

古水生:174、AE指令碼-簡單聊聊預合成(二)

接著上次的分享繼續往下講。這個系列中的第一次分享,考慮的就是圖層預設屬性全部都沒有更改,最特殊的一類情況怎麼預合成。第二次分享,主要考慮了對於不同的圖層(文字圖層和AVLayer相同)預合成的寬和高的處理情況,並考慮了圖層縮放和旋轉以及預合成新增進當前合成中的位置恢復至原圖層。

這次分享先從描點開始講起。

175、AE指令碼-簡單聊聊預合成(三)

當有了遮罩以後,重置圖層描點至中心情況就變的複雜了起來。當然還有一種方式可以實現重置描點至圖層中心。

古水生:050、AE指令碼-呼叫選單命令callMenuCommand()

175、AE指令碼-簡單聊聊預合成(三)

這個命令存在一個問題,就是你必須得啟用合成以後才可以呼叫此命令重置合成中的圖層。視覺效果上來講,不是很美觀。我們簡單演示一下:

古水生:003、AE指令碼-獲取當前啟用合成getComp()

//獲取專案面板中選中的第一個元素

var

item

=

$

getItem

();

//合成視窗中開啟此元素

item

openInViewer

();

//獲取當前啟用合成

var

comp

=

$

getComp

();

//獲取啟用合成中索引為3的圖層

var

layer

=

comp

layer

3

//描點重置為圖層中心

$

callMenuCommand

layer

10312

//圖層位置重置為合成中心

$

callMenuCommand

layer

3819

175、AE指令碼-簡單聊聊預合成(三)

不知道你看到了沒有,如果你在另一個合成中新增預合成,它會在視覺上跳到你需要處理的當前合成中,視覺上會有閃跳的過程。所以我排除了這個方法。

那怎麼辦呢?還是回到文章最開始的時候,既然描點和遮罩有關,那麼我們不考慮遮罩不就完了麼?我先把所有的遮罩模式儲存起來然後再設為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

]);

}

}

175、AE指令碼-簡單聊聊預合成(三)

當然了,你還得考慮當前選擇圖層的開始時間不在合成最開始的情況:

175、AE指令碼-簡單聊聊預合成(三)

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指令碼

標簽: 圖層  layer  合成  遮罩  描點