🎬

AviUtlのシーンチェンジ機能を使わずに他の方法で再現する

2022/12/06に公開

この記事はAviUtl Advent Calendar 2022に参加しました
6日目みたいです

5日目:AviUtlでポスターや冊子を作ろう
7日目:AviUtl臭さを課金で解決する

シーンチェンジとは

タイムラインに置くだけで20種類以上の画面切り替え効果を掛ける事ができるものです
拡張編集のタイムラインを右クリック→「フィルタオブジェクトの追加」→「シーンチェンジ」で追加できます
別の動画編集ソフトではトランジションとも言うらしいです
AviUtlでは白黒画像でワイプするやつを保存しておくフォルダがtransitionという名前ですね

シーンチェンジの利点

手軽に画面全体に掛けられる

シーンチェンジ機能を使わずに複数のオブジェクトが乗った状態でのシーンチェンジを再現したい場合は、シーン機能中間出力一時保存系のスクリプト類などを利用する必要があります(ものによってはフレームバッファだけで済む場合もある)
それらを必要とせず、タイムラインの一画面内のみでも完結させられるのは簡単ではありますね

レイヤー数を(場合によっては多少)節約できる

例えば動画単体のみなら

このように設置するだけでも動きます

切り替わりのタイミングを自動で計算してくれる

やりたい演出によっては必要になる真ん中のフレームの位置を正確に特定・指定するのは地味に面倒
(大した手間ではないし、エフェクトの掛け方やスクリプトの書き方次第でどうにかできるものではあります)

シーンチェンジのデメリット

バグや例外の原因になりがち

キャッシュ数を適切に設定し、本体1.10/拡張編集0.92/patch.aulを使用しているなら起きにくいかもしれません
これに関しては、そもそもフィルタオブジェクト自体が不安定なので拡張編集ではあまり使うべきではないと思っています
シーンチェンジを使おうとすると、例外になる

パラメータの移動が固定で、変化度を自分で調節したりイージング等を掛けたりできない

時間制御を使っても正しく動かないらしいです
シーンチェンジに時間制御でイージングを掛けるとガクガクになる
移動値において元々存在しないフレームの補完がシーンチェンジオブジェクトに働いていないのかも?

ちなみに、拡張編集には↓こういうバグもあります
拡張編集以外のフィルタのトラックバーにトラックバー変化方法スクリプトを適用していると例外になる(patch.aulで修正されてはいます)

出力がタイムライン上の見た目と合わない

利点に書いた「レイヤー数を節約できる」の副作用みたいなもの(というより視点を変えてデメリットとしただけ)です
直前のフレームが終端かつシーンチェンジオブジェクトよりも上のレイヤーにあるオブジェクトが勝手に引き延ばされたような挙動をします

上の 円(図形) で自分自身のフレーム位置(obj.frame)を取得して、下の 円(図形) でそれを表示するようにしています
上の円オブジェクトの終端を超えても(シーンチェンジが続く限り)フレーム数が増え続けているのがわかると思います
動画オブジェクトの場合は、終端に達していても続きが再生されるようになっています(動画自体の最終フレームへ到達した後は静止画)
トラックバーの移動等は適用されないみたい?(座標の移動量指定、ランダム移動で確認)

効果を重ねる事ができない

シーンチェンジを複数重ねた場合、切り替わる前(前半)の画面は一番下のシーンチェンジしか適用されないようです

デフォルトで用意されたものは正直しょぼい

AviUtl臭さやパワポ感があるかもしれません
多くが単純なエフェクトを直線移動させているようなものなので・・・

有志によって作られた.scnなら別かもしれませんが、

  • .scn自体がほとんど配布されていない
  • 他のデメリットは変わらない

という訳で、需要があまりないもしくは汎用性の高い.anmとして配布した方がよいと判断されている気がします

実際に再現してみる例

ここに書いてある内容は一例です
他のより良い方法があるかもしれません
自分でスクリプト書くまでやってたり、よそに丸々投げてたりと内容の深さはバラバラです
1から全ての手順を載せているわけではないので、「で、どうやるの?」みたいな内容になっているかもしれません
初心者に対してシーンチェンジは使わない方が良いかもと言っている趣旨の記事な割に内容が初心者向けになっていない矛盾

