【AviUtl】ディスプレイスメントマップについて


こんにちは、TP100 の ペット*1の猫の琥珀といいます。
つい最近名前を貰いました。わーい。

ケーシューのパッケージの紹介動画を作成したり、それ以外のことでも動画を作ることが何かとあるのではないでしょうか。

え、無い?

制作・著作
KSM

※この記事は、AviUtl で動画編集をしている人向けの内容です。

私は動画編集をするときは、AviUtl というフリーの編集ソフトを使っているのですが、フリーソフトとは思えない程に機能が多いんですよね。
数年くらい AviUtl で動画編集ソフトをしていても、「こんな機能あったんだ」と思うことがたまにあると思います (私だけ?)。

そんな AviUtl ですが、私が最近知った機能の中にディスプレイスメントマップというものがあります。
この機能を最初知った時は、「なんかややこしそうだし、別に使わなくてもなんとかなるかな」と思っていたのですが、色々と調べたり、試しているうちにディスプレイスメントマップを活用することによって様々な表現や演出が可能になるということに気付きました。
例えば、このようなことができます。

f:id:cyanhair_neko:20201217183403g:plainf:id:cyanhair_neko:20201217183540g:plainf:id:cyanhair_neko:20201217183615g:plainf:id:cyanhair_neko:20201217183654p:plain

このように、使い方によって様々な表現ができるので、ぜひとも使いこなしたい機能です。
ディスプレイスメントマップの説明の後に、先程あげた例はどのようにすればできるのかを解説しますので、お楽しみに。

そもそもディスプレイスメントマップとは

AviUtl におけるディスプレイスメントマップは、画像ファイルやシーンに用意したマッピング画像をもとに、画像を変形させる機能です。

例えばこのようなマッピング画像があるとします。

mapping-example
マッピング画像の例 画像との境界線には赤い破線を引いている

それはそれとして、偶然ここによさげな画像があります。

f:id:cyanhair_neko:20201218163038j:plain
jplenioによるPixabayからの画像
この画像にディスプレイスメントマップで先程のマッピング画像を適応させると、このようになります。*2
for_example
マッピング画像に応じて横方向にズレている

この例では横方向の移動ですが、もちろん縦方向の移動など、いろいろできます。

私が現状把握しているディスプレイスメントマップの仕様は以下の通りです。

  • 移動変形、拡大変形、回転変形の3つの変形方法がある
  • 基本的に、白に近いほど指定した方向に大きく変形し、黒に近いほど指定した反対方向に大きく移動する。
  • 理論上、白と黒の丁度中間の場合は移動しない*3
  • 移動変形の場合、赤色成分が横方向の移動、緑色成分が縦方向の移動を表す*4
  • 透明度があるもの同士が重なっている場合などは、見た目上の色がマッピング材料として適応される

拡大変形と回転変形に関するマップの色の関係についてはまだ検証していません。検証が完了し次第追記します。

移動変形の場合、赤色成分と緑色成分で別れていますが、基本的には白や黒や灰色でマッピング画像を生成するのがいいと思います。

上の例やこのまとめを見ただけではまだ理解し切れないと思いますが、実際に色々試していくのが理解しやすいと思います。

実際の使用例

ここでようやく実際の使用例に入っていきます。
実際説明不足のところもあるので、その点も説明できるといいですね。

例1 一部分だけ移動するやつ

こういうやつ

一部分だけ移動するやつ
一部分だけ移動するやつ

まず最初に別シーン*5でこのようなマップを作成します。

map_image
マップ用の画像

作り方は白と黒の六角形をいい感じに重ねて、フレームバッファにカラーキーを適応して輪郭をはっきりさせます。*6
その後に灰色の背景を加算でかぶせています。
パラメータの値とかはいい感じに合わせてください

そっから Root でも別のシーンでもいいので変形させる画像を置きます。
その画像にフィルタから「ディスプレイスメントマップ」を追加してください。

display-mm-parameter
ディスプレイスメントマップのパラメータとか

ここで補足的なものを
マッピング画像を用意するなら、ほとんどの場合は一番下の「元のサイズに合わせる」チェックボックスをオンにした方がいいでしょう。
「X」「Y」「回転」「サイズ」「縦横比」は「元のサイズに合わせる」チャックボックスをオンにしている場合は関係のないパラメータとなります。「元のサイズに合わせる」チェックボックスをオフにして、この子達で色々やってみるのも面白そうですね。
「ぼかし」はマッピング画像をぼかした状態にして適応します。デフォルトではなぜか 5 として設定されています。
個人的にはぼかしはあまりいらないので、0 に設定することが多いです。

