0
0

More than 1 year has passed since last update.

DaVinci Resolve: Text+用 テキストを1文字づつ表示させるExpression

Last updated at Posted at 2023-04-08

Text+ の Write OnExpression を設定して、 フレーム毎に1文字づつ表示 させるようにします。
Fusion ページは使わず、Edit ページのみで完結させられます。
入力した 文字数に依存 するため、キーフレームも使用しません。
text1-001.png

タイムラインに配置したText+のInspectorから、「Write On」の「End」にExpressionを設定します。
text1-002.png
「End」の文字部分を右クリックして、Expressionを選択します。
text1-003.png
Expression入力エリアが表示されます。
text1-004.png
初期値の1.0を消して、以下を入力(コピペ)

math.max(0, math.min(1, 1 / #(self.StyledText.Value):gsub("[\128-\191]", "") * time))

text1-005b.png
再生すると1フレーム毎にWrite On の値が変わり、1文字づつ表示されるようになります。
まれに2文字一緒に出ることがあります。数値的には合っていても Write On の挙動に数値のまるめなどの影響があるのかと思いますが、現時点では対処していません。
text1-006.png

開発経緯
開発というほどでは無いですが…
1文字づつ表示させる演出は、キーフレームを打ったり、どこからどこまでにというフレーム数に依存した形の実装が多いと思います。
単純に1文字づつ順に表示してるのでいいのにという場合、文字数を数えてキーフレーム打つのは面倒、スクリプトでやらせることにしました。

文字数のカウントについて
Luaには、string.len()という文字数を数えるメソッドがありますが、全角などのUTF-8に対応していません。
バイト数としてして返ってくるため、1文字で3カウントされます。
string.len()を使わず、string.gsub()のパターンでUTF-8コードポイント([\128-\191])をキャプチャして、長さ演算子「#」で数を出しています。
※Lua5.3からは、UTF-8対応の utf.len が実装されているようですが、DaVinci Resolve 18 では対応していません。

最大小値設定について
Write On が受け付ける値は[0-1.0]です。
math.max(0, math.min(1, *)) でその範囲に収まるようにしています。
Expression貼り付け時に再生ヘッドがその範囲の位置にあれば、以降それを超えようが動いてはくれます。
そこに気をつければ max, min無しでも動きますが、再生ヘッドがその範囲を超えているとエラーとなり、描画されなくなります。
それを回避するために、冗長ですが出力の値の範囲を絞っています。

カスタマイズ

数フレーム毎に出す

単純に time の後に希望するフレーム数で割ってやります。
2で割れば、2フレーム毎に1文字が出てきます。

-- 2フレーム毎に1文字出す(time / 2)
math.max(0, math.min(1, 1 / #(self.StyledText.Value):gsub("[\128-\191]", "") * time / 2))

フレーム数を固定して出す

20フレームで最初から最後まで出したい場合、文字数は関係なくなるので、以下の Expression で可能です。

math.max(0, math.min(1, time / 20))

以上

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0