その前にちょっと

  • なんとなくobj.draw()で直接フレームバッファに書き込むのはなるべく避けています
    obj.effect()をむやみに使わないなども参照?

  • 変化させたいのが動画単体なら中間点を置いて値を移動させることもできますが、こういう場合はフィルタ効果をオブジェクトとして置くのも有効です(右クリック>メディアオブジェクトの追加>フィルタ効果の追加)
    個人的にフィルタ効果オブジェクトは管理が楽なのでよく使います(レイヤーを大量に使う編集をした事があんまりないのもある)
    オブジェクトに直接追加するのと同様で、直前のオブジェクト1つにしかかからないのには注意

    こんなの
    設定ダイアログ上でフィルタをドラッグで移動させたり設定ダイアログ内でコピペできるようになるプラグインが出てきたので、直接くっつけるのも前よりは便利になったかも

  • 複数のオブジェクトが乗った画面全体をシーンチェンジさせたい場合はシーン中間出力を利用し、それにフィルタ効果等を掛けましょう
    シーンチェンジの内容によってはフレームバッファだけで済むかも

  • 対象のオブジェクトが変わったり、レイヤー順序が違ったり、変える必要があったりします

  • この記事はあくまでシーンチェンジフィルタを再現or代替方法の提示をするのが目的なので、ちゃんとかっこよく見せたい場合は他のサイトを参考にした方がいいと思います
    ↓こことか
    https://seguimiii.com/aviutl-tech/5shapetransitions
    https://seguimiii.com/tag/シーンチェンジ

0.ワイプ(transitionフォルダに画像を入れるやつ)

フィルタ効果のワイプでも読み込めますが、デメリットに書いた変化度補間の問題は解決しないようです
transition画像自体をタイムラインに直接放り込んで画面サイズと合うように拡大、ルミナンスキーを追加して基準輝度を0と4096の間で移動させ、それを上のオブジェクトでクリッピングなどの対象にするといいかもしれません?

1.クロスフェード

素材を重ねて透明度を100と0で移動させる

2.ワイプ(円)、3.ワイプ(四角)

フィルタ効果にもワイプがあります
イン/アウトどちらかを0にすればいいと思います

または、マスクを追加してサイズの値を移動させましょう
円の場合、位置が画像の中心なら最終的に必要なサイズは対角線の長さ(√(縦^2*横^2))ですね
見ながらだいたいで調節すれば充分ですね

ワイプ(円)だけ挙動が直線移動じゃないのなんで?

4.ワイプ(時計)

フィルタ効果にもワイプがあります

扇クリッピングを使えばさらに高度なこともできます

5.スライス

MultiSlicer_Pを使えばもっとかっこよくできますよ
DelayMoveでは時間差をつけたりもできるらしいです

さつきさんのANM1分割登場-スライスを使ったり、TA-標準登場または93さんのTA-Track(TA-Normal)をオブジェクト分割と併用することで再現できます

実際の例?


分割登場

標準登場

TA-Normal

たぶん全部同じ動きになると思います
これらをシーンチェンジ前の動画に掛け、後の動画より下のレイヤーに置く必要があります
設定ダイアログのX座標(距離)にあたる部分には

obj.w*(obj.index%2*2-1)

を入れています(オブジェクトの横幅を目標値として、分割した番号ごとに正負を交互にしている)

(変化時間を秒指定で設定するタイプのスクリプトって使いにくくないですか?
オブジェクトに中間点なしでポンとかけるだけでいいのは楽か)

よそのスクリプトに頼らずに再現しようとしてみたもの

オブジェクト分割の下にスクリプト制御をかけ、以下をコピペ

obj.ox=obj.w*obj.frame/obj.totalframe*(obj.index%2*2-1)

変化度の移動方法を変えたいなら、obj.frame/obj.totalframeのところを0~1として汎用トラックバーで制御すれば実現できると思います

6.スワップ

こう?

