アニメ編(その七)

ページ名:tutorial_anime_7
戻る:アニメ編(その六)


基本テクニック:フェード part1


今回から三回に分けて、場面転換のテクニックであるフェードと、フェードを応用した演出手法を取り上げます。
まず今回は part1 としてフェードの原理と実装について説明します。



フェードとは何か


映像作品でフェード fadeというのはトランジション(場面転換)の手法のことで、以下の二つを意味しています。


フェードイン
fade-in 一色の状態から、徐々に映像に移行すること
フェードアウト
fade-out 映像から、徐々に一色の状態に移行すること

「一色の状態」は伝統的に黒を用いることが普通です。他の色を用いていけない理由もありませんが、通常のフェードとは異なるニュアンスを持たせて使うことになるでしょう。
たとえば白へのフェードアウトは「意識の消失」のニュアンスが出てしまいますし、赤や青など原色へのフェードアウトはタイトルバックやアイキャッチなどの用途に使うことが多く、シーンの演出に用いることは稀かもしれません。


フェードはいつ使うか


ごく常識的な使い方では、フェードはシーン(場面)やシークエンス(一連のシーン)の転換など、物語の流れがある程度変わる場面で用います。カットをつなぐ程度の細かい場所で使うことはしません。
なぜかというと、映像の間に挟まる一色の状態は時間経過を暗示するものだからです。つまり、前後のシーンが時間的に連続していない、ということを表現するためにわざわざフェードを用いるのですから、会話シーンの切り返し(登場人物を交互に映すカットの継ぎ目)程度の継ぎ目にフェードを使ったりするのはおかしいわけです。


カードワースでいえば・・・たとえば『ゴブリンの洞窟』だと、冒険者の宿のシーンと、次の洞窟の入口のシーン、この間のトランジションに使うくらいの感じですね。
洞窟内でエリア間の移動に使うのは、映像編集の常識からいえばやりすぎです。


もちろん、他の用途がないわけでもありません。特に白へのフェードアウト/フェードインは「目の前が真っ白になった」ことを表現できるので、たとえば暗闇から急に明るいところへ出たとか、フラッシュが炊かれたとか、何かが爆発して閃光が走ったとか、貧血で意識を失ったとか、白昼に幻想を見たとか・・・その種のシーンを効果的に演出することができます。
この場合はシーンを区切るトランジションというより、フェードアウト/フェードインを組み合わせて、ある種のカットインエフェクトとして用いることになるでしょう。


フェードの原理


エフェクトブースターでフェードを実現するには paintmode パラメータと alpha パラメータを用います。
これらのパラメータについては基礎編(その八)で説明しましたが、paintmode=3 を指定したセクションは alpha パラメータによって不透明度を指定することが出来ます。そして alpha の値は 0 ~ 255 の範囲を取り、0 であれば完全に透けて下の画像が見えてしまう状態、255 であれば透けずに普通の状態で表示されます。


つまり、既に表示されている画像 A の上に、徐々に alpha を増加させつつ別の画像 B の一時描画を行うことで、A から B に徐々に移行するようにすればフェードは実現できます。
先ほど説明したとおり、黒→画像がフェードイン、画像→黒がフェードアウトですから


フェードイン
黒一色の上に、画像を一時描画する
フェードアウト
画像の上に、黒一色を一時描画する

ようにするわけです。


フェードアウトの実装


まずはフェードアウトの例からお目にかけるとしましょう。
この JPY ファイルでは、おなじみ冒険者の宿から黒一色の画面にフェードアウトします。


  1: [init]
  2: backwidth=632
  3: backheight=420
  4: 
  5: [Mask_00]
  6: width=632
  7: height=420
  8: visible=0
  9: transparent=0
 10: paintmode=3
 11: alpha=51
 12: animation=3
 13: wait=200
 14: 
 15: [Mask_01]
 16: width=632
 17: height=420
 18: visible=0
 19: transparent=0
 20: paintmode=3
 21: alpha=102
 22: animation=3
 23: wait=200
 24: 
 25: [Mask_02]
 26: width=632
 27: height=420
 28: visible=0
 29: transparent=0
 30: paintmode=3
 31: alpha=153
 32: animation=3
 33: wait=200
 34: 
 35: [Mask_03]
 36: width=632
 37: height=420
 38: visible=0
 39: transparent=0
 40: paintmode=3
 41: alpha=204
 42: animation=3
 43: wait=200
 44: 
 45: [Mask_04]
 46: width=632
 47: height=420
 48: visible=1
 49: transparent=0
 50: paintmode=3
 51: alpha=255
 52: animation=3
 53: wait=200

