【AviUtl】スクリプト制御 第3回【拡張編集】

20140530031602

forは指定回数だけ処理を繰り返させる構文。

どんなときに使うかというと、決まった回数の繰り返しの処理をさせたいときに使う。上の画像は、一個の図形オブジェクト(円+グラデーションフィルタ)に追加したスクリプト制御にfor構文を書いて描いている。

上の画像は、

t=obj.time
for i=0,10 do
 obj.draw(t*1.4^i,1.5*i*t,t*i*20)
end

という記述の結果。コピペすれば同じようになるはずなので、色々と試してもらえると理解が深まるはず。(拡張描画にして、カメラ制御でグリグリ動かすと、ちゃんと三次元に円が複製されていることがわかるはず)

ちなみにobj.draw()はAviUtl固有の関数で、drawの文字からも窺えるように描画する機能を持っている。座標XYZ以外にも、拡大率や透明度もこの関数から指定できる。とりあえず上の構文の内容としては()内の” , ”の区切りによってx,y,zに対応している。

つまり上のfor文は、tにobj.timeをし、obj.draw()のxにt*1.4^iを入れ、yに1.5*i*tを入れ、zにt*i*20に入れたものを0から10までの計11回繰り返して描画しろと書かれている。

ちなみに↑の内容はまだわからなくてもOK。以下で説明するので……。じゃあ、なんで一番最初に書いたんだ!という話だけど、for構文でどんなことができるか知って欲しかったから。

for構文の基本型

forの基本の型としては、

for i=0,n do

end

というもので、『 i 』は繰り返される数値が入る変数。『 i = 0 』の意味は初期値0、そこから変数 i を上限値『 n 』まで増やしていくという宣言で、『 n 』は上限にする数値(数値を入れた変数でも可)を入れる。

たとえば、初期値が0で、そこから計100回ほど処理を繰り返させたいときは、

for i=0,99 do

end

とすると、『i』は0,1,2,3,4,5......97,98,99と増えていき、100回、do~end間に書かれた処理を繰り返す。ちなみに初期値に『1』を入れて、上限値を『100』としても、同じように100回の処理が繰り返される。

 

ちなみに上限値となる『 n 』に関しては、状況によって変わる変数『 n 』として指定することも可能。たとえば、前処理でテキストオブジェクトの文字数をカウントするようにしておき、それを『 n 』に代入するようにしておけば、『 n 』はそのときどきのテキストオブジェクトの文字数で上限値を変える……という処理ができる。

ただし、処理回数が同じでも結果が異なることもある

20140530021341 20140530021935
スクリプト制御内に記述
『上の円』
for i=0,9 do
 obj.ox=30*i
end
『下の円』
for i=1,10 do
 obj.ox=30*i
end

どちらも10回の処理が行われているけれど、繰り返し処理の中に変数『i(回数によって値が変わる)』があり、初期値が異なるために結果が異なる。
スクリプト制御内に記述
『上の円』
for i=0,9 do
 obj.ox=obj.ox+30
end
『下の円』
for i=1,10 do
 obj.ox=obj.ox+30
end

どちらも10回の処理が行われているけれど、『~』に書かれた処理が初期値に依存しないもののために同じ結果になっている。

for構文は初期値によって結果を変えることができるし、初期値に影響されずに同じ結果を得ることもできる。使い分けができるようになると、if構文同様に非常に便利。

サンプル

テキストオブジェクト、100文字程度※の入力、文字毎に個別のオブジェクトにチェックの状態の状態でスクリプト制御に

t=obj.index  -- 文字毎に個別のオブジェクトで表示された文字数をカウントする変数
for i=0,t do
 obj.alpha=i/99  -- ※の理由
end

20140611224724 20140611224737

上の画像を見ればわかるけれど、1文字目は初期値0から始まっているので見えない。2文字目以降、徐々に色が付いて行き、100文字目(99番目で)で透明度が『1』になり、完全な状態になる。

ちなみにobj.indexは表示速度に値を設定して、obj.mes()関数でその変化を観測すると、一文字表示される毎に値が1増えていくのがわかるのでお試しあれ。

 

同上の条件で、スクリプト制御の内容を少しだけ変えたもの。

t=obj.index
n=obj.num  -- 文字毎に個別のオブジェクトの総文字数
for i=0,t do
obj.alpha=(n-i)/99
end

20140611225748 20140611225811

今度は文字数が増える毎に透明になっていくバージョン。

 

同上の条件で、スクリプト制御の内容を少しだけ変えたもの。

t=obj.index
n=obj.num
for i=0,t do
obj.oz=i*20
obj.rz=i
end

20140611231443 20140611231500
20140611232050 20140611232140

少し内容を変えて、視力検査っぽい感じにしてみたもの。文字の大きさは拡大率ではなくZの値を増やして擬似的に小さく見せている。なので、カメラ制御を使うと、下の段のような感じに見える。

ちなみにこのような処理(カメラ制御下の下段のもの)をスクリプト制御を使わずにやろうとすると、それぞれ文字毎にテキストオブジェクトを配置して、それぞれのZ、回転の値を設定して……ということになる。

この場合、100文字なので100個のオブジェクトでそうした処理をすることになるけれど、スクリプト制御を使い、for構文で書くと一個のテキストオブジェクトで済んでしまう。(ただし、for構文に書いた規則性に縛られるけれど……)

 

 

図形に軌跡を描かせる感じのfor構文。水漏れっぽい感じ。

f=obj.frame
for i=0,f do
dx=i^(1/2)
dy=i*5
obj.draw(dx,dy,0,50/(i+50))
end

20140611234155 20140611234214

とろ~っという感じで垂れるような移動&軌跡っぽいもの。やっていることはページ最上段の図形と同じ。描画間隔を詰めることで、円の点ではなく軌跡(線)にしている。

 

他にも配列にデータを順番に格納したり読み出したりといった使い方やobj.effext()の重ねがけ、obj.draw()を使ったオブジェクトの複数配置、軌跡の描画などにも使える。

注意点としては、繰り返し処理(for、while、repeat等)は重い処理を繰り返したり、処理の終了条件を誤ると、操作を受け付けなくなったり処理が永続してしまったりすることがあること。

 

 

 

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

0 Comments

Post a comment