・カメラ制御はかけるだけ
・動画は拡張描画にしてX座標を画像幅/4(下)とその負の値(上)に
・円形配置は半径を画像幅/4に、回転を90から-270(上)と270から-90(下)へ移動させる(設定ダイアログは数を1に、回転無しにチェックを入れる)
・重なると混ざるので前後1フレームずつずらす 透明度を1フレームだけ100にした方がいいのでは

またはグループ制御にスクリプト制御を追加して↓をコピペ、拡張描画+カメラ制御の対象にする

local a=(obj.frame/obj.totalframe*2+0.5)*math.pi
if _layer==nil or obj.layer<_layer then --同じフレームで下のレイヤーかどうかの判定
 _num=1
end
_layer=obj.layer
obj.ox=-(math.sin(a)-1)/4*obj.w*_num
obj.oz=math.cos(a)/4*obj.w*_num
if obj.frame==math.abs(obj.totalframe*((_num-1)/2)) then obj.alpha=0 end
_num=-1

obj.oxの正負を変えると左右の動きが、
obj.ozの正負を変えると前後の動きが、
(_num-1)を(_num+1)にすると重ならないように透明度の切り替えをしている箇所(最初のフレームか最後のフレームか)が入れ替わります
あとは素材のレイヤー順序を入れ替えてみたりで調節?

7.スライド

座標(X,Y)を画像の幅や高さと同じだけ移動させましょう

8.縮小回転

始点と終端で回転0を360、拡大率100を0の間で移動させる
+真ん中から終端までで透明度を0と100の間で移動させる

9.押し出し(横)、10.押し出し(縦)

7.スライドに加えて、変化後の動画を逆方向に移動させましょう
中間点を使う場合は終端と中間点の位置に注意

上が正しい、下だと移動がぴったり合わない

11.回転(横)、12.回転(縦)

押し出しの回転バージョンです
真ん中のフレームを境に90°ずつ回転させるよりも、両方を同じ時間で180°回転させつつ90°を跨ぐ(画像が反転する)タイミングで透明度等を利用して表示の切り替えを行う方が正確に回転させやすいかもしれません?

13.キューブ回転(横)、14.キューブ回転(縦)

拡張描画とカメラ制御が必要です
Zと中心Zを画像の高さor幅/2に設定し、90°ずつX軸orY軸回転させましょう

初期値とは別にグループ制御に基本効果→回転を追加すればパラメータの移動を一括でさせられるかも(グループ制御自体が持つ回転は中心が固定なのでキューブ回転には使えない)

15.フェードアウトイン

単色化(輝度を保持するのチェックは外す)を掛けて強さを移動させる、
または 後ろに任意の色の背景を置いて透明度を移動させる など
このような2つの動画が同時に映らないタイプのものなら、フレームバッファを利用することで簡単に画面全体に掛けられます

16.放射ブラー、17.ぼかし

同名のフィルタ効果を掛けます
範囲を0から最大値へ移動させ、最大になった時点で動画を差し替えて再び0へ移動させるだけです
ぼかしは直前に領域拡張(塗りつぶしあり)を挿入するとよさそう

こういう複数の横並びのオブジェクトにフィルタを掛けたい時にもフィルタ効果オブジェクトは便利ですね
オブジェクトに中間点が1つしかない場合、右クリック→「中間点を時間で均等配置」を使えば自動で真ん中に置いてくれます
↓効果のかかり方の対称性を考慮するとこの方がいいかも?

18.ワイプ(横)、19.ワイプ(縦)

フィルタ効果にもワイプがあります
クリッピングでいずれかの値を移動させた方が色々できるかもしれません
斜めクリッピングを利用すれば角度を付けたり境目を回転させたり、真ん中から裂くように変化させたりもできますね

20.ロール(横)、21.ロール(縦)

ロール巻取(ページめくり)スクリプトを使います

22.ランダムライン

カスタムオブジェクトを作ったのでこれでマスクや上のオブジェクトでクリッピングします
(hが奇数だとぼけるので1だけ余分に足したりY座標を0.5足したりしてください)


ここから下はexedit.scnに入っているもの(スクリプト)です
中身を読めば何をやっているかわかるかもしれません
luaで書かれているので、ほとんどは.anmなどに移植してしまえると思います

23.発光

放射ブラー、ぼかしと同じく同名のフィルタ効果を掛けます
しきい値を0~100で移動させましょう