これを実行すると、このようになります。



だいぶ荒い動きですが、今は説明のためにこれでご容赦ください。実用に足るレベルのものは後ほどお目にかけます。


解説:パラメータ


比較すると分かりますが、[Mask_00] ~ [Mask_04] までは alpha パラメータと visible パラメータ以外は同じ定義です。省略されたパラメータも含めて、その中身を説明しますと・・・


  • これらのセクションには fileName パラメータも loadcache パラメータも指定されていません。つまり、表示内容は color パラメータで指定されたカラーセルという扱いになります
    • color パラメータ自体も省略されていますので既定値の黒($000000)が指定されたものとして扱われます*1。つまり、これらのセルは黒一色を表示(厳密には一時描画)することを指定しています。
    • 画像が指定されていない場合は width パラメータと height パラメータを省略できません(いずれも 0 として扱われてしまいます)。ここでは画面全体で一時描写するために 632 * 420 を指定します。
  • visible パラメータは最後の [Mask_04] だけが 1、他は 0 が指定されています。つまり一時描画後の通常描画フェイズでは [Mask_04] だけが背景として描画されます*2。詳しくは後述します。
  • transparent パラメータに 0 が指定されているので、これらのセクションは透過色を使いません。
  • paintmode パラメータには 3 が指定されており、セクションの描画に透過度が設定されることを指定します。
  • alpha パラメータは 51 → 102 → 153 → 204 → 255 と増加します。これが「徐々に黒い画面になる」というフェイドアウトのキーとなる部分です(後述)。
  • animation パラメータは 3 が指定されており、それぞれの一時描画がセクションの間だけ有効であることを意味しています。
  • wait パラメータでは一律に 200(ミリ秒)が指定されています。

という具合です。
つまりこれらのセクションでは黒一色の画面を、α値を徐々に増加させながら一時描画する、という風に機能しているわけです。ここでは五段階で変化させているので 255 / 5 = 51 ずつ値が増えていきます。
alpha=0 のセクションは描写してもムダなので含まれていません。


解説:場面転換と一時描画


これはフェイドアウトに限らない一般的な話題ですが、エフェクトブースターによる一時描画の使われ方を、背景描画の観点から分類すると以下の二つに分けることが出来ます。


カットイン型
シーンの内部で使われ、一時描画の終了後に背景に影響を与えないもの
トランジション型
シーンとシーンの継ぎ目で使われ、一時描画の終了後に背景を変更するもの

本チュートリアルでのそれぞれの例を挙げますと、前々回まで扱った「親父横移動」アニメはカットイン型です。一方、前回の拡大縮小と、今回のフェードはトランジション型です。


カットイン型では JPY が背景に影響を与えないようにしなければいけません。
ですから、本チュートリアルのアニメ編(その一)およびアニメ編(その二)で示したように「副作用」が残らないような作り方をしなければならないわけです。


これに対してトランジション型では場面転換する目的で JPY を使うなので、むしろ副作用が残るようにしなければなりません(もちろん、望む形の副作用ですが)。
ですから、トランジション型においてはアニメ編(その二)で説明したのとは逆の解決法を必要とします。つまり


  • 一時描画後に [init] セクションをそのまま表示させる(透過しない)
  • 特定のセクションに visible=1 を指定して一時描画後にも表示させる

これらのいずれかの手段を用い、JPY 実行前と違う背景を表示するようにしなければならない、というわけです。


前述の JPY ファイルで一番最後の [Master_04] セクションに visible=1 を指定しているのは、まさにこの理由によります。
一時描画の最後のセクションはアニメーションの最終状態ですから、その描画内容をそのまま背景として表示させるのは処理の流れとして自然です。後で読み直した際にも分かりやすい、可読性の高い記述スタイルだといえるでしょう。


