UUUM攻殻機動隊(エンジニアブログ)

UUUMのエンジニアによる技術ブログです

AviUtl スクリプトで動画作成は楽できる!

こんにちは、新人エンジニアのハトネコエです!

先週はNintendo Switch 体験会があったり、
週末はGlobal Game Jam 2017があったり、
1月はゲーム大好きな人たちをわくわくさせるイベントが目白押しでしたね!

冬に発売する『スーパーマリオ オデッセイ』が楽しみです。はやく!!


さて、今回の社内勉強会は AviUtl での動画作りについて触れました。(完全に私の趣味です)

AviUtl は Windows のフリー動画編集ソフトです。
無料です! なんと無料です! やばいです。
無料なのに、できることは1万円を超えるソフト並です。

初心者のうちは取っつきにくく、私も一度挫折したくらいに難易度の高いソフトなのですが、
一度慣れてしまうと、市販の動画編集ソフトに対して
「フレーム単位での編集がしづらい!」
「スクリプトが書けない!」
と不満を持ってしまうくらいです。

ほとんどの動画編集ソフトに外部スクリプト機能はありませんから、もう AviUtl から乗り換えられません。
では、スクリプトが書けるとなにが便利なのでしょう?

例えば、daniwellPの『Linear Slope』に合わせてボイスを入れる音MAD「○○かわいいシリーズ」の作成を考えてみます。
ニコニコ大百科『○○かわいいシリーズ』

この音MADシリーズの特徴は、曲のテンポに合わせてキャラが跳ねたり、
いっぱいの図形(パーティクル)をキャラの周りに飛ばしたりすることにあります。

ですが、これを中間点で管理すると、下図のように(これでようやく1小節ぶんです)
とんでもない数の中間点を拍に沿って打ち続けなければなりません。

f:id:nekonenene:20170124222550p:plain

スクリプトを書くことで、この問題は解消されます。

くり返す動きというのは、サイン波などの波で表現することが可能です。

f:id:nekonenene:20170124225034j:plain

サイン波の絶対値 |sinθ| の動きに合わせて、
オブジェクトの高さを上下させるスクリプトを書いてみましょう。

------------------------------------------------------------*
@テンポに合わせ上下する
------------------------------------------------------------*
--track0: BPM, 1, 1000, 120, 0.1
--track1: 高さ, -500, 500, 50, 0.1

local tempo = obj.track0
local height = obj.track1

local beat_time = 60 / tempo -- 1拍の時間
local radian_loop_time = beat_time * 2 -- 1ループ=2πの基準となる拍数をかける

local current_time = obj.time -- 現在のタイム。アニメーション開始時刻を0とする
local current_radian = (current_time % radian_loop_time) / radian_loop_time * (2 * math.pi) -- 現在のタイムが 0~2π で言うとどこにあたるか
local rate = math.abs(math.sin(current_radian)) -- 時間に応じた率(0~+1)

obj.oy = obj.oy - (rate * height)

「vertical_motion.anm」と名前を付け、
これを文字コード Shift-JIS で保存し、aviutl フォルダの script フォルダ以下のどこかに置きます。

実際に動かしてみましょう。

テンポに合わせて動いていることが確認できますね。

スクリプトなしでは曲の終わりまで中間点を打ち続けなければなりませんでしたが、
このように一度スクリプトを書いてしまえば、あとは「アニメーション効果」を適用させるだけで勝手に動いてくれます。
(任意の場所からアニメーション効果を付けるために、オブジェクトに直接よりも「グループ制御」にアニメーション効果を加えるのが扱いやすいです)

詳しくスクリプトの書き方をお知りになりたい方は、
AviUtl スクリプトWikiがよくまとまっていますのでお勧めです。

なお、AviUtl のスクリプトは Lua 言語を基に作られています。
AviUtl のように、コア部分のソフトウェアがビルドされているものをスクリプト制御する
組み込みの言語として Lua は人気があります。

コア部分を作るプログラマーと、メッセージ部分を作るスクリプターの作業分担がしやすくなるため、
ゲーム開発の場で使われることも多い言語です。
Global Game Jam に参加されるような方だと、一度は触れているかもしれませんね。


今回は、私のお世話になっている AviUtl について触れました。

64bit OS 向けのアップデートが予定されていないことや、
スクリプトファイルを Shift-JIS で保存しなければならないことなど、残念なところもありますが、
スクリプトで楽ができる動画作成ソフトを他に持っていないため、AviUtl にはお世話になりっぱなしです。

UUUM では、趣味に仕事に一生懸命なエンジニアを募集中です。

他部署ですが(と言っても隣のテーブルですが)映像編集ディレクターも募集しています。
さすがに AviUtl ではなく After Effects ですが、After Effects もスクリプトを使えるという噂。

一緒に働いてくださる方、お待ちしております。