【AviUtl】スクリプト制御 覚書1【拡張編集】

20140528202915

色々とハマる場面があったので、忘れないように色々と覚書。主に自分用です。

ちなみに確かにAviUtlのスクリプト制御の覚書ではあるのだけど、その大部分が(スクリプト制御で使われる)Luaの使い方に対する覚書的なもの……のような気がしないでもない。(; ・`ω・´)

ちなみに上の画像のta~tdは見切れているけれど、テキストオブジェクトにobj.mes()で表示。スクリプト制御に入力しても、すぐに反映されない場合は改行してみたり、タイムラインを移動してみたり、F5で更新してみたりするといいかも……。

構文

if()then...elseif()then ... endのelseif。なんで、else ifじゃないのかと小一時間……。

repeat...until条件式。条件式が偽のあいだ、繰り返す。do~while(条件式) の反対的なもの。

テキスト関係

『文字列の結合』
str=”a” + “b” ......だと思うやん、ちゃうねん。×
str=”a”..”b”  こっちが正解。◯

なまじ他の言語に触れていると一番最初にハマるところなんじゃないかと。

 

『入力される文字数と文字数制限』
m_count=60 --最大入力数。半角*2で全角。つまり”ああああ”の長さは8。
moji = “入力されるテキストの文字列” 実際は半角全角(文字列の奇数、偶数)の判定必要。

if(string.len(moji)<=m_count)then
 入力される文字列が最大文字数以内の時の処理。
 表示や拡大など。
elseif(m_count < string.len(moji))then
 入力される文字列が最大文字数を超える時の処理。
 表示や改行、縮小など。
end

更にobj.screen_wやobj.screen_hを使って画面の大きさによる判定も行えば尚可。そのときは『文字のサイズ、文字数、字間』、『文字のサイズ、行数、行間』といった要素も忘れてはいけない。

行数nは、
n=math.ceil(string.len(moji)/m_count)で算出。

 

『テキストの表示』

obj.load(“text”,moji,speed,time)   –- このspeedとtimeは余り使わないかも……。
obj.setfont(name,moji_size,type,col1,col2) – type:0~4
obj.draw(dx,dy,dz)

for i=0,n(行数) do … endで使うときは、

dy=(i*moji_size*ls)-(n*moji_size*ls)/2-moji_size*ls/2 --中心位置、lsは行間。
obj.draw(0,dy,0)

一応、中心に並ぶけれど、中心から奇数行目がぼやける(AviUtlの画像として扱われるため?)ので、奇数行だけ0.5分ズラすような追加処理が必要?

dy=math.floor((i*moji_size*ls)-(n*moji_size*ls)/2-v0*ls/2)+0.1*i

のほうがボヤけなかった……。

 

『文字の分割というか抽出時の注意』

newMoji = string.sub(“あいうえおかきくけこ”,3,9)
→ 3文字目から9文字目まで表示
→ いうえ・

全角は2文字で1文字なので、3文字目だと『い』の半ばから『え』の半ばまでということになるために文字化け発生。

 

newMoji = string.sub("アいうえおかきくけこ",2,8)
→ 2文字目から8文字目まで
→ いうえ・

全角は2文字で1文字なので、文字化け発生。各文字に対する番号は、『ア(1)い(2,3)う(4,5)え(6,7)お(8,9)き(10,11)く(12,13)け(14,15)こ(16,17)』という感じ。

 

不定の文字列を読み込み、文字列を分割したいときは、分割したい先頭や半ばに半角があるとき、後尾にあるときで処理を変える必要あり?

■:全角、□:半角
□■■■■■■■■
■■■□■■■■■
■■■■■■■■□

 

『文字化けの有無の判定』
if(moji%2 == 0)then
 余りが0(偶数。半角なしか偶数個)のときの処理
elseif(moji%2 ~= 0)then --『~=』。『!=』だと勘違いしてハマった。orz
 余りが0ではない(奇数。半角有り、奇数個)のときの処理
end

とりあえずの処理なので、不定の文字列を分割し、配列に格納しているようなときは、分割方法(抽出方法)に一考が必要。→ 要試行錯誤。

obj.timeを使うときのポイント

obj.timeはオブジェクトの経過時間を数値で表す。なので、プロジェクトファイルを30fpsで作った場合、obj.timeは1フレームごとに0...,0.03333...,0.06666....,0.099999....という感じで増えていく。そのため、時間経過で色々とやりたいときにそのままobj.timeを使うと、小数点以下の値の影響を受けてしまう。

単純に配列等で時間毎に1...2...3...と増やしていきたい(小数点以下の影響を受けたくない)ときは、

math.ceil(obj.time) --小数点の切り上げ
math.floor(obj.time) --小数点の切り下げ

のどちらかの関数を使う。カウントさせたいときは『math.floor(obj.time)』のほうが無難っぽいし、段落分けのように必ず1以上の数字が必要なときは『math.ceil(moji/saidai_moji)』のような感じで切り上げが望ましい感じ。

下の画像は、上の値がmath.ceil(obj.time)、下の値がmath.floor(obj.time)の違い。どちらも小数点を省く関数だけど、移り変わりの推移が違う。またプロジェクトは30fps。

20140528204827 1フレーム目

どちらも初期は0。
20140528204905 3フレーム目。

math.ceilのほうが1になる。
20140528205028 32フレーム目。

math.floorも1になる。
20140528205103 33フレーム目。

math.ceilのほうが2になる。

ちょっとした違いだけど、時間経過で配列を参照させるような場合は、初期値の関係的にやっぱりmath.floor(obj.time)。

スピードの変更・調節

tb0=obj.track0 --トラックバーの一番上 1,100,10,1という感じ。

『パターン1』
t=obj.time --1秒ごとに1増える変数。
speed=t/tb0 --tb0秒ごとに1増える。ただし、このままだと小数点以下の影響あり。

『パターン2』
t=math.floor(obj.time) --1秒ごとに1増える変数+切り下げ。場合によってはこれに+1する。
speed=t/tb0 --tb0秒ごとに1増える。

-1から1までの変数取得

--track0:-360,360,0,0.01という感じ。

tb0=obj.track0
r=tb0*math.pi/180
v=math.cos(r)

これでトラックバーから、あるときはプラス、あるときはマイナス、あるときは上、あるときは下、またあるときは右、またあるときは左、あるときは真、あるときは偽など結果や判定を入れ替えることができる。

色情報の扱い

hogehoge.anmでは、--dialog:color/col,col=0xffffff;

この記述によって簡単に色情報を取得できるようになるものの、使用可能な色の形式が各々で違うために機能に見合った形式にする必要がある。

RBGのときは、
r,b,g=RBG(col)

HSVのときは、
h,s,v=HSV(col)

また、これらは相互変換可能とのことで、

col=RGB(r,b,g)
col=HSV(h,s,v)

とすることもできる。

問題は、YCbCr。RBGとHSVはcolを経由して、RBG ←→ col ←→ HSVという感じで変換できるけど、YCbCrは変換する関数が用意されていない。なので、変換したいときは、自分で変換できるプログラムを書くしかないのだけど、

引用元:YUV - Wikipedia

YUV (PAL, SECAM)
Y = 0.299 × R + 0.587 × G + 0.114 × B
U = -0.14713 × R - 0.28886 × G + 0.436 × B
V = 0.615 × R - 0.51499 × G - 0.10001 × B

ITU-R BT.601 / ITU-R BT.709 (1250/50/2:1)
Y = 0.299 × R + 0.587 × G + 0.114 × B
Cb = -0.168736 × R - 0.331264 × G + 0.5 × B
Cr = 0.5 × R - 0.418688 × G - 0.081312 × B

ITU-R BT.709 (1125/60/2:1)
Y = 0.2126 × R + 0.7152 × G + 0.0722 × B
Cb = -0.114572 × R - 0.385428 × G + 0.5 × B
Cr = 0.5 × R - 0.454153 × G - 0.045847 × B

 

これらの式を使って計算しただけだと、上手く行かなかった。string.format()を使って16進数で表現し、文字列にしてその文字列を入れ替える必要があるっぽい。

この他にもYCbCr、RBG変換等の語句で検索をかけると、数値的な誤差をどうするのかとか悩みが多くなる……。orz

obj.effect()関数の呼び出し関係

obj.effect()でAviUtlのフィルタ効果を呼び出すときの予約語的なもの。

詳細は使いたい各フィルタを付加したオブジェクトをエクスポートして、エクスポートしたファイル(hogehoge.exo)をテキストエディタ等で開き、対応項目を確認する。

 

  • blend:グラデーション等の合成モードなどの指定。0が標準で、1が加算で……という感じ。
  • mode:ノイズのTypeなど。
  • type:図形等。フィルタ等によって異なる。
  • color_yc:カラーキーやクロマキーなどで使われる。上述したYCbCr関係の変換が必要。

 

長い名称の項目は大抵、ダイアログの表示とは違うので注意が必要。面倒臭がると、何気にハマる部分。

関連記事
スポンサーサイト

0 Comments

Post a comment