AviUtl はシーンの画像 (or 映像) だけではなく、画像ファイルの内容や、円などのプリミティブ図形もマッピング画像として利用できます。
円の範囲内だけを動かしたいという場合などは、プリミティブ図形を選択したほうが圧倒的に楽だったりします。

あとは 「変形X」の値をいい感じに動かすと上の gif のようになります。イージングが少し適当なのは許して。

また、境界辺りの処理が少し微妙だと個人的には感じます。これにかんしては無料ソフトだしその部分は妥協するか、AE を使いましょうという話にはなりますが。*7

レンズ補正のようなもの

音ゲーの MV などで見たことある方も多いのではないでしょうか。

lens_correction
レンズ補正のようなもの

実はこれかなり簡単にできます。
まずはこのようなマップを作りましょう。デフォルトのグラデーションで簡単に作れます。*8

lens_correction_map
開始色は #808080 に設定しています

これを適応させたい画像または映像に適応させます。


して、移動変形のところを拡大変形に変更します。
トラックバーの部分に「拡大変形」という項目がでてくるので、それを正の方向に動かすとぐにゃーんと歪みます。*9

手描きタッチっぽいやつ

これです。

tegaki
これです

これは、この画像を変形させています。さっきも見ましたね。

sakkimita
さっきも見ましたね

これも実は簡単です。
マップ画像をノイズの type4 で作ります。*10

noise_map
ノイズで作ったマップ画像

そして変形したい画像にディスプレイスメントマップの移動変形を適応させます。
いい感じに変形すれば完成です。

また、上の gif のようにしたい場合は、正反対に変形したものも作って、コマ送りの要領で繰り返すと実現できます。

ぼかしを少し加えてもいい感じになりますね。

bokashi
化け猫さんもディスプレイスメントマップでぼかしを使うことってあるんだ

ぐにゃぐにゃにするやつ

これが

f:id:cyanhair_neko:20201217183659p:plain

こうじゃ

なんということでしょう
なんということでしょう

こちらもマッピングにノイズを使用しています

glitch_map
ノイズ type1 を使用

ノイズ自体のしきい値を少し上げて、色調補正で輝度をガン上げしています。
それをディスプレイスメントマップで適応させて移動変形させればオッケーです。

あとがき

今回は AviUtl の機能のひとつである「ディスプレイスメントマップ」について色々紹介しました。
この機能は工夫次第では様々なことができるので、色々試してみてはどうでしょうか。

動画編集においての新たな表現の発見を願っています。



以下 footnote

*1:自称

*2:パラメータは調整している