24.レンズブラー

同上
範囲を0~好きな値で移動させましょう

25.ドア

カメラ制御の範囲内に置いたオブジェクトにオブジェクト分割:横分割数2を掛け、その下にスクリプト制御で以下をコピペ

local a=obj.index*2-1
obj.cx=obj.w*a/2
obj.ox=obj.w*a
obj.ry=(1-obj.frame/obj.totalframe)*(90+20)*a

最後のobj.ryを負数にすると手前/奥開きを変えられます
1-を消すと開閉を変えられます
+20はカメラ制御の画角の関係で開ききらないのの対応です。(計算が面倒)適当に調整してください
開閉と掛けるオブジェクト、オブジェクトのレイヤー順に注意

オブジェクトを2つに増やしてクリッピングで半分ずつに分け、座標や中心座標を調整したうえで個別に回転させればスクリプト制御は不要ですが、多分手間は増えます
.scnでは三角関数とobj.drawpoly(4点を指定して任意の位置に画像を描画するやつ)を使っていますね

26.起き上がる

アニメーション効果に同じことをするもの(起き上がって登場)があります
ただし、シーンチェンジの起き上がるとは違って時間を手動で調節する必要があるようです

中心座標等を変えて回転させるだけでもある程度再現できると思います

27.リール回転

アニメーション効果にほぼ同じことをする同名のものがあります
メディアオブジェクトとして置くなどして、途中で素材だけを差し替えるイメージです

一応ですが、切り替え途中の表示に差異があります

シーンチェンジ版は切り替わりのタイミングで同時に2つの画面が並ぶようになっている
速度や方向ブラーが大きめ・強めに掛かっていればほとんどわからないと思います

だいたい30fps 左:シーンチェンジ 右:アニメーション効果

デフォルトのリール回転ではなくリール回転改を使ったり、方向ブラーとモーションタイルTを組み合わせる等すれば自由度が上がります
参考リンク:https://scrapbox.io/leje-campus/モーションタイルTでリール回転

28.図形ワイプ

  • グリッドワイプ(四角形のみ?)
  • 簡易水玉で傾斜をつけて基準を移動させたもの+上のオブジェクトでクリッピング(図形を選べるが少し重い)
  • グラデーション系のなにか+ハーフトーン+上のオブジェクトでクリッピング(工夫が必要)
    • 背景(図形)にグラデーションを追加して中心X/Yを移動させてもいいかも(デフォルトのグラデーションは変化が均等ではないのでもしかすると思った挙動にならないかも)

など

29.図形で隠す、30.図形で隠す(放射)

図形自体には凸エッジが掛けられています

obj.effect("凸エッジ","幅",v*edge_w/400,"角度",edge_r,"高さ",edge_h)

完全再現はめんどくさそう
.scnの中身からobj.getvalue("scenechange")obj.frame/obj.totalframeなどに書き換えたり、obj.loadより前にtimeの条件でobj.draw()している箇所を消したりしたものを.anmや.objに移植すれば多分できます(元も子もない)

似た感じのものを再現したいなら、図形を適当に作った上でパーティクル出力等で数を増やします
画面全体が完全に隠れる瞬間ができないなら手動で(同様の動きをさせた別オブジェクト等で)作り、そこで画面を切り替えるのがよさそうです

31.砕け散る

アニメーション効果に同じことをするものがあります
これも起き上がると同様に時間を手動で調節する必要があるようです

砕け散るT砕け散る(一刀両断アレンジ)などもあります

32.ページめくり

ドアとだいたい同じ

obj.cx=-obj.w/2
obj.ry=(1-obj.frame/obj.totalframe)*90
obj.cx=obj.w/2
obj.ry=-obj.frame/obj.totalframe*90

こんな感じのスクリプト制御をクリッピングやオブジェクトコピペ等と併用してがんばる
オブジェクトの配置がめんどくさいかも
影の再現は色調補正で輝度と彩度を変化させているようです

参考になりそうな記事:【AviUtl】ぱらぱらと本のページを捲る方法【拡張編集】


以上です。
内容(AviUtl)がこのサイト(Zenn)に合ってないような気がする

Discussion