アニメーション効果1
公開スクリプトの追加方法は、追加方法・留意点の項目を参照して下さい。
また、スクリプトを公開される方は、必ず同ページのスクリプト記載ルールをご確認ください。
※テキストファイルがある場合は、拡張子を「.anm」に変更して使用して下さい。
名称 | 製作者 | 説明 | 出典/最終更新 | txt |
---|---|---|---|---|
四角い映像に厚みをもたせる | 金の髭 | 名前どおりです。 透明・半透明部分を持つ映像だとうまくいきません。 |
愛好会掲示板の596に書いたものを改良 2011/8/29 |
|
拡張XYスケール 拡大率(マイナス対応) |
金の髭 | ■拡張XYスケール X方向,Y方向それぞれで拡大率を指定できる 「XYスケール」を、マイナスの拡大率に 対応させたものです。 初版ではdrawpoly()を使っていましたが その後使わないように修正しました。 ■拡大率(マイナス対応) こちらもマイナスの拡大率に 対応したものですが、XとYを分けず 1つのパラメータで指定します。 単純にobj.zoomを操作しています。 |
2011/09/19 12:50更新 |
|
スクリプト入力セット ・チェック入力 ・カラー入力 ・File名入力 ・数値・テキスト入力 |
金の髭 | スクリプト開発者用のものです。 「スクリプト制御」でちょっとしたスクリプトを 書きたい場合のパラメータ制御に使います。 制御したいパラメータに対応するものを追加し、 その下に「スクリプト制御」を追加して myTrack0などの変数を使ってスクリプトを書けば トラックバーでの数値制御などが可能です。 |
2011/9/19 | |
ランダム文字入退場 | ゆうき | さつき氏のTAランダム文字で登場(改)を、非等幅フォントに対応させて、さらにTA標準登場、加減速移動と合体させたもの。 | 2012/01/28 | |
ルパンタイトル(中央揃え(中)限定版) | 金の髭 | ルパン3世のタイトルのように、 「1文字ずつ表示した後で全体を表示する」 というスクリプトです。 「文字毎に個別オブジェクト」にチェックを入れ、 文字揃えを「中央揃え(中)」にして使って下さい。 左揃えとかのほうが需要があるような気もする。 動画(twitvideo) |
2011/09/28 | |
4点引き伸ばし | 金の髭 | ※注意 映像が思うように変形しないことがあります。 使う場合は十分ご注意下さい。 オブジェクトの4隅の座標の 変位量を指定して映像を変形させます。 「4点引き伸ばしA」の後に 「4点引き伸ばしB」を適用して下さい。 ただし仕様上の挙動のため、 映像が歪んだりすることがあります。 使う場合は問題が出ていないかどうか よく確認しながら使うようにして下さい。 2011/10/02 18時更新 2つのアニメーション効果に分離し、 4点ともトラックバー制御できるようにしました。 |
2011/10/02 18時更新 | |
リニアワイプ | 金の髭 | 角度を指定して直線的なワイプを行ないます。 中身はただの斜めクリッピングですが、 NiVEなどのように「進行度(%)」という パラメータで制御するようになっています。 イメージの大きさを気にせずにリニアワイプが できると便利かなと思って作ってみました。 |
2011/10/05 | |
TA位置調整で登場 | さつき | テキストを一文字毎にドラッグで移動すると、その位置から移動して登場してきます。また「逆方向」にチェックすると、元の位置からドラッグした座標へと移動して登場します。その他項目は、さつきの大百科ユーザ記事にて公開しているTAシリーズと同様。 ※テキストオブジェクトで「文字毎に個別オブジェクト」にチェックして使用して下さい。 (ちなみに当Wikiでリクエストがあったスクリプトなので、こちらで公開しています。) |
2011/12/25 | TA位置調整で登場.txt |
重ねがけマスク | ティム | 重ねがけできるマスクです。 中心はアンカーで制御しますが、位置固定です>< |
2011/12/30 | |
深度エフェクト(カメラ連動) | ゆうき | 深度に応じてエフェクトをかける汎用スクリプト。 デフォルの設定は、深度ノイズ効果。(遠方のオブジェクトにフォグをかけたいと思って作ったけど・・・) 詳細はスクリプトに記述。 |
2012/01/07 | |
姿勢制御 | ゆうき | オブジェクト本来のZYX軸で回転します。重ねがけも可能です。 Z->Y->Xの順に回転することに留意。 |
2012/01/08 | |
角丸クリッピング | ゆうき | 画像の四隅を丸く削ぎ落とす。 http://www.nicovideo.jp/watch/sm15921712 ←これの真似をしてみたが、機能は少し異なる。 高精度に削ぎ落としをすると非常に重いが、オプションでプレビュー時のみ低精度で処理をするオプションをつけたので安心!? |
2012/01/13 | |
落ちて弾む | ゆうき | 入退場アニメ効果。 『起き上がって登場』の移動Ver.的なもの。 |
2012/01/13 | |
泡 | ゆうき | 画像が泡になって消滅する。 2012/04/01 ゆらぎオプションをつけてみた。 |
2012/01/26 改訂:2012/04/01 |
|
ウェーブ登場 | ゆうき | オブジェクトの各種パラメタがウェーブします。詳細はスクリプトに記述。 ※2012/02/13 18:30 Ver.UP ・減衰のさせ方を増やした。 ・ZOOMが大きすぎる場合、小さすぎる場合の描画打ち切りをできるようにした。 ・透明度も指定できるようにした。 ・振動数を小数点数に対応した。(旧Ver.は0.5刻み) ・振動数が負数の場合に、プラスマイスを反転するようにした。 |
2012/02/13 | |
スクリプト名 | 製作者 | スクリプトの説明 | スクリプトの出典および最終更新 |
四角い映像に厚みをもたせる
@四角い映像に厚みをもたせる
--track0:厚さ,0,1000,30
d = obj.track0/2.0
x = obj.w/2.0
y = obj.h/2.0
obj.effect()
obj.setoption("antialias",1)
obj.drawpoly(-x,-y,-d, x,-y,-d, x,y,-d, -x,y,-d, 0,0, obj.w,0, obj.w,obj.h, 0,obj.h) -- 手前
obj.drawpoly(x,-y,d, -x,-y,d, -x,y,d, x,y,d, obj.w,0, 0,0, 0,obj.h, obj.w,obj.h) -- 奥
obj.drawpoly(-x,-y,d, x,-y,d, x,-y,-d, -x,-y,-d, 0,0, obj.w,0, obj.w,1, 0,1) -- 上
obj.drawpoly(-x,y,-d, x,y,-d, x,y,d, -x,y,d, 0,obj.h-1, obj.w,obj.h-1, obj.w,obj.h, 0,obj.h) -- 下
obj.drawpoly(-x,-y,d, -x,-y,-d, -x,y,-d, -x,y,d, 0,0, 1,0, 1,obj.h, 0,obj.h)-- 左
obj.drawpoly(x,-y,-d, x,-y,d, x,y,d, x,y,-d, obj.w-1,0, obj.w,0, obj.w,obj.h, obj.w-1,obj.h) -- 右
拡張XYスケール・拡大率(マイナス対応
)
@拡張XYスケール
--track0:Xスケール,-2000,2000,100
--track1:Yスケール,-2000,2000,100
xscale=obj.track0
yscale=obj.track1
-- 絶対値でXYスケールを行なう
absX=math.abs(xscale)
absY=math.abs(yscale)
obj.zoom=math.max(absX,absY)/100
if(absX>absY) then
--アスペクト比をマイナス方向にしてやる必要がある
obj.aspect=absY/absX-1
else
--アスペクト比をプラス方向にしてやる必要がある
obj.aspect=1-absX/absY
end
-- マイナスの場合は反転フィルタで反転する必要がある
if (xscale<0) then xscale=1 else xscale=0 end
if (yscale<0) then yscale=1 else yscale=0 end
obj.effect("反転","上下反転",yscale, "左右反転",xscale)
@拡大率(マイナス対応)
--track0:拡大率,-2000,2000,100
--
-- XY個別に指定する必要がないならobj.zoomだけでいける。
--
obj.zoom=obj.track0/100
スクリプト入力セット
@チェック入力
--check0:チェック
myCheck=obj.check0
@カラー入力
--color:0xffff00
myColor = color
@File名入力
--file:
myFile = file
@数値・テキスト入力
--track0:myTrack0,-2000,2000,0
--track1:myTrack1,-2000,2000,0
--track2:myTrack2,-2000,2000,0
--track3:myTrack3,-2000,2000,0
--dialog:param1,param1=1;param2,param2="text2";param3,param3=3;param4,param4="text4";param5,param5=5;param6,param6="text6";param7,param7=7;param8,param8="text8";param9,param9=9;param10,param10="text10";param11,param11=11;param12,param12="text12";
myTrack0=obj.track0
myTrack1=obj.track1
myTrack2=obj.track2
myTrack3=obj.track3
ランダム文字入退場
@ランダム文字
--track0:時間,-5,5,0.5,0.01
--track1:間隔,0,2,0.2,0.01
--track2:拡大率,0,1000,100,0.01
--track3:縦横比,-100,100,0,0.01
--dialog:登場順[0-5],order=0;グラフ表示/chk,graph=0;加減速タイプ[1-3],mover=1;べき乗数,exp=2.0;単振動タイプ[1-4],harmonic=nil;振動数,frequency=1;乱数シード,seed=0;フェード/chk,fade=0;一箇所から登場/chk,join=0;XYZ座標,pos={0,0,0};XYZ軸回転,rotation={0,0,0};切替時間[ms],section_msec=50;
--[[
時間: マイナスの値ならば退場
登場順
0: 昇順, 1: 降順, 2: ランダム順, 3: ランダム間隔, 4: 内側から, 5: 外側から
加減速
加減速タイプ
0: 加減速なし, 1: 加速, 2: 減速, 3: 加減速
べき乗数(小数点数使用可能)
単振動タイプ
0: なし, 1: サインカーブ, 2: ジャンプ, 3: ジクザグ, 4: デジタル
振動数: 単振動の振動数
単振動の使い方例
加減速タイプ 2
べき乗数 2.0
単振動タイプ 2
振動数 4
ちょっと弾む感じな補間曲線になる
乱数シード
マイナスの値ならば、レイヤーを変えても乱数値は変わらない
]]
local T = function(params)
local params = params or {duration = 0, interval = 0, order = 0, harmonic = 0, frequency = 0, mover = 1, exp = 1, seed = 0, graph = 0, obj = nil}
local duration = params.duration or obj.totaltime
local interval = params.interval or 0
local order = math.floor(params.order or 0)
local harmonic = math.floor(params.harmonic or 0)
local frequency = math.floor(params.frequency or 0)
local mover = math.floor(params.mover or 0)
local exp = params.exp or 1
local seed = math.floor(params.seed or obj.layer)
local graph = params.graph or 0
local rand = obj.rand
local obj = params.obj or obj
seed = (seed == 0) and obj.layer or seed
if(duration >= 0)then
if(mover == 1)then
mover = 2
elseif(mover == 2)then
mover = 1
end
end
local function T1() --入退場レート計算
local num, index = obj.num, obj.index
if(order == 1)then --逆順
index = (num - 1) - index
elseif(order == 2)then --ランダム順
local tmp = {}
for i = 1, num do tmp[i] = i - 1 end
for i = 1, num do
local j = rand(1, num, -math.abs(seed), i)
tmp[i], tmp[j] = tmp[j], tmp[i]
end
index = tmp[index + 1]
elseif(order == 4)then --内側から
local c = (num - 1) * 0.5
index = math.floor(math.abs(index - c))
elseif(order == 5)then --外側から
local c = (num - 1) * 0.5
index = c - math.abs(index - c)
end
local delay = interval * index
if(order == 3)then --ランダム間隔
delay = interval * (num - 1) * rand(0, 100, seed, index) * 0.01
end
local time = obj.time
if(duration < 0)then time = obj.totaltime - time end --退場
return 1 - math.max(0, math.min(1, (time - delay) / math.abs(duration)))
end
local function T2(t)
local t = t
if(mover == 1)then --加速
t = math.pow(t, exp)
elseif(mover == 2)then --減速
t = 1 - math.pow(1 - t, exp)
elseif(mover == 3)then --加減速
if(t < 0.5)then
t = math.pow(t * 2, exp) * 0.5
else
t = 1 - math.pow((1 - t) * 2, exp) * 0.5
end
end
return t
end
local function T3(t)
local t = t
if(harmonic == 1)then --単振動
t = (math.cos(-math.pi + math.pi * (1 + 2 * frequency) * t) + 1) * 0.5
elseif(harmonic == 2)then --単振動(反発)
t = math.abs(math.sin(math.pi * (0.5 + frequency) * t))
elseif(harmonic == 3)then --単振動(ジグザグ)
t = (1 + 2 * frequency) * t
local n = math.floor(t)
t = t - n
if(n % 2 == 1)then
t = 1 - t
end
elseif(harmonic == 4)then --単振動(デジタル)
t = math.abs(math.sin(math.pi * (0.5 + frequency) * t))
if(t < 0.5)then
t = 0
else
t = 1
end
else
t = nil
end
return t
end
local function T4(t)
if(not T3(t))then
return T2(t)
end
local section_num = frequency * 2 + 1
local section_length = 1 / section_num
local current_section = math.floor(t / section_length) + 1 -- 1, 2, 3, 4, 5, 6, ...
current_section = math.floor((current_section + 1) / 2) * 2 -1 -- 1, 1, 3, 3, 5, 5, ...
local scale = T2(current_section / section_num)
return T3(t) * scale
end
if(graph == 0)then
return T4(T1())
else
if(obj.index == 0)then
local offset_x = -100
local offset_y = 100
local size = 200
obj.load("figure", "四角形", 0xff0000, 8)
local t = T1()
local x = t * size
t = T4(t)
local y = t * size
if(duration >= 0)then
obj.draw(offset_x + size - x, offset_y - y)
else
obj.draw(offset_x + x, offset_y - y)
end
obj.load("figure", "四角形", 0xffffff, 1)
local step = 1 / math.abs(duration * obj.framerate) * 0.05
for t = 0, 1, step do
local x = t * size
t = T4(t)
local y = t * size
if(duration >= 0)then
obj.draw(offset_x + size - x, offset_y - y)
else
obj.draw(offset_x + x, offset_y - y)
end
end
obj.load("figure", "四角形", 0x888888, 2)
obj.drawpoly(offset_x, offset_y, 0, offset_x + size, offset_y, 0, offset_x + size, offset_y + 1, 0, offset_x, offset_y + 1, 0)
obj.drawpoly(offset_x, offset_y, 0, offset_x, offset_y - size, 0, offset_x + 1, offset_y - size, 0, offset_x + 1, offset_y, 0)
end
local w, h = obj.getpixel()
obj.effect("クリッピング", "上", h)
return 0
end
end
local layer = obj.layer
local seed = (seed == 0) and obj.layer or seed
--各文字の本来の offset を保存する(S)
--1フレーム目から安心してこの値を参照できる(0フレーム目ではない)
if(obj.index == 0)then
layervar = layervar or {}
if(obj.time == 0)then
layervar[layer] = {}
else
layervar[layer] = layervar[layer] or {}
end
end
layervar[layer][obj.index] = {ox = obj.ox, oy = obj.oy, oz = obj.oz, rx = obj.rx, ry = obj.ry, rz = obj.rz, alpha = obj.alpha, zoom = obj.zoom, aspect = obj.aspect, index = obj.index, num = obj.num, totaltime = obj.totaltime, layer = obj.layer, time = obj.time}
--各文字の本来の offset を保存する(E)
local objs = layervar[layer]
if(objs[obj.index - 1] and objs[obj.index - 1].time ~= objs[obj.index].time)then --空白文字対策
objs[obj.index - 1] = nil
end
local section_no = math.floor(obj.time / (section_msec * 0.001)) --section_noを計算する
local duration = obj.track0
local interval = obj.track1
local zoom = obj.track2 * 0.01
local aspect = obj.track3 * 0.01
obj.setanchor("pos", 1, "xyz")
local t = T({duration = duration, interval = interval, order = order, harmonic = harmonic, frequency = frequency, mover = mover, exp = exp, seed = seed, graph = graph})
obj.effect()
if(t <= 0)then
--アニメ未適用
obj.draw() --表示
else
--アニメ適用済み/アニメ適用処理中
obj.draw(0, 0, 0, 1, 0) --非表示
end
if(duration >= 0 and duration + interval * (obj.num - 1) <= obj.time)then
return
elseif(duration < 0 and obj.totaltime - duration + interval * (obj.num - 1) >= obj.time)then
return
end
--他の文字の代理文字として表示する必要が有るかどうかを調べ、必要に応じて代理表示する。(ここでいう他の文字には自身を含む)
local myself = objs[obj.index]
for other_index = 0, obj.num - 1 do
local other = objs[other_index]
if(other)then
other.time = obj.time
--代理文字抽選
--全オブジェクト共通の乱数を得るためにシードは負の値を使う
local proxy_index = obj.rand(0, obj.num - 1, -math.abs(seed), other.index * 100 + section_no)
--自身が代理文字であれば、他の文字の代理文字として表示してやる
if(obj.index == proxy_index)then
t = T({duration = duration, interval = interval, order = order, harmonic = harmonic, frequency = frequency, mover = mover, exp = exp, seed = seed, graph = 0, obj = other})
if(0 < t and t < 1)then
local t_ = 1
if(join == 1)then
t_ = 1 - t
end
obj.ox = other.ox * t_ + pos[1] * t
obj.oy = other.oy * t_ + pos[2] * t
obj.oz = other.oz * t_ + pos[3] * t
obj.zoom = other.zoom * (1 + (zoom - 1) * t)
obj.rx = other.rx + rotation[1] * t
obj.ry = other.ry + rotation[2] * t
obj.rz = other.rz + rotation[3] * t
local alpha = 1
if(fade == 1)then
obj.alpha = other.alpha * (1 - t)
end
--aspect S
local aspect = aspect * t
local zoom_x = math.min(1, 1 - obj.aspect) * math.min(1, 1 - aspect)
local zoom_y = math.min(1, 1 + obj.aspect) * math.min(1, 1 + aspect)
obj.zoom = math.max(zoom_x, zoom_y)
if(math.min(zoom_x, zoom_y) == 0)then
obj.aspect = (zoom_x == 0) and 1 or -1
else
obj.aspect = ((zoom_x / zoom_y <= 1) and (1 - zoom_x / zoom_y)) or (zoom_y / zoom_x - 1)
end
--aspect E
obj.draw()
end
end
end
end
if(obj.time == obj.totaltime and obj.index == obj.num - 1)then
layervar[layer] = nil --フレームが間引かれたらこの処理は実行されないかも
end
ルパンタイトル(中央揃え(中)限定版)
@ルパンタイトル(中央揃え(中)限定版)
--
-- 文字列をルパン3世のタイトルのように「1文字ずつ表示→全体表示」させるアニメーション効果です。
--
-- ※テキストオブジェクトで「文字毎に個別オブジェクト」にチェックを入れて使って下さい。
--
-- ※文字揃えは「中央揃え(中)」で使うことを前提としています。
-- (左揃えとかのほうが需要はあると思うのですけど、これが楽だったので・・・。
-- いろいろ拡張してみると面白いかもしれません。)
--
-- ※元のテキストを拡大するとボケるので、元のテキストは大きめのサイズで作っておき
-- 「拡縮(個)」(文字ごとの拡大率)を100にして、
-- 「拡縮(全)」(全体の拡大率)を100以下(要するに縮小)にしたほうが綺麗。
-- ただ、サイズを大きくするとメモリを食う上にかなり重くなるので、そのへんは注意。
--
--track0:スピード,1,100,20
--track1:タイムラグ,1,100,10
--track2:拡縮(個),0,1000,100
--track3:拡縮(全),0,1000,20
speed=obj.track0/100 -- 1文字あたりの表示時間(1/100秒単位)
timelag=obj.track1/100 -- 1文字ずつ表示した後、全体を表示するまでの時間差(1/100秒単位)
charZm=obj.track2/100 -- 文字毎に表示する際の拡大率(パーセント)
strZm=obj.track3/100 -- 全体を表示する際の拡大率(パーセント)
-- 処理開始
n = math.floor(obj.time/speed)+1
if (n <= obj.num) then
-- 個別文字表示期間。対象の文字だけを表示する。
if (obj.index==(n-1)) then
-- 表示対象の文字は中央に拡縮して表示
obj.ox=0
obj.oy=0
obj.zoom=charZm
else
-- 対象外の文字は透明にして消す
obj.alpha=0
end
elseif (obj.time < speed*obj.num+timelag) then
-- タイムラグ期間。全体を消しておく。
obj.alpha=0
else
-- 全体表示期間。文字列全体を拡縮して表示する。
obj.ox=obj.ox*strZm
obj.oy=obj.oy*strZm
obj.zoom=strZm
end
4点引き伸ばし
@4点引き伸ばしA
--
-- オブジェクトの4隅の座標の変位量を指定して映像を変形させます。
-- 「4点引き伸ばしA」の後に「4点引き伸ばしB」を適用して下さい。
-- ただし以下に書くように、正しい変形にはなりません。
-- あくまでも現時点では参考程度のスクリプトと考えて下さい。
--
-- ※注意
-- 拡張編集0.89fの時点では、
-- 「テクスチャを変形させてdrawpoly()するとテクスチャがおかしくなる」
-- という仕様上の挙動があるため、おかしな映像になることがあります。
--
--track0:左上X,-1000,1000,0
--track1:左上Y,-1000,1000,0
--track2:右上X,-1000,1000,0
--track3:右上Y,-1000,1000,0
upLx=obj.track0-obj.w/2
upLy=obj.track1-obj.h/2
upRx=obj.track2+obj.w/2
upRy=obj.track3-obj.h/2
@4点引き伸ばしB
--track0:左下X,-1000,1000,0
--track1:左下Y,-1000,1000,0
--track2:右下X,-1000,1000,0
--track3:右下Y,-1000,1000,0
lowLx=obj.track0-obj.w/2
lowLy=obj.track1+obj.h/2
lowRx=obj.track2+obj.w/2
lowRy=obj.track3+obj.h/2
if (upLx==nil) then upLx=0 end
if (upLy==nil) then upLy=0 end
if (upRx==nil) then upRx=0 end
if (upRy==nil) then upRy=0 end
obj.drawpoly(upLx,upLy,0, upRx,upRy,0, lowRx,lowRy,0, lowLx,lowLy,0, 0,0, obj.w,0, obj.w,obj.h, 0,obj.h)
リニアワイプ
@リニアワイプ
--
-- ●斜めクリッピングの使い勝手を変えただけのものです。
-- 斜めクリッピングでリニアワイプを行なう場合、イメージのサイズにあわせて
-- 中心Xと中心Yの値を変える必要がありますが、それが面倒な場合もあるので、
-- NiVEのリニアワイプのように、「角度」と「進行度」でワイプを制御するようにしてみました。
-- 進行度0ではイメージ全体が表示されており、進行度100でイメージが完全に消えます。
-- 「出現ワイプ」にチェックを入れると、逆になります。
-- 要するに、イメージのサイズを気にすることなく、「進行度」という統一概念で
-- 消したり出したりすることができます。
--
--track0:角度,-360,360,0
--track1:進行度(%),0,100,0
--track2:ぼかし,0,1000,0
--check0:出現ワイプ,0
deg,step,cX,cY,bx,by=0,0,0,0,0,0
if (obj.check0) then
deg=math.mod((obj.track0+360),360)
step = obj.track1
else
deg=math.mod((obj.track0+540),360)
step = 100-obj.track1
end
blur = obj.track2
sinD=math.abs(math.sin(math.rad(deg)))
cosD=math.abs(math.cos(math.rad(deg)))
if (sinD==0) then bx=0 else bx=blur/2*sinD end
if (cosD==0) then by=0 else by=blur/2*cosD end
distW=obj.w+bx*2+1
distH=obj.h+by*2+1
if ((0<=deg) and (deg<90)) then
cX=distW/2 - distW/100*step
cY=-distH/2 + distH/100*step
elseif ((90<=deg) and (deg<180)) then
cX=distW/2 - distW/100*step
cY=distH/2 - distH/100*step
elseif ((180<=deg) and (deg<270)) then
cX=-distW/2 + distW/100*step
cY=distH/2 - distH/100*step
elseif ((270<=deg) and (deg<=360)) then
cX=-distW/2 + distW/100*step
cY=-distH/2 + distH/100*step
end
obj.effect("斜めクリッピング", "中心X",cX, "中心Y",cY, "角度",deg, "ぼかし",blur, "幅",0)
TA位置調整で登場
@TA位置調整で登場
--track0:時間[s],-5,5,0.3,0.01
--track1:間隔[s],0,5,0.3,0.01
--track2:登場順,0,5,0,1
--dialog:逆方向/chk,rev=0;加減速[1-5],beki=2;座標,pos={}
obj.effect()
ta=obj.track0
tb=obj.track1
jun=obj.track2
obj.setanchor("pos",obj.num,"line")
if(obj.index==0)then
if(pp==null) then
pp={}
end
end
pp[obj.index+1]={obj.ox,obj.oy}
for i=0,obj.num-1 do
if(jun<1) then
mode=i --順番に登場
elseif(jun<2) then
mode=obj.num-1-i --後ろから登場
elseif(jun<3) then
local indexes = {}
for i=0,obj.num-1 do
indexes[i+1]=i
end
for i=0,obj.num-1 do
local dest = 0
dest=rand(0,obj.num-1, -obj.num,i+1)
local swap = indexes[i+1]
indexes[i+1] = indexes[dest+1]
indexes[dest+1] = swap
end
mode=indexes[i+1] --ランダム順に登場
elseif(jun<4) then
mode=rand(0,100*(obj.num-1),obj.index,0)/100 --ランダム間隔に登場
elseif(jun<5) then
mode=math.abs((obj.num-1)/2-i) --内側から登場
else
mode=(obj.num-1)/2-math.abs((obj.num-1)/2-i) --外側から登場
end
if(ta==0) then
return
elseif(ta<0) then
r=(ta-obj.num*tb-obj.time+obj.totaltime+mode*tb)/ta
else
r=(ta-obj.time+mode*tb)/ta
end
r=math.min(1,math.max(r,0))
r=r^beki
x=pos[i*2+1]-pp[i+1][1]
y=pos[i*2+2]-pp[i+1][2]
if(i==obj.index) then
alp=1
else
alp=0
end
if(rev==1) then
r=1-r
end
obj.draw(x*r,y*r,0,1,alp)
end
重ねがけマスク
@重ねがけマスク
--track0:回転,-3600,3600,0
--track1:サイズ,0,10000,100
--track2:縦横比,-100,100,0
--track3:ぼかし,0,5000,0
--dialog:マスクの種類,tp=1;マスクの反転/chk,chk=0;中心,pos={0,0};
obj.setanchor("pos",1)
obj.setoption("drawtarget", "tempbuffer", obj.getpixel())
obj.draw()
obj.effect("グラデーション","color",0xffffff,"color2",0xffffff,"type",1,"blend",0)
obj.effect("マスク","X",pos[1],"Y",pos[2],"回転",obj.track0,"サイズ",obj.track1,"縦横比",obj.track2,"ぼかし",obj.track3,"マスクの反転",chk,"type",tp)
obj.setoption("blend","alpha_sub")
obj.draw()
obj.load("tempbuffer")
--深度エフェクト(カメラ連動)
@深度エフェクト(カメラ連動)
--track0:距離S,0,34000,0
--track1:距離E,0,34000,500
--track2:A,0,100,50,0.01
--track3:B,0,100,0,0.01
--dialog:エフェクト,effect="ノイズ";パラメタ,p1="'強さ',200*D*(A*0.01)";パラメタ,p2="'変化速度',10";パラメタ,p3="'速度X',10,'速度Y',10";パラメタ,p4="'周期X',10,'周期Y',10";パラメタ,p5="'しきい値',B";パラメタ,p6="'type',3,'mode',0";パラメタ,p7="";パラメタ,p8="";深度変化式,expr_d="D^2.5";手前無効/chk,OPT1=0;半径距離/chk,OPT2=0;
--[[
・(GUIの見た目での)上のレイヤーでカメラ効果『カメラ情報取得』を、カメラに仕掛ける必要があります。
何らかのカメラ効果を仕掛けていれば、わざわざ『カメラ情報取得』を仕掛ける必要は無いかも知れません。
・エフェクトパラメタは、『'パラメタ名', パラメタの値』の形式で記述します。
一つのテキストボックスに複数の名前-値のセットを含むことができます。
値には、トラックバー変数 A, B および、深度変数 D を使用した数式を記述できます。
・トラックバー変数 A, B
トラックバー A, B の値と連動しています。
・深度変数 D
目標点からの距離に応じて、深度変数 D の値が 0.0 ~ 1.0 まで変化します。
距離Sよりも距離が小さければ、深度変数 D の値は 0.0。
距離Eよりも距離が大きければ、深度変数 D の値は 1.0。
深度変化式により、深度変数 D の値の増加具合を設定できます。
・手前無効
目標点よりもカメラ寄りの方向ではエフェクトをかけません。
・半径距離
チェックON 目標点との距離を深度として扱います。
チェックOFF 目標点を含む平面との最短距離を深度として扱います。(カメラの深度ボケはこちらの方式)
・『設定の保存→現在の設定でエイリアスを作成する』を使うと幸せになれると思います。
]]
if(not cam)then
obj.setfont("MS Gothic", 40, 3, 0xffffff, 0x000000)
obj.load("text", "カメラ情報を取得してください")
return
end
local V = {
unit = function(v)
local x=v[1]
local y=v[2]
local z=v[3]
local l = (x*x + y*y + z*z)^0.5
return {x/l, y/l, z/l}
end,
length = function(v)
local x=v[1]
local y=v[2]
local z=v[3] or 0
return (x*x + y*y + z*z)^0.5
end,
mul = function(v, scale)
return {v[1]*scale, v[2]*scale, v[3]*scale}
end,
add = function(lhs, rhs)
return {lhs[1]+rhs[1], lhs[2]+rhs[2], lhs[3]+rhs[3]}
end,
sub = function(lhs, rhs)
return {lhs[1]-rhs[1], lhs[2]-rhs[2], lhs[3]-rhs[3]}
end,
dot = function(lhs, rhs)
local x1=lhs[1]
local y1=lhs[2]
local z1=lhs[3] or 0
local x2=rhs[1]
local y2=rhs[2]
local z2=rhs[3] or 0
return x1*x2 + y1*y2 + z1*z2
end
}
local eye = {cam.tx - cam.x, cam.ty - cam.y, cam.tz - cam.z}
local loc = {obj.x + obj.ox - cam.x, obj.y + obj.oy - cam.y, obj.z + obj.oz - cam.z}
local depth = V.dot(V.unit(eye), loc) - V.length(eye)
if(OPT1 == 1 and depth < 0)then
return
elseif(OPT2 == 1)then
depth = V.length(V.sub(loc, eye))
else
depth = math.abs(depth)
end
local N, F = math.min(obj.track0, obj.track1), math.max(obj.track0, obj.track1)
D = math.min(1, math.max(0, (depth-N)/(F-N)))
A = obj.track2
B = obj.track3
loadstring(string.format("return function() D=%s end", expr_d))()()
loadstring(string.format("return function() p1={%s};p2={%s};p3={%s};p4={%s};p5={%s};p6={%s};p7={%s};p8={%s}; end", p1, p2, p3, p4, p5, p6, p7, p8))()()
local params_i = {p1, p2, p3, p4, p5, p6, p7, p8}
local params_o = {}
for i,v in ipairs(params_i) do
if(type(v) == "table")then
for j,e in ipairs(v) do
params_o[#params_o + 1] = e
end
end
end
obj.effect(effect, unpack(params_o))
--姿勢制御
@姿勢制御
--track0:Z軸回転,-3600,3600,0,0.01
--track1:Y軸回転,-3600,3600,0,0.01
--track2:X軸回転,-3600,3600,0,0.01
local Q = {
qt = function(axis, degree)
local theta = degree*math.pi/180*0.5
local cos = math.cos(theta)
local sin = math.sin(theta)
local x=axis[1]
local y=axis[2]
local z=axis[3] or 0
local l=math.sqrt(x*x + y*y + z*z)
return {x * sin / l, y * sin / l, z * sin / l, cos}
end,
rotate = function(pos, q)
local x=pos[1]
local y=pos[2]
local z=pos[3] or 0
local qx=q[1]
local qy=q[2]
local qz=q[3]
local qr=q[4]
local x_=qr*x+qy*z-qz*y
local y_=qr*y+qz*x-qx*z
local z_=qr*z+qx*y-qy*x
local r_=-qx*x-qy*y-qz*z
return {-r_*qx+qr*x_-y_*qz+z_*qy, -r_*qy+qr*y_-z_*qx+x_*qz, -r_*qz+qr*z_-x_*qy+y_*qx}
end
}
local V = {
unit = function(v)
local x=v[1]
local y=v[2]
local z=v[3]
local l = (x*x + y*y + z*z)^0.5
return {x/l, y/l, z/l}
end,
mul = function(v, scale)
return {v[1]*scale, v[2]*scale, v[3]*scale}
end,
add = function(lhs, rhs)
return {lhs[1]+rhs[1], lhs[2]+rhs[2], lhs[3]+rhs[3]}
end,
dot = function(lhs, rhs)
local x1=lhs[1]
local y1=lhs[2]
local z1=lhs[3] or 0
local x2=rhs[1]
local y2=rhs[2]
local z2=rhs[3] or 0
return x1*x2 + y1*y2 + z1*z2
end,
cross = function(lhs, rhs)
local x1=lhs[1]
local y1=lhs[2]
local z1=lhs[3] or 0
local x2=rhs[1]
local y2=rhs[2]
local z2=rhs[3] or 0
return {y1*z2 - z1*y2, z1*x2 - x1*z2, x1*y2 - y1*x2}
end
}
local M = {
mt = function(rx, ry, rz)
local sinZ = 0
local cosZ = 1
local sinY = 0
local cosY = 1
local sinX = 0
local cosX = 1
if(rz and rz~=0)then
local rz_ = rz * math.pi / 180
sinZ = math.sin(rz_)
cosZ = math.cos(rz_)
end
if(ry and ry~=0)then
local ry_ = ry * math.pi / 180
sinY = math.sin(ry_)
cosY = math.cos(ry_)
end
if(rx and rx~=0)then
local rx_ = rx * math.pi / 180
sinX = math.sin(rx_)
cosX = math.cos(rx_)
end
local sinYsinX=sinY*sinX
local sinYcosX=sinY*cosX
return {cosZ*cosY, -sinZ*cosY, sinY, sinZ*cosX + cosZ*sinYsinX, cosZ*cosX - sinZ*sinYsinX, -cosY*sinX, sinZ*sinX - cosZ*sinYcosX, cosZ*sinX + sinZ*sinYcosX, cosY*cosX}
end,
rotate = function(pos, mat)
local x=pos[1]
local y=pos[2]
local z=pos[3] or 0
return {x*mat[1]+y*mat[2]+z*mat[3], x*mat[4]+y*mat[5]+z*mat[6], x*mat[7]+y*mat[8]+z*mat[9]}
end
}
local rx = obj.rx
local ry = obj.ry
local rz = obj.rz
--現在の軸を求める
local mat = M.mt(rx, ry, rz)
local ax = M.rotate({1, 0, 0}, mat)
local ay = M.rotate({0, 1, 0}, mat)
local az = M.rotate({0, 0, 1}, mat)
local rz = obj.track0
local ry = obj.track1
local rx = obj.track2
local q = Q.qt(az, rz)
ay = Q.rotate(ay, q)
ax = Q.rotate(ax, q)
q = Q.qt(ay, ry)
ax = Q.rotate(ax, q)
az = Q.rotate(az, q)
q = Q.qt(ax, rx)
ay = Q.rotate(ay, q)
az = Q.rotate(az, q)
if(az[2] == 0)then
rx = 0
else
rx = -math.deg(math.atan2(az[2], az[3]))
end
if(rx ~= 0)then
q = Q.qt({1, 0, 0}, -rx)
ay = Q.rotate(ay, q)
az = Q.rotate(az, q)
end
if(az[1] == 0)then
ry = 0
else
ry = math.deg(math.atan2(az[1], az[3]))
end
if(ry ~= 0)then
q = Q.qt({0, 1, 0}, -ry)
ay = Q.rotate(ay, q)
end
if(ay[1] == 0)then
rz = 0
else
rz = -math.deg(math.atan2(ay[1], ay[2]))
end
obj.rz = rz
obj.ry = ry
obj.rx = rx
--角丸クリッピング
@角丸四角形クリッピング
--track0:角サイズ,0,100,50,0.01
--track1:拡大,0,1000,100,0.01
--track2:X,-5000,5000,0
--track3:Y,-5000,5000,0
--dialog:精度,prec=90;プレビュー低精度/chk,output_only=0;ぼかし強さ,blur=2;X倍率,zoom_x=100;Y倍率,zoom_y=100;
--[[
プレビュー低精度がチェックONの場合、動画出力時のみ、高精度で角を削る
]]
local function kezuri(maru, cx, cy, zoom, zoom_x, zoom_y, blur, prec, output_only)
local cos, sin, rad = math.cos, math.sin, math.rad
local effect = obj.effect
local maru, cx, cy, blur, inner_or_outer, prec, zoom, zoom_x, zoom_y = maru or 0, cx or 0, cy or 0, blur or 1, inner_or_outer or 0, prec or 90, zoom or 1, zoom_x or 1, zoom_y or 1
local w, h = obj.getpixel()
w, h = w * zoom * zoom_x * 0.5, h * zoom * zoom_y * 0.5
maru = math.min(w, h) * maru
--外形
effect("斜めクリッピング", "角度", -90, "中心X", cx + w, "中心Y", cy , "ぼかし", blur)
effect("斜めクリッピング", "角度", 0, "中心X", cx , "中心Y", cy + h, "ぼかし", blur)
effect("斜めクリッピング", "角度", 90, "中心X", cx - w, "中心Y", cy , "ぼかし", blur)
effect("斜めクリッピング", "角度", 180, "中心X", cx , "中心Y", cy - h, "ぼかし", blur)
if(maru == 0)then return end
--角丸
local l = 2 * math.pi * maru * 0.25 --角丸の円弧の長さ
local n = math.min(math.floor(prec), math.floor(l)) --刻み回数上限
if(output_only == 1 and not obj.getinfo("saving"))then
n = math.min(math.floor(5), n)
end
local angle_arc_n = 90 / n
for i = 1, math.ceil(n * 0.5) do
local angle = (i - 0.5) * angle_arc_n
local sin_ = maru * sin(rad(angle))
local cos_ = maru * cos(rad(angle))
effect("斜めクリッピング", "角度", -90 + angle, "中心X", cx + (w - maru + cos_), "中心Y", cy + (h - maru + sin_), "ぼかし", blur)
effect("斜めクリッピング", "角度", 0 - angle, "中心X", cx + (w - maru + sin_), "中心Y", cy + (h - maru + cos_), "ぼかし", blur)
effect("斜めクリッピング", "角度", 0 + angle, "中心X", cx - (w - maru + sin_), "中心Y", cy + (h - maru + cos_), "ぼかし", blur)
effect("斜めクリッピング", "角度", 90 - angle, "中心X", cx - (w - maru + cos_), "中心Y", cy + (h - maru + sin_), "ぼかし", blur)
effect("斜めクリッピング", "角度", 90 + angle, "中心X", cx - (w - maru + cos_), "中心Y", cy - (h - maru + sin_), "ぼかし", blur)
effect("斜めクリッピング", "角度", 180 - angle, "中心X", cx - (w - maru + sin_), "中心Y", cy - (h - maru + cos_), "ぼかし", blur)
effect("斜めクリッピング", "角度", 180 + angle, "中心X", cx + (w - maru + sin_), "中心Y", cy - (h - maru + cos_), "ぼかし", blur)
effect("斜めクリッピング", "角度", 270 - angle, "中心X", cx + (w - maru + cos_), "中心Y", cy - (h - maru + sin_), "ぼかし", blur)
end
end
local maru = obj.track0 * 0.01
local zoom = obj.track1 * 0.01
local cx = obj.track2
local cy = obj.track3
kezuri(maru, cx, cy, zoom, zoom_x * 0.01, zoom_y * 0.01, blur, prec, output_only)
@角丸正多角形クリッピング
--track0:頂点数,3,10,4
--track1:角サイズ,0,100,50,0.01
--track2:拡大,0,1000,100,0.01
--track3:回転,-3600,3600,0,0
--dialog:中心,center={0,0};精度,prec=90;プレビュー低精度/chk,output_only=0;ぼかし強さ,blur=2;
--[[
プレビュー低精度がチェックONの場合、動画出力時のみ、高精度で角を削る
]]
local function kezuri(vc, r, inner_or_outer, maru, cx, cy, rotation, blur, prec, output_only)
local cos, sin, rad = math.cos, math.sin, math.rad
local effect = obj.effect
local vc, r, maru, cx, cy, blur, inner_or_outer, rotation, prec = math.max(3, math.floor(vc)), r, maru or 0, cx or 0, cy or 0, blur or 1, inner_or_outer or 0, rotation or 0, prec or 90
local angle0 = 180 * (vc - 2) / vc --頂点の角度
local angle0_half = angle0 * 0.5 + rotation
local angle_arc = 180 - angle0 --角丸の角度
local angle_arc_half = angle_arc * 0.5
local angle_diff = (360 / vc)
local inner_r, outer_r
if(inner_or_outer == 0)then
inner_r = r
outer_r = inner_r / cos(math.rad(angle_diff * 0.5))
else
outer_r = r
inner_r = outer_r * cos(math.rad(angle_diff * 0.5))
end
if(inner_r == 0)then
obj.alpha = 0
return
end
maru = math.min(inner_r * maru, inner_r)
--外形
for i = 1, vc do
local angle1 = angle0_half + angle_diff * (i - 1) --着目している頂点の角度
local angle2 = angle0_half + angle_diff * (i - 2) --着目している頂点の角度
local angle3 = (angle1 + angle2) * 0.5
effect("斜めクリッピング", "角度", angle3 - 90, "中心X", cx + inner_r * cos(rad(angle3)), "中心Y", cy + inner_r * sin(rad(angle3)), "ぼかし", blur)
end
if(maru == 0)then return end
--角丸
local l = 2 * math.pi * maru * ((180 - angle_arc) / 360) --角丸の円弧の長さ
local n = math.min(math.floor(prec), math.floor(l)) --刻み回数上限
if(output_only == 1 and not obj.getinfo("saving"))then
n = math.min(math.floor(5), n)
end
local angle_arc_n = angle_arc / n
for i = 1, vc do
local angle1 = angle0_half + angle_diff * (i - 1) --着目している頂点の角度
local cx2 = cx + outer_r * (1 - maru / inner_r) * cos(rad(angle1))
local cy2 = cy + outer_r * (1 - maru / inner_r) * sin(rad(angle1))
for j = 1, n do
local angle2 = angle1 - angle_arc_half + (j - 0.5) * angle_arc_n
effect("斜めクリッピング", "角度", angle2 - 90, "中心X", cx2 + maru * cos(rad(angle2)), "中心Y", cy2 + maru * sin(rad(angle2)), "ぼかし", blur)
end
end
end
obj.setanchor("center", 1, "line")
local vc = math.floor(obj.track0)
local maru = obj.track1 * 0.01
local zoom = obj.track2 * 0.01
local rotation = obj.track3
local w, h = obj.getpixel()
local outer_r = math.min(w, h) * 0.5
kezuri(vc, outer_r * zoom, 1, maru, center[1], center[2], rotation, blur, prec, output_only)
--落ちて弾む
@登場_落ちて弾む
--track0:時間[ms],-5000,5000,2000
--track1:間隔[ms],-5000,5000,300
--track2:高さ,-1000,1000,300
--track3:回数,1,20,2,1
--dialog:乱数シード,seed=2525;ランダム順/chk,shuffle=0;フェード/chk,fade=0;ゆらゆら/chk,smooth=0;時間を揃える/chk,adjust=0;回転,rz=360;減衰率補正,att=0.5;フェード率補正,ft=0.5;基準角度,angle0=-90;
--[[
減衰率補正・フェード補正:
0.0 ~ 1.5 くらいの範囲で適当にいじってください
ゆらゆら:
マイナス側で切り返さずにゆらゆらするかどうかを選択します
時間を揃える:
効果終了時間が揃います
回転:
じゃまなら 0 にしてください
基準角度:
0 にすると横に動きます
]]
local sin, cos, rad, abs, floor, ceil, pow, max, min, sqrt = math.sin, math.cos, math.rad, math.abs, math.floor, math.ceil, math.pow, math.max, math.min, math.sqrt
local entry = (obj.track0 >= 0)
local tm = abs(obj.track0 * 0.001)
local asc = (obj.track1 >= 0)
local diff = abs(obj.track1 * 0.001)
local index, num = obj.index, obj.num
--tm = tm - diff * (num - 1)
local seq = {}
for i = 1, num do
seq[i] = i - 1
end
if(not asc)then
for i = 1, floor(#seq / 2) do
local j = #seq - (i - 1)
seq[i], seq[j] = seq[j], seq[i]
end
end
if(shuffle == 1)then
for i = 1, #seq do
local j = obj.rand(1, #seq, -seed, i)
seq[i], seq[j] = seq[j], seq[i]
end
end
if(adjust == 1)then
tm = tm + diff * ((num - 1) - seq[index + 1])
end
local t = (obj.time - diff * seq[index + 1]) / tm
if(not entry)then
t = 1 - (obj.time - (obj.totaltime - tm - diff * seq[index + 1])) / tm
end
t = max(0, min(1, t))
if(t < 1)then
local uniq = obj.rand(0, 10000, seed, index) * 0.0001
local distance = obj.track2 * (1 + 0.3 * uniq)
local rz = rz * (1 - 0.3 * uniq)
if(uniq > 0.5)then
rz = -rz
end
local times = math.max(1, floor(obj.track3)) * 2
local angle = times * 90
local n = floor((angle * t / 90 + 1) / 2)
local att = pow(att, n)
local dir = 1
if(smooth == 1 and n % 2 == 1)then
dir = -1
end
distance = distance * att * abs(cos(rad(angle * (1 - t)))) * (1 - t) * dir
obj.ox = obj.ox + distance * cos(rad(angle0))
obj.oy = obj.oy + distance * sin(rad(angle0))
local k = min(1, t * (1 + t))
obj.rz = obj.rz + rz * (1 - k) * att
if(fade == 1)then
obj.alpha = obj.alpha * min(1, angle * t / 90 * ft)
end
end
--泡
@泡 - ゆらぎオプション
--track0:幅,-1000,1000,100,0.01
--track1:早さ,0,1000,10,0.01
--track2:モード,0,1,0,1
--[[
幅:泡サイズに対する割合で、ゆらぎ幅を指定します
早さ:振動の早さです
使い方:
早さを適当に調整する。(固定でいいと思う)
幅を、時間経過により広げるように動かすといい感じ・・・・かも。
その他:
スクリプトを改良してくれる方がいたら、お願いします!としか言えねえッス。
]]
--[[
勝手に微改造 by 禿げガル
モード:
0→オリジナルと同じ動き
1→移動距離が増えると振動が早くなる
その他:
自分好みの動きにしただけです
--]]
g_amplitude_scale = obj.track0 * 0.01
g_omega = obj.track1
g_mode = obj.track2
@泡
--track0:進捗率,0,100,0,0.01
--track1:泡数,0,5000,1000,1
--track2:拡散,-100,20000,100,0.01
--track3:乱数,-20000,20000,0,1
--dialog:図形,figure={"figure","円",0xffffff,25,25};初期拡大範囲,zoom_rng0={20,100};目標拡大範囲,zoom_spd_rng={-200,-100};最小描画サイズ,minimum_size=5.0;透明度範囲,alpha_rng={0,0};目標透過範囲,alpha_spd_rng={0,0};移動方向,D=-90;目標移動範囲[px],spd_rng={30,300};加減速指数[±],P=1.0;元画像表示進捗率,show_limit=0.00;解像度,S=1/8;中心,C={0,0};
--[[
進捗率:
進捗率に応じて、移動や拡大、透過などが適用される
元画像を表示する進捗の上限は、元画像表示進捗率で変更可能
泡数:
透明ピクセルも含めた数なので実際に表示される泡数とは異なる
これを減少させるように移動させると泡ごとのライフタイムを変動させられる
目標拡大範囲や目標透過範囲を調整することでもライフタイムの変動が可能
拡散:
0 以上では、ランダムに泡がバラける。反復移動にするとゆらぎを表現できる
0 未満では、アンカーで指定した中心に向けて収縮する。ただし、進行方向に対して90度方向のみ
プラスとマイナスでは、変動量が違うので、0 をまたぐのは NO GOOD
乱数:
乱数シードを指定する
マイナスの値の場合は、レイヤーを変えても、乱数値が変化しない
図形:
{"figure",図形名,色,サイズ,ライン幅} の順で指定する
※色は無視される
実は図形以外にも読み込めるものがある・・・
ex.
{"image","c:/test.bmp"}
{"text","あ"} --フォントは指定できないが、直近に使用したフォント・サイズが使われる
{"tempbuffer"}
詳細は lua.txt 107行目あたりを参照
〇〇範囲:
泡ごとに、範囲の中からランダムに数値が選択される
移動と拡大あたりが重点調整項目か?
最小描画サイズ:
小さい泡を表示しても汚いので・・・
加減速指数:
進捗率を指数関数で変化させる数値
-1 未満:減速
-1 ~ 1:よくわからん
1 :等速
1 超:加速
]]
obj.setanchor("C", 1, "line")
local cx, cy = C[1], C[2]
local zoom0 = obj.getvalue("zoom") * 0.01
local alpha0 = obj.getvalue("alpha")
if(zoom0 == 0 or alpha0 == 0 or obj.alpha == 0)then
return
end
local t = obj.track0 * 0.01
local num = math.floor(obj.track1)
local sigma = obj.track2 * 0.01
local seed = math.floor(obj.track3)
local show_limit = show_limit * 0.01
if(t <= 0)then
if(t > show_limit)then
obj.alpha = 0
end
return
end
if(t > 0 and t < 1)then
if(P >= 0)then
t = math.pow(t, P)
else
t = 1 - math.pow(1 - t, P * -1)
end
end
if(num == 0)then
if(t > show_limit)then
obj.alpha = 0
end
return
end
--サンプリング
local function get_sample(sampling_rate)
if(sampling_rate == 0)then
return {}
end
local getpixel = obj.getpixel
local pixel = {}
local w, h = getpixel()
local cx, cy = w * 0.5, h * 0.5
local col, a
local step = math.max(1 / sampling_rate, 1)
local step_half = step * 0.5
for y = step_half, h - 1, step do
for x = step_half, w - 1, step do
pixel[#pixel + 1] = {x - cx, y - cy, getpixel(x, y, "col")}
end
end
return pixel
end
local pixel = get_sample(S)
if(#pixel == 0)then
obj.alpha = 0
return
end
--出力用図形をロード
if(t <= show_limit)then
obj.draw()
end
local properties = {ox = 0, oy = 0, oz = 0, zoom = 1, alpha = 0}
for k in pairs(properties) do
properties[k] = obj[k]
end
obj.load(unpack(figure))
obj.effect()
for k in pairs(properties) do
obj[k] = properties[k]
end
--描画
local function min_and_max(range, scale)
local scale = scale or 1
return math.min(unpack(range)) * scale, math.max(unpack(range)) * scale
end
local zoom_min, zoom_max = min_and_max(zoom_rng0, 0.01 * 1000)
local zoom_spd_min, zoom_spd_max = min_and_max(zoom_spd_rng, 0.01 * 1000)
local spd_min, spd_max = min_and_max(spd_rng, 1000)
local alpha_min, alpha_max = min_and_max(alpha_rng, 0.01 * 1000)
alpha_min, alpha_max = 1000 - alpha_min, 1000 - alpha_max
local alpha_spd_min, alpha_spd_max = min_and_max(alpha_spd_rng, 0.01 * 1000)
alpha_spd_min, alpha_spd_max = 1000 - alpha_spd_min, 1000 - alpha_spd_max
local pos_diff = 0
if(#pixel >= 2)then
pos_diff = math.abs((pixel[2][1] - pixel[1][1]) * sigma)
end
local pos_diff_div1000 = pos_diff * 0.001
local cos_direction = math.cos(math.rad(D))
local sin_direction = math.sin(math.rad(D))
local cos_direction_normal = math.cos(math.rad(D + 90))
local sin_direction_normal = math.sin(math.rad(D + 90))
local cos_minus_direction = math.cos(math.rad(-D))
local sin_minus_direction = math.sin(math.rad(-D))
local w, h = obj.w, obj.h
local bw, bh = obj.getpixel()
local zoom_x, zoom_y = w / bw, h / bh
local base_w_half = bw * zoom0 * 0.5
local base_h_half = bh * zoom0 * 0.5
local limit_zoom_min = minimum_size / (math.min(bw, bh) * zoom_max * 0.001)
local pixel_num = #pixel
local seed = seed
local max, min, sqrt, sin = math.max, math.min, math.sqrt, math.sin
local rand, effect, drawpoly = obj.rand, obj.effect, obj.drawpoly
local x, y, color, alpha
local prev_color
local frame, zoom, distance, vx, vy, w2, h2
local speed, theta0, zoom0, scale0
local amplitude_scale = g_amplitude_scale or 0
local omega = g_omega or 0
local mode = g_mode or 0
g_amplitude_scale, g_omega,g_mode = nil, nil,nil
for i = 1, num do
x, y, color, alpha = unpack(pixel[rand(1, pixel_num, seed, i)])
if(alpha ~= 0)then
frame = i * 1000
zoom0 = rand(zoom_min, zoom_max, seed, frame + 1)
zoom = max(0, zoom0 * (1000 + rand(zoom_spd_min, zoom_spd_max, seed, frame + 2) * t) * 0.000001)
if(zoom ~=0 and zoom > limit_zoom_min)then
alpha = min(1, alpha * rand(alpha_min, alpha_max, seed, frame + 11) * (1000 + rand(alpha_spd_min, alpha_spd_max, seed, frame + 12) * t) * 0.000001)
if(alpha > 0)then
w2 = base_w_half * zoom
h2 = base_h_half * zoom
speed = rand(spd_min, spd_max, seed, frame + 23)
distance = speed * t * 0.001
if(mode == 1)then
omega = distance / 10
end
--amplitude -> 現在のゆらぎ
--半径 * amplitude_scale -> ゆらぎ幅
--theta0 -> ゆらぎ位相の個体差
--omega -> 角速度
theta0 = rand(0, 360, seed, frame + 30)
scale0 = zoom0 / (zoom_max) --サイズに比例させるための係数(かなりいいかげんな値)
amplitude = (amplitude_scale * sqrt(w2 * w2 + h2 * h2) * scale0) * sin(theta0 + omega * t)
x = x + pos_diff_div1000 * rand(-1000, 1000, seed, frame + 21) + distance * cos_direction + amplitude * cos_direction_normal
y = y + pos_diff_div1000 * rand(-1000, 1000, seed, frame + 22) + distance * sin_direction + amplitude * sin_direction_normal
if(sigma < 0)then
vx = (x - cx) * cos_minus_direction - (y - cy) * sin_minus_direction
vy = (x - cx) * sin_minus_direction + (y - cy) * cos_minus_direction
vy = vy * (1 + sigma)
x = vx * cos_direction - vy * sin_direction + cx
y = vx * sin_direction + vy * cos_direction + cy
end
if(prev_color ~= color)then
prev_color = color
effect("グラデーション", "color", color, "color2", color)
end
x = x * zoom_x
y = y * zoom_y
drawpoly(x - w2, y - h2, 0, x + w2, y - h2, 0, x + w2, y + h2, 0, x - w2, y + h2, 0, 0, 0, w, 0, w, h, 0, h, alpha)
end
end
end
end
obj.setoption("draw_state", true)
--ウェーブ登場
#highlight(lua){
@ウェーブ登場
時間: 秒数。正の数なら登場、負の数なら退場。
間隔: 秒数。横に波が伝播する時間差みたいなもの。
登場順[0-5/0-2]: {登場順, オプション}
加減速[0-3/exp]: {タイプ, べき乗数}
グラフ表示:
振[1-12/freq]: {タイプ, 振動回数}
開始時非表示:
有効ZOOM範囲:
不透明度:
local duration=obj.track0
local interval=obj.track1
local zoom=obj.track2*0.01
local aspect=obj.track3*0.01
local alpha=(alpha or 100)*0.01
local zoom_range=zoom_range or {0,10000}
zoom_range[1]=math.min(zoom_range[1],zoom_range[2])*0.01
zoom_range[2]=math.max(zoom_range[1],zoom_range[2])*0.01
obj.setanchor("pos",1,"xyz")
if(duration==0)then return end
local MC={}
MC.SET=function(t,properties)
MC.outofrange=function(t,hide)
MC.T1=function(duration,interval,order,order_option,seed) --入退場レート計算
MC.T2=function(t,mover,exp)
MC.T3=function(t,harmonic,frequency)
MC.T4CHECK=function(harmonic,frequency,extend_duration)
MC.T4=function(t,mover,exp,harmonic,frequency,extend_duration,duration)
MC.MIN_TIME=0.01
MC.T5=function(duration,interval,order,order_option,seed,mover,exp,harmonic,frequency,extend_duration,t1)
MC.CENTER=function()
MC.T=function(params)
MC.LINE=function(x1,y1,x2,y2,color,width,zoom)
local base_time=(duration > 0) and MC.MIN_TIME or -MC.MIN_TIME
local harmonic={harmonic_[1],ma
- track0:時間,-60,60,3,0.01
- track1:間隔,0,60,0.05,0.01
- track2:拡大率,0,10000,100,0.01
- track3:縦横比,-100,100,0,0.01
- dialog:登場順[0-5/0-2],order={0, 0};グラフ表示/chk,graph=0;加減速[1-3/exp],mover={1, 0.0};振[1-12/freq],harmonic_={-1, 5.0};乱数シード,seed=0;フェード/chk,fade=0;一箇所から登場/chk,join=0;開始時非表示/chk,hide0=1;XYZ座標,pos={0, 0, 0};XYZ軸回転,rotation={0, 0, 0};不透明度,alpha=100;有効ZOOM範囲,zoom_range={0, 10000}
- [[
時間: 秒数。正の数なら登場、負の数なら退場。
間隔: 秒数。横に波が伝播する時間差みたいなもの。
登場順[0-5/0-2]: {登場順, オプション}
登場順: 0: 前から, 1: 後ろから, 2: ランダム順, 3: ランダム間隔, 4: 中から, 5: 外から オプション: 0: 通常, 1: 開始時間が揃う, 2: 終了時間が揃う
加減速[0-3/exp]: {タイプ, べき乗数}
サインカーブを減衰させます。 グラフの、青のラインが減衰曲線です。 正の奇数タイプに合わせた描画になります。
タイプ: 1: 加速, 2: 減速, 3: 加減速 べき乗数: 小数点数や負数も指定可能です。特に0以上1未満の小数点数は有用
グラフ表示:
横軸は時間、縦軸は効果適用割合を示し、上から 100%, 0%, -100% です。
振[1-12/freq]: {タイプ, 振動回数}
タイプ: 1 から 12 および -1 から -12 の24タイプから振動タイプを選択する
1: サインカーブ, 4: ジャンプ, 7: ジクザグ, 10: デジタル 上記数値に+1したものは減衰の仕方がやや異なる 上記数値に+2したものは減衰とともに波長が変化する ※加減速のべき乗数が 0.0 だと、グラフは変化しません
負数タイプは正数タイプを振動ごとにマイナス側に反転したもの タイプは無駄に多いですがゴミみたいなのが多いです。
振動回数: サインカーブの180度分を1振動としてカウントします。 小数点数が指定できます。 負数の場合、プラスマイナスが反転します。
開始時非表示:
初期状態を非表示とするかどうかを選択します。 アニメ効果をレイヤーオブジェクトとして配置し、アニメ効果適用対象オブジェクトのライフタイムの途中からウェーブを発動させるためのパラメタです。
有効ZOOM範囲:
ZOOMが範囲外になった場合は描画を行いません。
不透明度:
0にするとフェードONとほぼ同じになります。 フェードでは適用率がマイナスになった場合は、完全に不透明。こちらは絶対値で扱います。]]
local duration=obj.track0
local interval=obj.track1
local zoom=obj.track2*0.01
local aspect=obj.track3*0.01
local alpha=(alpha or 100)*0.01
local zoom_range=zoom_range or {0,10000}
zoom_range[1]=math.min(zoom_range[1],zoom_range[2])*0.01
zoom_range[2]=math.max(zoom_range[1],zoom_range[2])*0.01
obj.setanchor("pos",1,"xyz")
if(duration==0)then return end
local MC={}
MC.SET=function(t,properties)
- {ox=0,oy=0,oz=0,zoom=1,aspect=0,alpha=1,rx=0,ry=0,rz=0,cx=0,cy=0,cz=0,fade=0,join=0}
if(t==0 or not properties)then return end
if(properties.join and properties.join~=0)then obj.ox=obj.ox*(1-t) obj.oy=obj.oy*(1-t) obj.oz=obj.oz*(1-t) end
for k,v in pairs(properties) do if(k=="zoom")then if(v~=1)then v=math.max(0.0001,v) local t=t if(t < 0)then v=1/v t=-t end
if(v >= 1)then obj.zoom=obj.zoom*((v-1)*t+1) else v=1/v obj.zoom=obj.zoom/((v-1)*t+1) end end elseif(k=="aspect")then if(v~=0)then local zoom_x=math.min(1,1-obj.aspect)*math.min(1,1-v*t) local zoom_y=math.min(1,1+obj.aspect)*math.min(1,1+v*t) obj.zoom=obj.zoom*math.max(zoom_x,zoom_y) if(math.min(zoom_x,zoom_y)==0)then obj.aspect=(zoom_x==0) and 1 or -1 else obj.aspect=((zoom_x/zoom_y <= 1) and (1-zoom_x/zoom_y)) or (zoom_y/zoom_x-1) end end elseif(k=="alpha")then if(v~=1)then obj.alpha=obj.alpha*((1-t)+v*t) end elseif(k=="fade")then if(v and v~=0)then obj.alpha=obj.alpha*(1-t) end elseif(k=="join")then --do nothing else if(v~=0)then obj[k]=obj[k]+v*t end end endend
MC.outofrange=function(t,hide)
local hide=hide or 1 if(t <= 0)then return true elseif(t >= 1)then if(hide and hide~=0)then obj.alpha=0 end return true end return falseend
MC.T1=function(duration,interval,order,order_option,seed) --入退場レート計算
local order_option=order_option or 0 local seed=seed or obj.layer local num,index=obj.num,obj.index
if(order==1)then --逆順 index=(num-1)-index elseif(order==2)then --ランダム順 local tmp={} for i=1,num do tmp[i]=i-1 end for i=1,num do local j=rand(1,num,-math.abs(seed),i) tmp[i],tmp[j]=tmp[j],tmp[i] end index=tmp[index+1] elseif(order==4)then --内側から local c=(num-1)*0.5 index=math.floor(math.abs(index-c)) elseif(order==5)then --外側から local c=(num-1)*0.5 index=c-math.abs(index-c) end
if(duration < 0)then index=(num-1)-index end
local delay=interval*index if(order==3)then --ランダム間隔 delay=interval*(num-1)*rand(0,100,seed,index)*0.01 end
local time=obj.time if(duration < 0)then time=obj.totaltime-time end --退場 local duration=math.abs(duration)
if(order_option==1)then duration=duration+delay delay=0 elseif(order_option==2)then duration=duration+interval*(num-1)-delay end
return 1-(time-delay)/durationend
MC.T2=function(t,mover,exp)
local t=t if(mover==1)then --加速 t=math.pow(t,exp) elseif(mover==2)then --減速 t=1-math.pow(1-t,exp) elseif(mover==3)then --加減速 if(t < 0.5)then t=math.pow(t*2,exp)*0.5 else t=1-math.pow((1-t)*2,exp)*0.5 end end return tend
MC.T3=function(t,harmonic,frequency)
local t=t if(harmonic==1)then --単振動(反発) t=math.abs(math.sin(math.pi*(frequency)*t)) elseif(harmonic==2)then --単振動 t=(math.cos(-math.pi+math.pi*(2*frequency)*t)+1)*0.5 elseif(harmonic==3)then --単振動(ジグザグ) t=(2*frequency)*t local n=math.floor(t) t=t-n if(n%2==1)then t=1-t end elseif(harmonic==4)then --単振動(デジタル) t=math.sin(math.pi*(2*frequency)*t) if(t < 0)then t=0 else t=1 end end return tend
MC.T4CHECK=function(harmonic,frequency,extend_duration)
local harmonic=math.abs(harmonic) if(harmonic < 1 or 12 < harmonic or frequency==0 or extend_duration <= 0)then return false else return true endend
MC.T4=function(t,mover,exp,harmonic,frequency,extend_duration,duration)
local minus_option=(harmonic < 0) local harmonic=math.abs(harmonic) local mode=(harmonic-1)%3 harmonic=math.floor((harmonic-1)/3)+1
local extend_duration=extend_duration or 0 if(not MC.T4CHECK(harmonic,frequency,extend_duration))then return nil end
if(t >= 1)then return nil elseif(t >= 0)then return MC.T3(t,harmonic,0.5) end --t は負数となっているはず
local t=1-math.abs((t)*duration)/extend_duration if(t <= 0 or 1 <= t)then return nil end
if(mode == 0)then local current_section=math.floor(frequency*t)+1 -- 1,2,3,4,5,6,... local scale=MC.T2(t,mover,exp) if(minus_option and current_section%2~=math.floor(frequency+1)%2)then scale=-scale end t=MC.T3(t,harmonic,frequency)*scale return t elseif(mode == 1)then local current_section=math.floor(frequency*t)+1 local scale=MC.T2((current_section-0.5)/frequency,mover,exp) if(minus_option and current_section%2~=math.floor(frequency+1)%2)then scale=-scale end t=MC.T3(t,harmonic,frequency)*scale return t else local scales={} local total_scale=0 local aaa=(1/frequency)*0.5 for i=1,math.ceil(frequency) do local t2=(i-0.5)/frequency t2=(t2+aaa)/(1+aaa) scales[i]=MC.T2(t2,mover,exp) total_scale=total_scale+scales[i] end
local tt={} tt[0]=0 --dummy
local current_section t=t*frequency/math.ceil(frequency) for i=1,#scales do tt[i]=scales[i]/total_scale+tt[i-1] if(not current_section and tt[i] >= t)then current_section=i end end
if(not current_section)then return nil end
local default_section_t=1/frequency local section_t=(t-tt[current_section-1])/(tt[current_section]-tt[current_section-1]) t=default_section_t*section_t+default_section_t*(current_section-1)
local scale=scales[current_section] if(minus_option and current_section%2~=math.floor(frequency+1)%2)then scale=-scale end return MC.T3(t,harmonic,frequency)*scale endend
MC.MIN_TIME=0.01
MC.T5=function(duration,interval,order,order_option,seed,mover,exp,harmonic,frequency,extend_duration,t1)
local WAIT,PROC,FIN=1,0.5,0 local sign=frequency>0 and 1 or -1 local frequency=math.abs(frequency) local t1=t1 or MC.T1(duration,interval,order,order_option,seed) if(t1 >= 1 or (duration == MC.MIN_TIME and t1 >= 0))then return t1,WAIT end
if(not MC.T4CHECK(harmonic,frequency,extend_duration))then if(t1 < 0)then return FIN,FIN else return MC.T2(t1,mover,exp)*sign,t1 end end
local t4=MC.T4(t1,mover,exp,harmonic,frequency,extend_duration,duration) if(t4)then return t4*sign,PROC else return FIN,FIN endend
MC.CENTER=function()
obj.ox=-obj.x obj.oy=-obj.y obj.oz=-obj.z obj.rx=0 obj.ry=0 obj.rz=0 obj.cx=0 obj.cy=0 obj.cz=0end
MC.T=function(params)
local params=params or {duration=0,interval=0,order={0,0},harmonic={0,0.5,2},mover={0,1},seed=obj.layer,graph=0,obj=nil}
local duration=params.duration or obj.totaltime local interval=params.interval or 0 local order,order_option=unpack(params.order or {0,0}) local harmonic,extend_duration,frequency=unpack(params.harmonic or {0,0.5,2}) local mover,exp=unpack(params.mover or {0,1}) local seed=params.seed or obj.layer local graph=params.graph or 0 local rand=obj.rand
- local obj=params.obj or obj --たらい回し計画未対応
seed=(seed==0) and obj.layer or seed
if(duration==0)then return 0,0 end
if(graph==0)then return MC.T5(duration,interval,order,order_option,seed,mover,exp,harmonic,frequency,extend_duration) else if(obj.index==0)then local zoom=obj.getvalue("zoom")*0.01 zoom=1 obj.setoption("dst","tmp",obj.screen_w,obj.screen_h)
local direction=1 if(duration < 0)then direction=-1 end
local left,right,top,bottom=-225*zoom,225*zoom,-150*zoom,150*zoom
obj.load("figure","四角形",0x000000,2000) obj.draw(0,0,0,1/zoom,0.4)
local scale_x=150*zoom local scale_y=-150*zoom
for i=1,5 do MC.LINE(left+scale_x*i*0.5,top,left+scale_x*i*0.5,bottom,0x888888,1) end MC.LINE(left,0,right,0,0x888888,1) MC.LINE(left,top,right,top,0x888888,2) MC.LINE(left,bottom,right,bottom,0x888888,2) MC.LINE(left,top,left,bottom,0x888888,2) MC.LINE(right,top,right,bottom,0x888888,2)
local halfstep=math.abs(duration)*obj.framerate local totalstep=halfstep if(not MC.T4CHECK(harmonic,frequency,extend_duration))then extend_duration=0 else local substep=extend_duration*obj.framerate totalstep=totalstep+substep
obj.load("figure","四角形",0x0000ff,1) local prec=10 for i=0,substep*prec do local t=1-i/substep/prec
local x=(1-t)*scale_x*extend_duration+left+scale_x*math.abs(duration) local y=MC.T2(t,mover,exp)*scale_y
obj.draw(x*direction,y) end end
local prec=10 for i=0,totalstep*prec do local t if(i==0)then t=MC.T1(duration,interval,order,order_option,seed) else t=1-i/halfstep/prec end
local x=(1-t)*scale_x*math.abs(duration)+left local y=MC.T5(duration,interval,order,order_option,seed,mover,exp,harmonic,frequency,extend_duration,t) if(y)then y=y*scale_y
if(i==0)then obj.load("figure","四角形",0x00ff00,10) else if(i%prec==0)then obj.load("figure","四角形",0xffffff,4) else obj.load("figure","四角形",0xffffff,1) end end
obj.draw(x*direction,y) end end
obj.load("tempbuffer") MC.CENTER() obj.setoption("dst","frm") obj.draw(0,0,0,100/obj.getvalue("zoom")) end obj.alpha=0 return 0,0 endend
MC.LINE=function(x1,y1,x2,y2,color,width,zoom)
local color=color or 0xffffff local width=width or 1 local zoom=zoom or 1 local x1,y1,x2,y2=x1*zoom,y1*zoom,x2*zoom,y2*zoom local dx=(x2-x1) local dy=(y2-y1) local l=math.sqrt(dx*dx+dy*dy) local p={{0,0},{l,0},{l,width},{0,width}} local angle=math.atan2(dy,dx)
function rotate(pos,rz) return {pos[1]*math.cos(rz)-pos[2]*math.sin(rz),pos[1]*math.sin(rz)+pos[2]*math.cos(rz)} end
p[1]=rotate(p[1],angle) p[2]=rotate(p[2],angle) p[3]=rotate(p[3],angle) p[4]=rotate(p[4],angle)
obj.load("figure","四角形",color,2) obj.drawpoly(p[1][1]+x1,p[1][2]+y1,0,p[2][1]+x1,p[2][2]+y1,0,p[3][1]+x1,p[3][2]+y1,0,p[4][1]+x1,p[4][2]+y1,0)end
local base_time=(duration > 0) and MC.MIN_TIME or -MC.MIN_TIME
local harmonic={harmonic_[1],ma
- 最終更新:2012-04-02 00:18:45
メニュー
公開スクリプト
- スクリプト紹介
- 公開スクリプト
- その他
スクリプト講座
- 基本講座
- 関数
- 構文
- その他
C言語とLuaの連携
- DLLの活用
外部リンク
このメニューを編集する
最近の更新
2023/06/12
2020/08/27
2020/05/17
2020/04/29
2014/05/07
2013/12/08
2013/08/23
2013/01/29
2013/01/08
2012/11/26
2012/10/22
2012/10/19
2012/10/18
2012/10/17