*3:{#000000, #ffffff} の中央値がそれにあたるが、整数の範囲で表すことは不可能なので、#808080 や #7f7f7f で代用、あるいは色々頑張ってなんとかする

*4:恐らく After Effects の仕様に合わせているものと考えられる

*5:AviUtl のシーンに関する説明は割愛します
一言で言うなら拡張編集タイムラインの Root って書いてあるやつをクリックすると色々出てくるやつ

*6:そうしないと境界部分での粗が目立ってしまう

*7:または自分でスクリプトを組むという手も

*8:グラデーションの説明も割愛

*9:負の方向に動かしてもおもしろいことになる

*10:ノイズの説明は以下略

K-Shoot maniaのレーザーオブジェクトについて(ケーシューエディタでの仕様とテキストエディタでの編集)


この獣人の証である獣耳があり、空色の髪をなびかせて、その美しさと八重歯の輝きに、太陽さえ思わず目を細めてしまうほどの無性別美少女*1は、誰でしょうか…

そう、私です!*2

…もとい、TapeStop100 というグループでペットの猫として存在しています*3、化け猫です。みゃん*4

9日目は TP100 のアドカレにしては珍しいケーシューの記事です*5

今回は K-Shoot mania のレーザーオブジェクトについてです。
ケーシューエディタのレーザーがそれぞれの詳細度*6の時に、レーザーオブジェクトをどこに配置することができるのか気になりませんか?
私は気になるので、それについて調べたものを記事にしようという算段です。*7

また、ケーシューエディタ以外を使ってレーザーオブジェクトを編集することがあるので、その時の編集の様子も共有しようと思います。

まずはkshフォーマットを理解しよう

本題に入る前に、まずは現行 (2020/12/09 現在) のケーシュー譜面のフォーマットである ksh フォーマットについて理解する必要があります。
今回はレーザーオブジェクトについて解説していくので、その他の部分は理解しなくても大丈夫です。

それでは、実際に ksh ファイルの中身を見てみましょう。
ケーシューの譜面が書かれている ksh ファイルをテキストエディタ*8で開いてみると、このようになっている事がわかると思います。

ksh 内容スクショ

自作の譜面をテキストエディタで開いたもの
フォントは MyricaM M を使用しています

このようなものを見たことがない人にとっては「なんのこっちゃ」となることかと思います。
ですが、各セクションごとに見ていけば、理解しやすいかと思います。頑張って。

BT・FX

本題とは別のことなので、こちらはまとめて説明します。
先程の画像で説明すると、左側の4レーンが BT を表していて、縦線を挟んでその右の2レーンが FX を表しています。

bt_fx

ksh ファイルの BT と FX の場所

他にも細かい仕様はありますが、本題ではないため割愛します。

レーザーオブジェクト

FX のさらに左側には、レーザーオブジェクトの情報が書かれています。
左側が青色、右側が赤色のレーザーです。

lazer

レーザーオブジェクトの場所

-(ハイフン)、:(コロン)

-:はレーザーが繋がっているかどうかを表しています。
-はレーザーが存在しないことを表し、:はレーザーが繋がっている状態を表しています。
また、これらの記号は省略されることはありません。*14

数字やアルファベット

数字やアルファベットは、レーザーの横座標を表しています*15
一番左端が0そこから9まで行ったあとはAへと続き、Zのあとはaとなり、左端はoとなっています。
順番に並べると、0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnoの51段階です。

以上の内容を分かりやすくするために、こちらの画像をご用意しました。

lazer_info
レーザー部分の見方

説明を参照しながら画像を見ると、分かりやすいかと思います。

また、レーザーオブジェクトが移動する方向などは、数字やアルファベットを見れば分かります。

補足として、ケーシューは長さが32分以下のレーザーは全て直角レーザーとして解釈されます。

補足情報

ケーシューエディタでは譜面は下から上に書いていきますが、テキストエディタで開いた時は上から下へと見ていきます。
プログラミングをしている方は分かると思いますが、データを上から下へと書いていくことで、データを読み込むプログラムが書きやすくなります。*16

それぞれの詳細度の時のレーザーオブジェクトの置かれ方

とりあえず必要な仕様の説明が終わりましたので、ここからようやく本題に入っていきます。

ケーシューのレーザーオブジェクトには、横幅が等倍のものと、二倍のものの二種類があります。
ここではそれぞれの詳細度でレーザーが置ける場所に「○」を入れた表を、両方の倍率で提示します。

・横幅が等倍のとき
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmno
標準
詳細
最も詳細

まず、標準は5つ飛ばしの11箇所に置くことができます。
また、最も詳細では飛ばさずに 0(左端)~o(右端) 全ての場所に置くことができます。
一方詳細の場合は少々特殊です。詳細は標準で置けるところの間にそれぞれ一つずつ置けるところを追加したものですが、ちょうど間に置くことはできません (例えば 0 と 5 のちょうど間になるような場所に置くことは不可能)*17
そこで、P(中央) より左側は少々左寄りに、右側は少々左側になるように設定されております。*18

・横幅が二倍のとき
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmno
標準
詳細
最も詳細

横幅が二倍の場合は、標準は等倍の時の詳細と全く同じに、二倍の詳細は最も詳細と全く同じになります。

テキストオブジェクトをレーザーオブジェクトで編集してみる

ここまでの内容で、ksh ファイルのフォーマットについてはなんとなーく理解できたかと思います (レーザーオブジェクトは特に)。
フォーマットを理解すると、やろうと思えばテキストエディタでも譜面を作成することが可能になります。
が、実際はテキストエディタひとつで譜面を作成するのは現実的ではありません。
BT や FX などは殆どが専用のエディタで事足りますし、レーザーオブジェクトも同じエディタで編集可能です。

ただ、そのエディタでレーザーを最も詳細で編集していると、ちゃんと狙った場所に置けているのか分からなくなってくるんですよね (気にしない場合はそれでもいいのですが)。
そこで、レーザーオブジェクトを狙った場所に置くためにテキストエディタで編集することがあります (筆者の場合)。

せっかく ksh フォーマットの一部を紹介したので、テキストエディタを利用したレーザーオブジェクトの編集の様子もお見せします。

どのようなレーザーを置くか

今回置くレーザーはこちらです。

todays_lazer
きょうのレーザー

緑色の線が P(真ん中) を表します。
また、黒色の4本の縦線は等間隔でならんでいるものとします。
イメージ的には4本のグリッドの上にレーザーの中継点を置いていくような感じです。
このようなレーザーはテキストエディタで編集したほうがやりやすいことがあります。

どのラインがどの位置かを決める

今回は横幅は二倍ほどではなく、1.5倍ほどの大きさで配置していこうと思います。
色々考えた結果、端を中心(P)から18離れたところ(7, h)にもって来ることにしました*19
そうすると、左から 7, J, V, h の所にグリッドがあることにしてレーザーを配置すればいいと言うことが分かります。

glid_decide
それぞれのグリッドの場所が決まった

テキストエディタで編集するための準備

テキストエディタで編集する前に、まずはケーシューエディタ上に雑にレーザーを配置します。
雑とは言っても、縦の位置、タイミングはしっかり合わせた方が後々楽になります。

rough_sketch
タイミングはしっかりと 横の位置は雑でいい

スクショでは忘れていますが、はみ出しレーザーで置いた方が後々楽です (今回の場合)*20
また、今回はしていませんが、実際の譜面制作の場合はレーザーを置いたところに注釈を書いた方が、テキストエディタで開いた時に検索機能で見つけやすいです。

テキストエディタで編集する

レーザーを置いたら一旦保存して、同じファイルをテキストエディタで開きましょう。

open_texteditor
テキストエディタで開いた図

もしこのスクショのようにレーザーをはみ出し指定をせずに置いてしまった場合は、laserrange_l=2xlaserrange_r=2xレーザーが出現する直前に入れましょう。
そして、対応する数字やアルファベットの部分を、7, J, V, h のいずれかに書き換えて行きます。
テキストエディタでどこを弄れば狙った部分を反映させられるのかわからない場合は、細かく注釈を付けてみるのもいいかもしれません。

そして完成へ

テキストエディタでの作業が一通り終わったら保存を忘れずに行い、再びケーシューエディタで譜面を開き確認します。
想定した通りになっていない部分があればテキストエディタで都度調整し、ケーシューエディタで確認するのを繰り返します。
想定通りの形になれば完成です。

lazer_complete
完成した図

今日書いたこと、ケーシューのレーザーオブジェクトについて

いかがでしたか? (TP100 アドカレクソブログレギュ遵守)
ksh ファイルのフォーマット、専用エディタでのレーザーオブジェクトの配置のされ方、テキストエディタを使ったレーザーオブジェクトの編集。
どれも知っていて直ぐに役に立つかどうかと言われると微妙な所ですが、知っていると思わぬ所で役に立つ時が来るかもしれません。*21

また、ksh ファイルのフォーマットについては、K-Shoot mania の開発者である masaka さんが github で公開しているので、気になる方はご覧になってみては如何でしょうか。 この記事で紹介したのはほんの一部でもありますし、過去のバージョンのことも載っていて面白いですよ!



以下 footnote

*1:無性別のかわいい方

*2:実はこのようなセリフが出てくる作品は見ていないです。ただ、気にはなっているのでアマプラであれば見たいなと思っています。

*3:???

*4:かわいい

*5:昨日までの8日間のうちケーシューの話題が出てきたのは2日だけです。うち1日は文字数がとても少ない。

*6:メニューバーのツールにある標準、詳細、最も詳細のやつ

*7:実は10ヶ月くらい温めていたネタ

*8:メモ帳でよい

*9:ケーシュー以外でも役に立つ情報かもしれない

*10:"//" で始まる行は、コメント行を表すので数えません

*11:4分の4拍子の場合

*12:1小節に4分音符が3つある拍子ということから、感覚的に1行が6分音符でないことは分かるかと思います。

*13:少ない行数なら感覚的に求めることも可能でしょう。しかし、1小節に48行もある場合などは、感覚的に求めるのが大変になってきます。

*14:仮に省略することを許してしまうと、レーザーが存在するのか否かが分からなくなってしまう。

*15:縦座標はどの行に文字があるかで表現される。

*16:私は下から上へと書かれているファイルを読み込むプログラムは書きたくないです。

*17:0 から o までが全て等間隔であると仮定した場合。開発の観点などから考えると全てが等間隔であると考えるのが自然である。

*18:これにより詳細で P を中心に線対称なレーザーを置くことができる。

*19:等倍の両端を100% 、二倍の両端を200%としたときの150%が端に来るようにしたい。二倍の時の100%は25なので、それに1.5をかけると37.5になる。その数字に近最も近く、4本のグリッドを等間隔に並べられるのは36。7 と h はそれぞれ P から18ずつ離れている (36÷2)。

*20:レーンから一切はみ出さない場合は、はみ出しレーザーで無くても良い。

*21:実際、私自身も ksh フォーマットでのレーザーオブジェクトの表され方を理解していたので、テキストエディタでレーザーオブジェクトを編集するという発想に至りました。

12月になりましたね(絶望)

12月に入りましたね。
一応、11月中に公開するのを目処に曲を作っていたんですよね。

進捗、どうですか?

一応11月中に発表できるように目指してはいたんですけど、途中からプログラミングに脱線しだして、かと思えば別の関係ない曲を作り出したりして...
割と11月の20日くらいには諦めモードに入っていましたね。ダメ。

まあ、クリスマスまでに出せたらいいかなあと今は思っています (果たして)。

...ダメそう。