アニメーション効果2
公開スクリプトの追加方法は、追加方法・留意点の項目を参照して下さい。
また、スクリプトを公開される方は、必ず同ページのスクリプト記載ルールをご確認ください。
※テキストファイルがある場合は、拡張子を「.anm」に変更して使用して下さい。
名称 | 製作者 | 説明 | 出典/最終更新 | txt |
---|---|---|---|---|
スクリプト名 | 製作者 | スクリプトの説明 | スクリプトの出典および最終更新 | |
サーモグラフィー風色変換 | こどこど (とらまた) |
フレームバッファにチェックを入れると矩形領域のフレームバッファに色変換を適用します。 改良案あればご自由に。 2012/02/14 性能改善。RGB4色グラデーション機能搭載。 ↑ありがとうございます。できればお名前を!同日:コメント追加。 |
2012/02/13投稿 | |
余震付き登場 | ゆうき | 『起き上がって登場』と同系統のスクリプト。”起きる”時間と”振動する”時間を別指定にしたため、”振動する”に関しての微調整がしやすいかも。中身は、ウェーブ登場とだいたい一緒。(”起きる”時間が0であるものがウェーブ登場)。詳細は、スクリプト中に記述。ただし、文字数の制限もあるため、ウェーブ登場と同じ項目の説明は割愛した。 | 2012/02/13投稿 | |
パネルワイプ | ゆうき | 画像を縦横に分割して、パネル単位で画像が出現する。出現順は、トランジションファイルまたは、Lua配列形式で指定する。出現アクションは、透過・回転・ズーム・移動など。 | 2012/02/17投稿 | |
まあるくなあれ | ゆうき | 古いブラウン管TVとか魚眼レンズ的なアレ。(キツイ歪みは出せません)『球体(カメラ制御)』や『球体分解+歪曲(カメラ)』と同じような効果。 2012/02/22 つなぎ目隠しが少しうまくできるようなった。 2012/04/01 拡張アニメ効果で中心を動かせるようにした |
2012/02/19投稿 2012/04/01更新 |
|
ボールド&イタリック | ゆうき | テキストを、縦横方向に太くしたり(1pxづつずらして描画)、傾けたり。 | 2012/04/01投稿 | |
基本図形2 | ゆうき | 個別オブジェクトを基本図形化する。線幅は、外径-内径の差として指定する。元画像サイズ・元画像色は、『オブジェクト分割』と一緒に使用することを想定。加算値は、内径と外径に加算する数値。 | 2012/04/08投稿 20:00変更 |
|
色指定でキーイングセット | 金の髭 | YCbCr形式で色や輝度を指定するフィルタ効果 (クロマキー、カラーキー、ルミナンスキー、 特定色域変換)を、通常の色ダイアログを使う方式で 呼び出して利用します。 クロマキーとカラーキーはあまり意味がないですが ルミナンスキーと特定色域変換は 直接色指定ができることでほんの少しだけ 使いやすくなるかも。 RGB⇔YCbCr(YC48)の変換関数を含んでいます。 anmファイルダウンロード |
2012/6/27投稿 拡張編集スレPart6のレス426への対応のつもり |
|
マス数指定モザイク.zip | ユウ | 縦と横のマス数を指定してモザイクをかけます 端数切り捨てのせいか、マス数によっては端が半透明になったり、オブジェクトサイズが変わったりします |
2012/09/16投稿 | |
複数マスク.zip | ユウ | 一度に複数個のマスクを指定します 中間点の数+1がマスクの数になります 『X』と『Y』には何らかの移動方法を指定してください 『回転』と『サイズ』にも移動方法を指定することで 個別に設定できるようになります 『縦横比』や『ぼかし』を設定したい場合は 『複数マスク(補助)』を事前にかけてください |
2012/10/14修正 | |
中間点で左右反転.zip | ユウ | 中間点を打った位置で画像を左右反転させます。 拡張編集 ver 0.90e2 で動作 |
2013/01/08投稿 |
サーモグラフィー風色変換
@サーモグラフィー風色変換
--track0:基準明度,-1000,1000,0
--track1:変化幅,-1000,1000,255
--track2:最大色数,1,256,256,1
--dialog:original/chk,original=0;HSVを使う/chk,hsv=1;色(暗)/col,col1=0x0000ff;色(やや暗)/col,col2=nil;色(やや明)/col,col3=nil;色(明)/col,col4=0xff0000;透明度を無視する/chk,no_alpha=0;
--check0:フレームバッファ,0
--[[
original:
ONの場合、初版作成者の作成したバージョンで動作します
HSVを使う:
ONの場合:
明度に応じ、レインボーグラデーションする
OFFの場合:
明度に応じ、指定色(2色~4色)をつかい線形グラデーションする
基準明度:
基準(= 0)となる明度値。
明度値は、0から100までの範囲になります。
次の計算式で、明度が変換されます。
明度=(明度+基準輝度)% 100
※%は剰余算を表す
変換後の明度も0から100までの範囲になります。
変化幅:
説明できません><
↑変換後の色相の変化幅です。
サーモグラフィーは基本的に赤~青まで(マゼンダがない)っぽいので設定しました。
おそらく最大色数ともろかぶりしてるので挙動が変になります。 by こどこど
]]
local s=os.clock()
if(original == 1)then
--改変前のオリジナルバージョンです
zoom = obj.getvalue("zoom") * obj.zoom / 100
if obj.check0 then
-- フレームバッファから読み取り適用
obj.pixeloption("get", "frm")
y_head = obj.y+obj.screen_h/2-obj.h/2
x_head = obj.x+obj.screen_w/2-obj.w/2
if zoom >= 1 then
for y = 0, obj.h do
for x = 0, obj.w do
color, alpha = obj.getpixel(x_head+x, y_head+y, "col")
colorH, colorS, colorV = HSV(color)
color = HSV((colorV+obj.track0)%100/100*obj.track1, 100, 100)
obj.putpixel(x / zoom, y / zoom, color, 1)
end
end
else
y_foot = obj.h / zoom
x_foot = obj.w / zoom
for y = 0, y_foot do
for x = 0, x_foot do
color, alpha = obj.getpixel(x_head+x*zoom, y_head+y*zoom, "col")
colorH, colorS, colorV = HSV(color)
color = HSV((colorV+obj.track0)%100/100*obj.track1, 100, 100)
obj.putpixel(x, y, color, 1)
end
end
end
else
-- 現在のオブジェクトのみに適用
y_foot = obj.h / zoom
x_foot = obj.w / zoom
for y = 0, y_foot do
for x = 0, x_foot do
color, alpha = obj.getpixel(x, y, "col")
colorH, colorS, colorV = HSV(color)
color = HSV((colorV+obj.track0)%100/100*obj.track1, 100, 100)
obj.putpixel(x, y, color, 1)
end
end
end
else
--改造Ver. 好きなように再改造して下さい
local zoom = obj.getvalue("zoom") * obj.zoom * 0.01
--高速化対応S
--グローバル関数・変数・ワーク変数を、ローカル化する
--浮動小数点演算の計算量を減らす(特に割り算)
local floor = math.floor
local getpixel = obj.getpixel
local putpixel = obj.putpixel
local pixeloption = obj.pixeloption
local track0 = obj.track0
local track1 = obj.track1
local num_colors = floor(obj.track2)
local no_alpha = (no_alpha == 1)
local w, h = obj.w, obj.h
local HSV = HSV
local _1_div_100_mul_track1 = 0.01 * track1
local _1_div_zoom = 1 / zoom
local color, alpha, colorH, colorS, colorV
local x_head, y_head, x_foot, y_foot
local Y, cb, cr, a
--高速化対応E
--明度-色の変換テーブルを作成S
local v_to_color = {}
local num_colors = math.min(400, num_colors)
local value_scale = num_colors / 100
local _1_div_value_scale = 1 / value_scale
if(hsv == 1)then
for v_mul_value_scale = 0, 100 * value_scale do
v_to_color[v_mul_value_scale] = HSV((v_mul_value_scale * _1_div_value_scale + track0) % 100 * _1_div_100_mul_track1, 100, 100)
end
else
local colors = {}
local tmp = {col1, col2, col3, col4}
for i = 1, 4 do
if(tmp[i])then
colors[#colors + 1] = {RGB(tmp[i])}
end
end
if(#colors == 0)then colors[1] = {RGB(0x000000)} end
if(#colors == 1)then colors[2] = {RGB(0xffffff)} end
local function L(v0, v1, t)
return v0 * (1 - t) + v1 * t
end
local num_K = #colors - 1
colors[#colors + 1] = colors[#colors] --dummy
for v_mul_value_scale = 0, 100 * value_scale do
local tt = (v_mul_value_scale * _1_div_value_scale + track0) % 100 * _1_div_100_mul_track1 % 255 / 255 * num_K -- 0 .. num_K
local K = floor(tt) --区間 0 .. num_K
local t = tt - K --区間内レート 0 .. 1
v_to_color[v_mul_value_scale] = RGB(L(colors[K+1][1], colors[K+2][1], t), L(colors[K+1][2], colors[K+2][2], t), L(colors[K+1][3], colors[K+2][3], t))
end
end
--明度-色の変換テーブルを作成E
if obj.check0 and no_alpha then
-- フレームバッファから読み取り適用(アルファ無視)
pixeloption("get", "frm")
y_head = obj.y+obj.screen_h/2-h/2
x_head = obj.x+obj.screen_w/2-w/2
if zoom >= 1 then
for y = 0, h do
for x = 0, w do
color, alpha = getpixel(x_head + x, y_head + y, "col")
colorH, colorS, colorV = HSV(color)
color = v_to_color[floor(colorV * value_scale)]
putpixel(x * _1_div_zoom, y * _1_div_zoom, color, 1)
end
end
else
y_foot = h * _1_div_zoom
x_foot = w * _1_div_zoom
for y = 0, y_foot do
for x = 0, x_foot do
color, alpha = getpixel(x_head + x * zoom, y_head + y * zoom, "col")
colorH, colorS, colorV = HSV(color)
color = v_to_color[floor(colorV * value_scale)]
putpixel(x, y, color, 1)
end
end
end
elseif obj.check0 then
-- フレームバッファから読み取り適用(アルファ無視しない)
-- 書き直したいけど難しいので、仕様がよくわからないので・・・
-- ↑すいません結局アルファ使用してません。 by こどこど
y_head = obj.y+obj.screen_h/2-h/2
x_head = obj.x+obj.screen_w/2-w/2
if zoom >= 1 then
for y = 0, h do
for x = 0, w do
color, alpha = getpixel(x * _1_div_zoom, y * _1_div_zoom, "col")
if(alpha~=0)then
pixeloption("get", "frm")
color = getpixel(x_head + x, y_head + y, "col")
colorH, colorS, colorV = HSV(color)
color = v_to_color[floor(colorV * value_scale)]
putpixel(x * _1_div_zoom, y * _1_div_zoom, color, 1)
pixeloption("get", "obj")
end
end
end
else
y_foot = h * _1_div_zoom
x_foot = w * _1_div_zoom
for y = 0, y_foot do
for x = 0, x_foot do
color, alpha = getpixel(x, y, "col")
if(alpha~=0)then
pixeloption("get", "frm")
color = getpixel(x_head + x * zoom, y_head + y * zoom, "col")
colorH, colorS, colorV = HSV(color)
color = v_to_color[floor(colorV * value_scale)]
putpixel(x, y, color, 1)
pixeloption("get", "obj")
end
end
end
end
else
-- 現在のオブジェクトのみに適用
y_foot = h * _1_div_zoom
x_foot = w * _1_div_zoom
for y = 0, y_foot do
for x = 0, x_foot do
color, alpha = getpixel(x, y, "col") --YCbCr を使ったほうが効率が良さそうだが、仕様がよくわからないので・・・
if(no_alpha)then
alpha = 1
end
if(alpha ~= 0)then
colorH, colorS, colorV = HSV(color)
color = v_to_color[floor(colorV * value_scale)]
putpixel(x, y, color, alpha)
end
end
end
end
end
local e=os.clock()
--debug_print(e-s)
--余震付き登場
@余震付き登場
--track0:時間,-5,5,0.5,0.01
--track1:間隔,0,2,0.2,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={2, 0.25};振[1-12|sec|freq],harmonic={2, 0.5, 2};乱数シード,seed=0;フェード/chk,fade=0;一箇所から登場/chk,join=0;XYZ座標,pos={0, 0, 0};XYZ軸回転,rotation={0, 0, 0};不透明度,alpha=100;有効ZOOM範囲,zoom_range={0, 10000}
--[[
ウェーブ登場とほぼ一緒です。
異なる点のみ説明します。
はじめに:
アニメーション継続時間は、(本震+余震)の合計時間になります。
本震は、サインカーブで言うと、最初の90度分です。
本震と余震を別扱いすることにより、『起き上がって登場』と比較して、余震の度合いの微調整がしやすい気がします。
時間:
秒数。
ここでは、本震の時間を指定します。
振[0-12/sec/freq]: harmonic={振動タイプ, 継続時間, 振動回数}
振動タイプ:1から12 および -1から-12までの24タイプあります
継続時間:秒数
振動回数:正の整数値が有効です
詳細は、ウェーブ登場を参照のこと。
]]
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
end
end
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 false
end
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)/duration
end
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 t
end
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 t
end
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
end
end
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
end
end
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
end
end
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=0
end
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
end
end
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
harmonic[3]=math.floor(math.abs(harmonic[3]))
local t,t_=MC.T({duration=duration,interval=interval,order=order,harmonic=harmonic,mover=mover,seed=seed,graph=graph})
if(MC.outofrange(t_))then return end
MC.SET(t,{ox=pos[1],oy=pos[2],oz=pos[3],zoom=zoom,aspect=aspect,rx=rotation[1],ry=rotation[2],rz=rotation[3],fade=fade,join=join})
MC.SET(math.abs(t),{alpha=alpha})
obj.alpha=math.max(0,math.min(1,obj.alpha))
if(obj.zoom~=math.max(zoom_range[1],math.min(zoom_range[2],obj.zoom)))then
obj.zoom=0
end
--パネルワイプ
@パネルワイプ順序指定+9x9分割プリセット
--track0:プリセットNO,1,7,1,1
--dialog:カスタム順序,pannel_order={1,2,3,4,5,6,7,8,9,16,17,18,19,20,21,22,23,10,15,28,29,30,31,32,33,24,11,14,27,36,37,38,39,34,25,12,13,26,35,40,41,40,35,26,13,12,25,34,39,38,37,36,27,14,11,24,33,32,31,30,29,28,15,10,23,22,21,20,19,18,17,16,9,8,7,6,5,4,3,2,1};プリセットを使う/chk,preset=1;
--[[
このアニメ効果はオプションである。
幾何学形状のトランジションファイルを作るのは大変なので、簡単に順序指定ができるものを作ってみた。
【カスタム順序】は、【プリセットを使う】がOFFの場合に有効になる。
以下、順序定義の仕様を解説する。
順序指定方法:
3:4分割の場合の例を示す。
1 | 2 | 3 | 4
--+---+---+--
5 | 6 | 7 | 8
--+---+---+--
9 |10 |11 |12
数字はピース毎の登場番号である。
この場合、1段目の左端から右端に向けて順に登場する。
右端へたどり着いた所で、2段目の左端から右端に・・・
これを、次の形式に変換する。
{1,2,3,4,5,6,7,8,9,10,11,12}
1段目の左上から順に、カンマ区切りで、登場順番号を並べ、{} で括る。
複数のピースを同時に登場させることもできる。
その場合は番号を重複させればよい。
1 | 2 | 3 | 4
--+---+---+--
5 | 6 | 6 | 5
--+---+---+--
4 | 3 | 2 | 1
{1,2,3,4,5,6,6,5,4,3,2,1}
数字は、連番である必要はない。
大小関係のみが影響する。
アニメ効果のパラメタには文字数制限がある。
文字数制限にかかる場合は、スクリプト制御で次のように指定すれば良い。
pannel_order = {1,2,3,4,5,6,6,5,4,3,2,1}
アニメーション効果の追加順序
1.トランジションファイルを使う場合
パネルワイプを単体で追加する
2.順序を指定する場合
次のいずれか
パネルワイプ順序指定、直後にパネルワイプ
スクリプト制御、直後にパネルワイプ
★パネルワイプの設定で、XY分割数はこの定義に合わせる必要がある。
なお、デフォルト値は9:9分割での渦巻き状ワイプとなっており、
プリセットNO. 1 と同一のものである。
]]
if(preset == 1)then
local id = math.floor(obj.track0)
pannel_order = ({
{1,2,3,4,5,6,7,8,9,16,17,18,19,20,21,22,23,10,15,28,29,30,31,32,33,24,11,14,27,36,37,38,39,34,25,12,13,26,35,40,41,40,35,26,13,12,25,34,39,38,37,36,27,14,11,24,33,32,31,30,29,28,15,10,23,22,21,20,19,18,17,16,9,8,7,6,5,4,3,2,1},
{1,2,3,4,5,6,7,8,1,8,9,10,11,12,13,14,9,2,7,14,15,16,17,18,15,10,3,6,13,18,19,20,19,16,11,4,5,12,17,20,21,20,17,12,5,4,11,16,19,20,19,18,13,6,3,10,15,18,17,16,15,14,7,2,9,14,13,12,11,10,9,8,1,8,7,6,5,4,3,2,1},
{5,5,5,5,5,5,5,5,5,5,4,4,4,4,4,4,4,5,5,4,3,3,3,3,3,4,5,5,4,3,2,2,2,3,4,5,5,4,3,2,1,2,3,4,5,5,4,3,2,2,2,3,4,5,5,4,3,3,3,3,3,4,5,5,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5},
{1,2,3,4,5,6,7,8,9,9,8,7,6,5,4,3,2,1,1,2,3,4,5,6,7,8,9,9,8,7,6,5,4,3,2,1,1,2,3,4,5,6,7,8,9,9,8,7,6,5,4,3,2,1,1,2,3,4,5,6,7,8,9,9,8,7,6,5,4,3,2,1,1,2,3,4,5,6,7,8,9},
{1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1},
{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,1,2,3,4,5,6,7,8,9},
{5,6,7,8,9,10,11,12,13,4,5,6,7,8,9,10,11,12,3,4,5,6,7,8,9,10,11,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,2,3,4,5,6,7,8,9,10,3,4,5,6,7,8,9,10,11,4,5,6,7,8,9,10,11,12,5,6,7,8,9,10,11,12,13},
})[id]
end
@パネルワイプ
--track0:進捗[%],0,100,0,0.01
--track1:間隔[%],0,200,10,0.01
--track2:Xスケール,0,10000,100,0.01
--track3:Yスケール,0,10000,100,0.01
--dialog:トランジションファイル,FN="transition/左下から右上へ.png";反転フラグ[0|1],REV={0, 0, 0, 0};XY分割数,DIV={9, 9};幅・高さ補正[%],LAP={102, 102};全加速[0-3/exp],AM={1, 1.0};個加速[0-3/exp],M={1, 1.0};一箇所から登場/chk,J=0;XYZ座標,POS={0, 0, 0};XY座標ZOOM[%],PZOOM={100, 100};XYZ回転,ROT={0, 0, 0};不透明度[%],AL=100;中心XY[%],C={50, 50};
--check0:100%時非表示,1
--[[
トランジションファイル:
画像ファイルを指定する。
パスは、絶対パス・相対パスが使える。
パス中の は / に置き換えること。
ファイルはどのようなファイルでもいいが、輝度チャネルのみが参照される。
グレースケール画像ならば、黒いほうから白い方に向けて、分割したピースが出現していく。
反転フラグ:{順序反転, 上下反転, 左右反転, 行・列反転}
右→左と、左→右を別々に定義するの嫌でしょ?という機能
なお、行・列反転をONにすると、XY分割数も反転する
幅・高さ補正:
分割したピースの端っこを、他のピースの端っこと、被らせる割合
全加速:{タイプ, べき乗数}
全体の加減速
個加速:{タイプ, べき乗数}
個別ピースの出現アクションの加速度
タイプ:
1:加速, 2:減速, 3:加減速
べき乗数:
小数点数使用可能
0.5 とかも結構面白い
中心XY:
個別ピースのZOOM/回転の中心
0% なら、左はじ
100% なら、右はじ
参考:
XYZ回転: {0, 90, 0}
中心XY: {0, 50}
100%時非表示: OFF
幅・高さ補正: {200, 100}
進捗率:100% -> 0%
間隔:適当に調整
これでドミノ風のトランジションになる(カメラ必須)
回転の代わりにXスケールを使うのもいいと思う
]]
--XY間隔[%],MGN={0, 0} --パラメタ数が足りない
local MGN={0, 0}
obj.setanchor("POS", 1, "xyz")
obj.effect()
local appear = (obj.track0 < obj.getvalue(0, obj.time - 1 / obj.framerate)) --true:入場|false:退場
local t = 1 - obj.track0 * 0.01
if(AM[1] == 1)then --加速
t = math.pow(t, AM[2])
elseif(AM[1] == 2)then --減速
t = 1 - math.pow(1 - t, AM[2])
elseif(AM[1] == 3)then --加減速
if(t < 0.5)then
t = math.pow(t * 2, AM[2]) * 0.5
else
t = 1 - math.pow((1 - t) * 2, AM[2]) * 0.5
end
end
if(t == 1 and MGN[1] == 0 and MGN[2] == 0)then
pannel_order = nil
return
end
--よく使う関数・自作関数S
local floor, max, min, pow = math.floor, math.max, math.min, math.pow
local cos, sin, rad = math.cos, math.sin, math.rad
local drawpoly = obj.drawpoly
local getpixel = obj.getpixel
local matrix = function(rx, ry, rz)
local sinZ, cosZ, sinY, cosY, sinX, cosX = 0, 1, 0, 1, 0, 1
if(rz ~= 0)then local rz = rad(rz); sinZ = sin(rz); cosZ = cos(rz) end
if(ry ~= 0)then local ry = rad(ry); sinY = sin(ry); cosY = cos(ry) end
if(rx ~= 0)then local rx = rad(rx); sinX = sin(rx); cosX = cos(rx) end
local sinYsinX, sinYcosX = sinY * sinX, sinY * cosX
if(rx == 0 and ry == 0 and rz == 0)then
return {1, 0, 0, 0, 1, 0, 0, 0, 1}
elseif(rz == 0)then
return {cosY, 0, sinY, sinYsinX, cosX, -cosY * sinX, -sinYcosX, sinX, cosY * cosX}
else
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
end
local rotate = function(pos, mat)
local x, y, z = pos[1] or 0, pos[2] or 0, pos[3] or 0
if(z == 0)then
return {x * mat[1] + y * mat[2], x * mat[4] + y * mat[5], x * mat[7] + y * mat[8]}
else
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
end
local mat, old_rx, old_ry, old_rz = matrix(0, 0, 0), 0, 0, 0 --行列リマインダー
local function draw_pieace(u, v, uw, vh, x, y, z, w, h, rx, ry, rz, cx, cy, cz, alpha)
--uv座標系左上座標、幅、高さ
--スクリーン座標系左上座標、幅、高さ
--回転角
--回転の中心
local p1 = {x - cx, y - cy, z - cz}
local p2 = {p1[1] + w, p1[2] , p1[3]}
local p3 = {p1[1] + w, p1[2] + h, p1[3]}
local p4 = {p1[1] , p1[2] + h, p1[3]}
local u1, v1 = u, v
local u2, v2 = u1 + uw, v1
local u3, v3 = u1 + uw, v1 + vh
local u4, v4 = u1 , v1 + vh
if(rx ~= old_rx or ry ~= old_ry or rz ~= old_rz)then mat = matrix(rx, ry, rz) end
p1 = rotate(p1, mat)
p2 = rotate(p2, mat)
p3 = rotate(p3, mat)
p4 = rotate(p4, mat)
drawpoly(p1[1] + cx, p1[2] + cy, p1[3] + cz, p2[1] + cx, p2[2] + cy, p2[3] + cz, p3[1] + cx, p3[2] + cy, p3[3] + cz, p4[1] + cx, p4[2] + cy, p4[3] + cz, u1, v1, u2, v2, u3, v3, u4, v4, alpha)
end
local exp = M[2] --個別ピースの加速度
local mover = M[1]
local function T2(t)
local t = t
if(mover == 1)then --加速
t = pow(t, exp)
elseif(mover == 2)then --減速
t = 1 - pow(1 - t, exp)
elseif(mover == 3)then --加減速
if(t < 0.5)then
t = pow(t * 2, exp) * 0.5
else
t = 1 - pow((1 - t) * 2, exp) * 0.5
end
end
return t
end
--よく使う関数・自作関数E
--グローバル変数のクリアとローカル化S
local pannel_order_ = pannel_order or {}
pannel_order = nil
local pannel_order = pannel_order_
--グローバル変数のクリアとローカル化E
--輝度テーブル作成S
local div_x, div_y = unpack(DIV)
if(#pannel_order == 0)then
obj.copybuffer("tmp", "obj")
local prop = {ox=0, oy=0, oz=0, cx=0, cy=0, cz=0, rx=0, ry=0, rz=0, zoom=1, alpha=1, aspect=0}
for k, v in pairs(prop) do
prop[k] = obj[k]
end
obj.load("image", FN)
local w, h = getpixel()
w, h = w / div_x, h / div_y --ピースの幅
local sx, margin_shift_y = w * 0.5, h * 0.5 --ピースの中心へのオフセット
local x, y, luminance = 0, 0, 0
for row = 1, div_y do
y = (row - 1) * h + margin_shift_y
for col = 1, div_x do
x = (col - 1) * w + sx
luminance = getpixel(x, y, "yc") --4096段階の輝度(精度不明、色調補正による上限オーバーもある)
luminance = min(luminance, 4096)
pannel_order[#pannel_order + 1] = luminance
end
end
obj.copybuffer("obj", "tmp")
for k, v in pairs(prop) do
obj[k] = v
end
end
--輝度テーブル作成E
if(div_x * div_y ~= #pannel_order)then
obj.setfont("MS Gothic", 25, 3, 0xffffff, 0x000000)
obj.load("text", "順序指定と分割数が一致しません")
return
end
--輝度順ソートとテーブルの再構成S
--[[
各ピースの輝度から、処理順序テーブルを作成
輝度値:{3,2,1,1,2,3} → ピース番号:{{3,4},{2,5},{1,6}}
]]
local rev = (REV[1] ~= 0)
local ud = (REV[2] ~= 0)
local lr = (REV[3] ~= 0)
local sw = (REV[4] ~= 0)
local tmp = {}
pannel_order, tmp = tmp, pannel_order
local id, id2
for row = 1, div_y do
for col = 1, div_x do
id = (row - 1) * div_x + col
if(lr)then
col = div_x - (col - 1) --左右反転
end
if(ud)then
row = div_y - (row - 1) --上下反転
end
if(sw)then
id2 = (col - 1) * div_y + row
else
id2 = (row - 1) * div_x + col
end
tmp[id] = {id2, tmp[id]}
end
end
if(sw)then
div_x, div_y = div_y, div_x
end
if(rev)then
table.sort(tmp, function(lhs, rhs) return lhs[2] > rhs[2] end) --降順
else
table.sort(tmp, function(lhs, rhs) return lhs[2] < rhs[2] end) --昇順
end
local luminance = nil
local team
for i = 1, #tmp do
if(luminance ~= tmp[i][2])then
luminance = tmp[i][2]
pannel_order[#pannel_order + 1] = {}
end
team = pannel_order[#pannel_order]
team[#team + 1] = tmp[i][1]
end
--輝度順ソートとテーブルの再構成E
--
if(apear)then -- t:0 -> 1
t = math.pow(t, 1)
else -- t:1 -> 0
t = 1 - math.pow(1 - t, 1)
end
local t0 = 1 / (#pannel_order) --一つのピースが倒れる所要時間
local interval = t0 * obj.track1 * 0.01 --次のピースが倒れ始める時間
local tmp = t0 + interval * (#pannel_order - 1) --総時間が1になるように再計算
t0 = t0 / tmp
interval = interval / tmp
local zoom_x = obj.track2 * 0.01
local zoom_y = obj.track3 * 0.01
local alpha = AL * 0.01
local rx, ry, rz = unpack(ROT)
local pct_overlap_x, pct_overlap_y = LAP[1] - 100, LAP[2] - 100 --ピースの重なり割合
if(div_x == 1)then pct_overlap_x = 0 end
if(div_y == 1)then pct_overlap_y = 0 end
local w0, h0 = obj.w / div_x, obj.h / div_y --ピースの縦横サイズ(重なりなし)
local w = w0 * (1 + pct_overlap_x * 0.01) --ピースの縦横サイズ(重なりあり)
local h = h0 * (1 + pct_overlap_y * 0.01) --ピースの縦横サイズ(重なりあり)
local w_calib, h_calib = 0, 0 --はみ出し補正
if(div_x ~= 1)then w_calib = (w - w0) / (div_x - 1) end
if(div_y ~= 1)then h_calib = (h - h0) / (div_y - 1) end
local x0, y0 = -obj.w * 0.5, -obj.h * 0.5 --スクリーン座標系での画像の左上
local pct_cx, pct_cy = unpack(C)
local cx_rate, cy_rate = pct_cx * 0.01, pct_cy * 0.01 --左端が0%、右端が100%
local center_shift_x, center_shift_y = w * cx_rate, h * cy_rate --ピース中心のシフト量
local margin_x, margin_y = w * MGN[1] * 0.01, h * MGN[2] * 0.01 --ピースの間隔
local mid_col, mid_row = (div_x - 1) * 0.5 + 1, (div_y - 1) * 0.5 + 1 --行方向、列方向の中心ピースの番号
local hide0 = obj.check0
local join = (J == 1)
local id_max = div_x * div_y
local cell, row, col = 0, 0, 0
local id, tt = 1, 1
local u, v = 0, 0
local x, y, z = 0, 0, 0
local xx, yy, zz = unpack(POS)
local xx__, yy__, zz__ = 0, 0, 0
local rx__, ry__, rz__ = 0, 0, 0
local zoom_x__, zoom_y__ = 1, 1
local p_zoom_x, p_zoom_y = unpack(PZOOM)
p_zoom_x, p_zoom_y = p_zoom_x * 0.01, p_zoom_y * 0.01
local p_zoom_x__, p_zoom_y__ = 1, 1
local alpha__ = 1
local w__, h__ = w, h
local margin_shift_x, margin_shift_y, margin_shift_z = 0, 0, 0 --間隔によるシフト
local zoom_shift_x, zoom_shift_y = 0, 0 --ZOOMによるシフト
for i = 1, #pannel_order do
tt = max(0, min(1, (t - (i - 1) * interval) / t0))
if(apear)then
tt = 1 - T2(tt)
else
tt = T2(1 - tt)
end
if((0 <= tt and tt < 1) or (not hide0 and tt == 1))then
cell = pannel_order[i]
if(type(cell) ~= "table")then
cell = {cell}
end
for j = 1, #cell do
id = cell[j] --左上からの通番
if(1 <= id and id <= id_max)then
row = floor((id - 1) / div_x) + 1 --行番号
col = (id - 1) % div_x + 1 --列番号
u = (col - 1) * (w0 - w_calib) --ピースの左上座標(ビットマップ系
v = (row - 1) * (h0 - h_calib)
if(margin_x ~= 0)then margin_shift_x = (col - mid_col) * margin_x end
if(margin_y ~= 0)then margin_shift_y = (row - mid_row) * margin_y end
x = u + x0 + margin_shift_x --ピースの左上座標(スクリーン座標系
y = v + y0 + margin_shift_y
if(join)then
x = (x + center_shift_x) * (1 - tt) - center_shift_x
y = (y + center_shift_y) * (1 - tt) - center_shift_y
end
if(p_zoom_x ~= 1)then
p_zoom_x__ = p_zoom_x * tt + (1 - tt)
x = (x + center_shift_x) * p_zoom_x__ - center_shift_x
end
if(p_zoom_y ~= 1)then
p_zoom_y__ = p_zoom_y * tt + (1 - tt)
y = (y + center_shift_y) * p_zoom_y__ - center_shift_y
end
if(zoom_x ~= 1)then
zoom_x__ = zoom_x * tt + (1 - tt)
w__ = w * zoom_x__
zoom_shift_x = (1 - zoom_x__) * w * (cx_rate)
end
if(zoom_y ~= 1)then
zoom_y__ = zoom_y * tt + (1 - tt)
h__ = h * zoom_y__
zoom_shift_y = (1 - zoom_y__) * h * (cy_rate)
end
if(rx ~= 0)then rx__ = rx * tt end
if(ry ~= 0)then ry__ = ry * tt end
if(rz ~= 0)then rz__ = rz * tt end
if(xx ~= 0)then xx__ = xx * tt end
if(yy ~= 0)then yy__ = yy * tt end
if(zz ~= 0)then zz__ = zz * tt end
if(alpha ~= 1)then alpha__ = alpha * tt + (1 - tt) end
draw_pieace(
u, v, w, h,
xx__ + x + zoom_shift_x,
yy__ + y + zoom_shift_y,
zz__,
w__, h__,
rx__, ry__, rz__,
xx__ + x + center_shift_x,
yy__ + y + center_shift_y,
zz__,
alpha__)
end
end
end
end
obj.setoption("draw_state", true)
--まあるくなあれ
@まあるくなあれ-中心オプション
--track0:X,-10000,10000,0
--track1:Y,-100-0,10000,0
obj.setanchor("track", 0, "line")
circulize_cx = obj.track0
circulize_cy = obj.track1
@まあるくなあれ
--track0:半径[%],0,1000,100,0.01
--track1:奥行き[%],-1000,1000,100,0.01
--track2:ZOOM[%],0,1000,70,0.01
--track3:領域[%],0,1000,110,0.01
--dialog:精度[2-],prec=20;中心XY,pos={0, 0};ブレンドタイプ,blend_type="alpha_add";つなぎ目補正[px],adj=0.0;視野角,perse_angle=0;3D描画(カメラ制御)/chk,_3d=0;
--check0:元画像表示,0
--[[
画像を球面(半球体)に貼り付けることにより、魚眼レンズ(あるいは古いブラウン管TV)のように歪ませる。
画像の歪みは奥行きにより増幅できる。
デフォルトの球の半径はスクリーン幅の1.5倍。
半径を大きくすれば歪みが減り、小さくすれば歪みが増す。
球面は、表半球のみ使用する。
画像を縦横にスケーリングしないため、球の直径からはみ出す部分はカットされる。
足りない部分は描画されない。
まとめると、
半径で画像をクリッピングし、奥行きで画像を歪める。
サイズはZOOMで調整する。
画像が途切れる場合は、領域を調整する。
※このスクリプトの実装方式ではキツイ歪みは出せません。
キツイ歪みが欲しい場合は↓をご利用下さい。
http://www.nicovideo.jp/watch/sm17037834
計算方法を真似しようとも思いましたが、一長一短あるようなので独自方式のままにしました。
精度:
球の滑らかさ
2以上
中心XY:
画像の中心
!!以下のパラメタは、基本的にはイジる必要なし!!
ブレンドタイプ:
詳細はlua.txt参照
つなぎ目補正:
ブレンドタイプが alpha_add の場合は無効
負の値も可
視野角:
3D描画OFFの場合に有効
カメラの視野角と同じ
0度から180度まで(0度の場合はスクリーン高に応じて変動。15度前後?)
大きくすると歪みが増す(魚眼らしくなる)
3D描画:
描画結果が気に入らない場合に
]]
local s = os.clock()
obj.setanchor("pos", 1, "arm")
if(obj.check0)then
return
end
if(circulize_cx and circulize_cy)then
pos = {circulize_cx, circulize_cy}
circulize_cx, circulize_cy = nil, nil
end
local floor, ceil, max, min, pow, abs = math.floor, math.ceil, math.max, math.min, math.pow, math.abs
local cos, sin, rad = math.cos, math.sin, math.rad
local drawpoly = obj.drawpoly
local getpixel = obj.getpixel
local w0, h0 = obj.getpixel()
local div = max(2, floor(prec)) --分割数
local r = obj.screen_w * 0.5 * obj.track0 * 0.01 * 3 --半径(矩形領域サイズの半分)
r = max(r, 0)
if(r == 0)then
obj.zoom = 0
return
end
local perse_angle = perse_angle or 0
local distortion_scale = obj.track1 * 0.01
local zoom = obj.track2 * 0.01
if(zoom < 1)then
obj.zoom = obj.zoom * zoom --縮小は zoom のが綺麗になる
zoom = 1
end
local rotateXY = (function(distortion_scale, zoom, z0, perse_angle, _3d)
local sin, cos, tan, atan, atan2, rad, deg, min, max, abs, sqrt, pow = math.sin, math.cos, math.tan, math.atan, math.atan2, math.rad, math.deg, math.min, math.max, math.abs, math.sqrt, math.pow
local d = 1024
local default_perse_angle = deg(atan(obj.screen_h * 0.5 / d)) * 2
local perse_angle = perse_angle or 0
perse_angle = min(180-0.01, max(0, perse_angle))
if(perse_angle == 0)then
perse_angle = default_perse_angle
end
local F = obj.screen_h * 0.5 / tan(rad(perse_angle * 0.5)) --デフォルト角だと1024になる・・・
local distortion_scale = distortion_scale
local F_mul_zoom = F * zoom
local _3d = (_3d == 1)
local near_clip = -F * 0.8
return function(z, rx, ry)
local x, y, z = 0, 0, z
local sinX, cosX, sinY, cosY = 0, 1, 0, 1
if(rx and rx~=0)then
local rx_ = rad(rx)
sinX = sin(rx_)
cosX = cos(rx_)
end
if(ry and ry~=0)then
local ry_ = rad(ry)
sinY = sin(ry_)
cosY = cos(ry_)
end
local x__, y__, z__
y__ = -z * sinX; z__ = z * cosX; y = y__; z = z__; --X
z__ = z * cosY; x__ = z * sinY; x = x__; z = z__; --Y
x__, y__, z__ = x, y, (z + z0) * distortion_scale
if(_3d)then
return x__ * zoom, y__ * zoom, z__ * zoom
end
-- if(z__ <= -F)then z__ = -F + 1 end
if(z__ <= near_clip)then z__ = near_clip + 1 end --aviutl のニアクリップの手前で打ち止めする
return F_mul_zoom * x__ / (z__ + F), F_mul_zoom * y__ / (z__ + F), z__ -- 本当は z は 0 だが、z バッファするために
end
end)(distortion_scale, zoom, r, perse_angle, _3d)
--後ろ側への回りこみを防止するために、必要最小限の描画角度を調べる
local function search_max_angle(r)
--rx = 90 .. prec(≒0) で y が最大になる rx を調べる
local prec = 0.001 --精度(刻み角度
local rx_min = 0
local rx_max = 90
local rx_mid
local function relation_check(rx, prec)
local tmp, y1 = rotateXY(-r, rx, 0)
local tmp, y2 = rotateXY(-r, rx - prec, 0)
return (y1 >= y2) --0..rx の間が膨らまない場合は true
end
if(relation_check(rx_max, prec))then
return rx_max -- 0 .. rx_max 間に膨らみなし
end
max, abs = math.max, math.abs
while(true)do
rx_mid = (rx_min + rx_max) * 0.5
if(relation_check(rx_mid, prec))then
rx_min = rx_mid -- rx_mid .. rx_max 間に膨らみあり
else
rx_max = rx_mid -- rx_min .. rx_mid 間に膨らみあり
end
if(rx_min >= rx_max or abs(rx_max - rx_min) <= prec)then
return max(rx_min, rx_max)
end
end
end
--本処理
local cx = pos[1] + w0 * 0.5
local cy = pos[2] + h0 * 0.5
local draw_angle = search_max_angle(r) * 2
local r_scale1 = max(0, min(180, draw_angle)) / 180
local r_scale2 = 1
if(_3d == 1)then
r_scale1 = 1
r_scale2 = 1
end
local u0 = min(w0, max(0, cx - r * r_scale1)) --画像の非クリッピング領域の左端
local v0 = min(h0, max(0, cy - r * r_scale1)) --画像の非クリッピング領域の上端
local u0e = min(w0, max(0, cx + r * r_scale1)) --画像の非クリッピング領域の右端
local v0e = min(h0, max(0, cy + r * r_scale1)) --画像の非クリッピング領域の下端
local w = (u0e - u0) --画像の非クリッピング領域のサイズ
local h = (v0e - v0) --画像の非クリッピング領域のサイズ
w = w / div --画像の非クリッピング領域の分割サイズ
h = h / div --画像の非クリッピング領域の分割サイズ
local angle_max = 90
local rx0 = (cy - v0) / r * -angle_max * r_scale2 --X回転角開始位相
local ry0 = (cx - u0) / r * angle_max * r_scale2 --Y回転角開始位相
local rx0e = (v0e - cy) / r * angle_max * r_scale2 --X回転角終了位相
local ry0e = (u0e - cx) / r * -angle_max * r_scale2 --Y回転角終了位相
local drx = (rx0e - rx0) / div --緯度、経度の刻み
local dry = (ry0e - ry0) / div --緯度、経度の刻み
local zbuffer = {}
drawpoly = function(...)
zbuffer[#zbuffer + 1] = {...}
end
if(_3d ~= 1)then
local scale = obj.track3 * 0.01
obj.setoption("dst", "tmp", w0 * scale, h0 * scale)
end
local adj = adj or 1
if(not blend_type or blend_type == "")then
blend_type = "alpha_add"
end
if(blend_type == "alpha_add" and _3d ~= 1)then
adj = 0
end
obj.setoption("blend", blend_type)
local x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4
local u1, v1, u2, v2
local rx, ry
local loops = math.ceil(div * 0.5)
local fast = true
if(pos[1] ~= 0 or pos[2] ~= 0)then
loops = div
fast = false
end
for row = 1, loops do
rx = rx0 + drx * (row - 1)
x2, y2, z2 = rotateXY(-r, rx, ry0)
x3, y3, z3 = rotateXY(-r, rx + drx, ry0)
for col = 1, loops do
x1, y1, z1, x4, y4, z4 = x2, y2, z2, x3, y3, z3
ry = ry0 + dry * (col)
x2, y2, z2 = rotateXY(-r, rx, ry)
x3, y3, z3 = rotateXY(-r, rx + drx, ry)
u1 = u0 + w * (col - 1)
v1 = v0 + h * (row - 1)
u2 = u1 + w
v2 = v1 + h
drawpoly(x1, y1, z1, x2 + adj, y2, z2, x3 + adj, y3 + adj, z3, x4, y4 + adj, z4, u1, v1, u2, v1, u2, v2, u1, v2)
if(fast)then
u1 = u0 + w * (div - col)
u2 = u1 + w
drawpoly(-x2, y2, z2, -x1 + adj, y1, z1, -x4 + adj, y4 + adj, z4, -x3, y3 + adj, z3, u1, v1, u2, v1, u2, v2, u1, v2)
v1 = v0 + h * (div - row)
v2 = v1 + h
drawpoly(-x3, -y3, z3, -x4 + adj, -y4, z4, -x1 + adj, -y1 + adj, z1, -x2, -y2 + adj, z2, u1, v1, u2, v1, u2, v2, u1, v2)
u1 = u0 + w * (col - 1)
u2 = u1 + w
drawpoly(x4, -y4, z4, x3 + adj, -y3, z3, x2 + adj, -y2 + adj, z2, x1, -y1 + adj, z1, u1, v1, u2, v1, u2, v2, u1, v2)
end
end
end
table.sort(zbuffer, function(lhs, rhs) return lhs[3] > rhs[3] end)
drawpoly = obj.drawpoly
local v
for i = 1, #zbuffer do
v = zbuffer[i]
if(_3d ~= 1)then
v[3] = 0
v[6] = 0
v[9] = 0
v[12] = 0
end
drawpoly(unpack(v))
end
if(_3d ~= 1)then
obj.copybuffer("obj", "tmp")
end
local e = os.clock()
--debug_print(e - s)
--ボールド&イタリック
@ボールド&イタリック
--track0:横太さ,0,10000,0,0.01
--track1:縦太さ,0,10000,0,0.01
--track2:傾き,-90,90,0,0.01
--dialog:傾けてから太く/chk,change_order=0;高さも変える/chk,change_height=0;
--check0:パーセント指定,0
local function A()
local function bold(scale_x, scale_y)
local w, h = obj.getpixel()
local cx0 = (w * 0.5 + obj.cx) / w
local cy0 = (h * 0.5 + obj.cy) / h
local draw = obj.draw
local dw = math.floor(w * (scale_x - 1))
local dh = math.floor(h * (scale_y - 1))
local sx = -dw * 0.5
local sy = -dh * 0.5
obj.setoption("dst", "tmp", w + dw, h)
obj.setoption("blend", 0)
obj.draw(sx)
for x = 1, dw do
draw(x + sx)
end
obj.copybuffer("obj", "tmp")
local w, h = obj.getpixel()
obj.setoption("dst", "tmp", w, h + dh)
obj.setoption("blend", 0)
obj.draw(0, sy)
for y = 1, dh do
draw(0, y + sy)
end
obj.copybuffer("obj", "tmp")
local w, h = obj.getpixel()
obj.cx = -w * 0.5 + w * cx0
obj.cy = -h * 0.5 + h * cy0
end
local scale_x
local scale_y
if(obj.check0)then
scale_x = 1 + obj.track0 * 0.01
scale_y = 1 + obj.track1 * 0.01
else
local dw = obj.track0
local dh = obj.track1
local w, h = obj.getpixel()
scale_x = (w + dw) / w
scale_y = (h + dh) / h
end
if(scale_x ~= 1 or scale_y ~= 1)then
bold(scale_x, scale_y)
end
end
local function B()
local function create_bilinear_positon_fun(x1, y1, x2, y2, x3, y3, x4, y4)
local x1, y1, x2, y2, x3, y3, x4, y4 = x1, y1, x2, y2, x3, y3, x4, y4
return function(ty, tx1, tx2)
local xx1 = x1 * (1 - ty) + x4 * ty
local yy1 = y1 * (1 - ty) + y4 * ty
local xx2 = x2 * (1 - ty) + x3 * ty
local yy2 = y2 * (1 - ty) + y3 * ty
local xxx1 = xx1 * (1 - tx1) + xx2 * tx1
local yyy1 = yy1 * (1 - tx1) + yy2 * tx1
local xxx2 = xx1 * (1 - tx2) + xx2 * tx2
local yyy2 = yy1 * (1 - tx2) + yy2 * tx2
return xxx1, yyy1, xxx2, yyy2
end
end
local div = 1
local angle = obj.track2
if(angle == 0)then
return
elseif(math.abs(angle) == 90)then
obj.alpha = 0
return
end
local w, h = obj.getpixel()
local cx0 = (w * 0.5) / w
local cy0 = (h * 0.5 + obj.cy) / h
local t = cy0
local sin_h = h * math.sin(math.rad(angle))
local cos_h = h * math.cos(math.rad(angle))
local scale = h / cos_h
if(change_height == 1)then
scale = 1
end
local dx1 = sin_h * scale * (t)
local dx2 = sin_h * scale * (1 - t)
local dy1 = (h - cos_h * scale) * (t)
local dy2 = (h - cos_h * scale) * (1 - t)
local w2, h2 = w * 0.5, h * 0.5
local x1, x2, x3, x4 = -w2 + dx1, w2 + dx1, w2 - dx2, -w2 - dx2
local y1, y2, y3, y4 = -h2 + dy1, -h2 + dy1, h2 - dy2, h2 - dy2
local bilinear_positon = create_bilinear_positon_fun(x1, y1, x2, y2, x3, y3, x4, y4)
local l, r = math.min(x1, x2, x3, x4), math.max(x1, x2, x3, x4)
local t, b = math.min(y1, y2, y3, y4), math.max(y1, y2, y3, y4)
local w, h = r - l, b - t
local cx, cy = (l + r) * 0.5, (t + b) * 0.5
obj.setoption("dst", "tmp", w, h)
obj.setoption("blend", "alpha_add")
local drawpoly = obj.drawpoly
local u1, v1, u2, v2, u3, v3, u4, v4
local x1, y1, x2, y2, x3, y3, x4, y4
local tx1, tx2, ty1, ty2
local w, h = obj.getpixel()
for row = 1, div do
ty1 = (row - 1) / div
ty2 = (row ) / div
v1 = h * ty1
v3 = h * ty2
for col = 1, div do
tx1 = (col - 1) / div
tx2 = (col ) / div
u1 = w * tx1
u2 = w * tx2
x1, y1, x2, y2 = bilinear_positon(ty1, tx1, tx2)
x3, y3, x4, y4 = bilinear_positon(ty2, tx2, tx1)
drawpoly(x1 - cx, y1 - cy, 0, x2 - cx, y2 - cy, 0, x3 - cx, y3 - cy, 0, x4 - cx, y4 - cy, 0, u1, v1, u2, v1, u2, v3, u1, v3)
end
end
obj.copybuffer("obj", "tmp")
local w, h = obj.getpixel()
obj.cx = -w * 0.5 + w * cx0 - cx + obj.cx
obj.cy = -cy + obj.cy
end
if(change_order == 1)then
B()
A()
else
A()
B()
end
--基本図形2
@基本図形2
--track0:図形,1,7,2,1
--track1:外径,0,5000,100,1
--track2:内径,0,5000,50,0.01
--track3:加算値,-20000,20000,0,1
--dialog:ランダム図形/chk,random_figure=0;元画像サイズ/chk,use_original_size=0;色/col,color=0xffffff;ランダムカラー/chk,random_color=0;元画像色/chk,use_old_color=0;内部拡大率,scale=100;乱数シード,seed=10000;
--check0:内径パーセント指定,0
local offset = math.floor(obj.track3)
local fig_names = {"背景", "円", "三角形", "四角形", "五角形", "六角形", "星型"}
local fig_type
if(random_figure == 1)then
fig_type = obj.rand(2, #fig_names, seed, obj.index)
else
fig_type = math.floor(obj.track0)
end
local figure = fig_names[fig_type]
local scale = scale * 0.01
local outer_size
if(use_original_size == 1)then
outer_size = (math.max(obj.getpixel()) + offset) * scale
else
outer_size = (math.floor(obj.track1) + offset)* scale
end
local inner_size
local use_pct_size = (obj.check0 and 1 or 0)
if(use_pct_size == 1)then
inner_size = obj.track2 * 0.01 * outer_size
else
inner_size = (math.floor(obj.track2) + offset) * scale
end
local alpha = 1
if(random_color == 1)then
color = HSV(obj.rand(0, 360, seed, obj.index), 100, 100)
elseif(use_old_color == 1)then
obj.effect("モザイク", "サイズ", math.max(obj.getpixel()))
color, alpha = obj.getpixel(0, 0, "col")
end
local properies = {ox = obj.ox, oy = obj.oy, oz = obj.oz, rx = obj.rx, ry = obj.ry, rz = obj.rz, zoom = obj.zoom, aspect = obj.aspect, alpha = obj.alpha, cx = obj.cx, cy = obj.cy, cz = obj.cz}
do
obj.load("figure", figure, color, outer_size)
obj.copybuffer("tmp", "obj")
obj.load("figure", figure, color, inner_size)
obj.setoption("dst", "tmp")
obj.setoption("blend", "alpha_sub")
obj.draw()
obj.copybuffer("obj", "tmp")
end
for k, v in pairs(properies) do
obj[k] = v
end
obj.zoom = obj.zoom / scale
obj.alpha = obj.alpha * alpha
--色指定でキーイングセット
-- 上の説明欄からanmファイルを直接ダウンロードして使って下さいませ。
スクリプト名
- 最終更新:2013-01-08 13:32:05