なお、アニメ編(その三)では副作用を抑制するための裏技として、JPY ファイルを 0*0 ピクセルのセルとして設定する、という方法を紹介しました。
この方法ですとカットイン型のエフェクトは作れますが、当然ながらトランジション型のエフェクトを作れません。
やっていけないということはありませんが、あまりスジのいい方法でもないので、本チュートリアルでは推奨しません。


検証:フレーム数による差異


前述のフェイドアウトでは不透明度を五段階で変化させていたため、かなり荒い動作でした。
これをもう少し細かくフレーム(コマ)を割り、なめらかにフェイドアウトさせることを試みます。


まず、フレーム数を倍の 10 、ウェイトは半分の 100 ミリ秒にしてみます。

  1: [init]
  2: backwidth=632
  3: backheight=420
  4: 
  5: [Mask_00]
  6: width=632
  7: height=420
  8: visible=0
  9: transparent=0
 10: paintmode=3
 11: alpha=25
 12: animation=3
 13: wait=100
 14: 
 15: [Mask_01]
 16: width=632
 17: height=420
 18: visible=0
 19: transparent=0
 20: paintmode=3
 21: alpha=51
 22: animation=3
 23: wait=100
 24: 
 25: [Mask_02]
 26: width=632
 27: height=420
 28: visible=0
 29: transparent=0
 30: paintmode=3
 31: alpha=76
 32: animation=3
 33: wait=100
 34: 
 35: [Mask_03]
 36: width=632
 37: height=420
 38: visible=0
 39: transparent=0
 40: paintmode=3
 41: alpha=102
 42: animation=3
 43: wait=100
 44: 
 45: [Mask_04]
 46: width=632
 47: height=420
 48: visible=0
 49: transparent=0
 50: paintmode=3
 51: alpha=127
 52: animation=3
 53: wait=100
 54: 
 55: [Mask_05]
 56: width=632
 57: height=420
 58: visible=0
 59: transparent=0
 60: paintmode=3
 61: alpha=153
 62: animation=3
 63: wait=100
 64: 
 65: [Mask_06]
 66: width=632
 67: height=420
 68: visible=0
 69: transparent=0
 70: paintmode=3
 71: alpha=178
 72: animation=3
 73: wait=100
 74: 
 75: [Mask_07]
 76: width=632
 77: height=420
 78: visible=0
 79: transparent=0
 80: paintmode=3
 81: alpha=204
 82: animation=3
 83: wait=100
 84: 
 85: [Mask_08]
 86: width=632
 87: height=420
 88: visible=0
 89: transparent=0
 90: paintmode=3
 91: alpha=229
 92: animation=3
 93: wait=100
 94: 
 95: [Mask_09]
 96: width=632
 97: height=420
 98: visible=1
 99: transparent=0
100: paintmode=3
101: alpha=255
102: animation=3
103: wait=100



まだちょっとチラチラしますね。
フレーム数をさらに倍の 20 にします。ウェイトはさらに半分の 50 ミリ秒です。

  1: [init]
  2: backwidth=632
  3: backheight=420
  4: 
  5: [Mask_00]
  6: width=632
  7: height=420
  8: visible=0
  9: transparent=0
 10: paintmode=3
 11: alpha=12
 12: animation=3
 13: wait=50
 14: 
 15: [Mask_01]
 16: width=632
 17: height=420
 18: visible=0
 19: transparent=0
 20: paintmode=3
 21: alpha=25
 22: animation=3
 23: wait=50
 24: 
 25: [Mask_02]
 26: width=632
 27: height=420
 28: visible=0
 29: transparent=0
 30: paintmode=3
 31: alpha=38
 32: animation=3
 33: wait=50
 34: 
 35: [Mask_03]
 36: width=632
 37: height=420
 38: visible=0
 39: transparent=0
 40: paintmode=3
 41: alpha=51
 42: animation=3
 43: wait=50
 44: 
 45: [Mask_04]
 46: width=632
 47: height=420
 48: visible=0
 49: transparent=0
 50: paintmode=3
 51: alpha=63
 52: animation=3
 53: wait=50
 54: 
 55: [Mask_05]
 56: width=632
 57: height=420
 58: visible=0
 59: transparent=0
 60: paintmode=3
 61: alpha=76
 62: animation=3
 63: wait=50
 64: 
 65: [Mask_06]
 66: width=632
 67: height=420
 68: visible=0
 69: transparent=0
 70: paintmode=3
 71: alpha=89
 72: animation=3
 73: wait=50
 74: 
 75: [Mask_07]
 76: width=632
 77: height=420
 78: visible=0
 79: transparent=0
 80: paintmode=3
 81: alpha=102
 82: animation=3
 83: wait=50
 84: 
 85: [Mask_08]
 86: width=632
 87: height=420
 88: visible=0
 89: transparent=0
 90: paintmode=3
 91: alpha=114
 92: animation=3
 93: wait=50
 94: 
 95: [Mask_09]
 96: width=632
 97: height=420
 98: visible=0
 99: transparent=0
100: paintmode=3
101: alpha=127
102: animation=3
103: wait=50
104: 
105: [Mask_10]
106: width=632
107: height=420
108: visible=0
109: transparent=0
110: paintmode=3
111: alpha=140
112: animation=3
113: wait=50
114: 
115: [Mask_11]
116: width=632
117: height=420
118: visible=0
119: transparent=0
120: paintmode=3
121: alpha=153
122: animation=3
123: wait=50
124: 
125: [Mask_12]
126: width=632
127: height=420
128: visible=0
129: transparent=0
130: paintmode=3
131: alpha=165
132: animation=3
133: wait=50
134: 
135: [Mask_13]
136: width=632
137: height=420
138: visible=0
139: transparent=0
140: paintmode=3
141: alpha=178
142: animation=3
143: wait=50
144: 
145: [Mask_14]
146: width=632
147: height=420
148: visible=0
149: transparent=0
150: paintmode=3
151: alpha=191
152: animation=3
153: wait=50
154: 
155: [Mask_15]
156: width=632
157: height=420
158: visible=0
159: transparent=0
160: paintmode=3
161: alpha=204
162: animation=3
163: wait=50
164: 
165: [Mask_16]
166: width=632
167: height=420
168: visible=0
169: transparent=0
170: paintmode=3
171: alpha=216
172: animation=3
173: wait=50
174: 
175: [Mask_17]
176: width=632
177: height=420
178: visible=0
179: transparent=0
180: paintmode=3
181: alpha=229
182: animation=3
183: wait=50
184: 
185: [Mask_18]
186: width=632
187: height=420
188: visible=0
189: transparent=0
190: paintmode=3
191: alpha=242
192: animation=3
193: wait=50
194: 
195: [Mask_19]
196: width=632
197: height=420
198: visible=1
199: transparent=0
200: paintmode=3
201: alpha=255
202: animation=3
203: wait=50



かなり自然な表現になりました。これくらいならば実用に供するといえるでしょう。


なお、これらの JPY はいずれも 1 秒かけてフェードアウトしていますが、これは絶対の尺度ではなく、比較のために統一しているだけです。演出の内容によっては、もっと短かったり、長かったり、適切な時間を選ぶ必要があるでしょう。
たとえば「突然爆発があって目の前が真っ白になった」という状況を表現するため白にフェードアウトするなら、おそらく 1 秒は長すぎるでしょう。それに伴い、必要なフレーム数やウェイト時間もおのずと変わるはずです。
どうであれば適切かは一概に言えないので、いろいろ試してシーンに適する表現を見つけてください。


まとめとおさらい


説明が長くなりましたので、今回はいったんここまでとし、フェードインは次回アニメ編(その八)で説明します。


今回のポイントは下記の通りです。


  • フェードは場面転換に用いる
  • フェードは alpha パラメータの変化を用いて一時描画する
  • フェードアウトするには元の画像に黒一色のセクションを逐次重ねる
  • フェードは場面転換(トランジション)型なので副作用が残るようにする
  • フレーム数/ウェイト時間によって見た目がかなり変わる


戻る:アニメ編(その六)

*1 ヘルプファイルでは白($ffffff)が既定値とされていますが誤りで、実際には黒です
*2 厳密には [init] セクションの上に [Mask_04] セクションが重ねられたものが背景として描画されます

シェアボタン: このページをSNSに投稿するのに便利です。

コメント

返信元返信をやめる

※ 悪質なユーザーの書き込みは制限します。

最新を表示する

NG表示方式

NGID一覧