93のブロマガ

AviUtl用雑多スクリプト

2015/07/13 05:06 投稿

  • タグ:
  • AviUtl

すぐに紛失する自分用メモです。
色付き文字は関数化されているものです。

--------------------------------------------------------------
--フレームバッファをオブジェクトで型抜き(虫眼鏡的な)
--------------------------------------------------------------
--[[
一応個別オブジェクトでも使えるので縁取りやシャドーと併用して
透明っぽい振りができるかも。
白の乗算や黒加算でも同様なことができますが、此方は通常合成のままです。
拡大すると拡大鏡風(画面端は適当)
ただカクカクするのをうまく防ぐ方法は自分には難しいようです。
]]

local w,h=obj.getpixel()
local x=obj.x+obj.ox-obj.cx*obj.getvalue("zoom")/100
local y=obj.y+obj.oy-obj.cy*obj.getvalue("zoom")/100
local z=obj.oz
obj.effect("反転","透明度反転",1)
obj.copybuffer("cache:mask","obj")
obj.setoption("drawtarget","tempbuffer",w,h)
local sw,sh=obj.screen_w/2,obj.screen_h/2
local px=x+sw-math.ceil(w/2)
local py=y+sh-math.ceil(h/2)
px=math.min(sw*2-w-1,math.max(0,px))
py=math.min(sh*2-h-1,math.max(1,py))
obj.load("framebuffer",px,py,w+w%2,h+h%2)
obj.draw()
obj.setoption("blend","alpha_sub")
obj.copybuffer("obj","cache:mask")
obj.draw()
obj.load("tempbuffer")
obj.ox=x-obj.x
obj.oy=y-obj.y
obj.oz=z
obj.setoption("focus_mode","fixed_size")


-------------------------------------------------
輝度マップ
-------------------------------------------------
local w,h= obj.getpixel()
local gv=obj.getvalue
local hi,si,vi=HSV(obj.getpixel(0,0))
local scl= 2
--local auido=require("Mytools").AudioAve
--local ROT=require("Mytools").ROT
obj.copybuffer("cache:org","obj")
local t={}
local num = 10
local zd = 50
local pw,ph=w/num, h/num
for i=0,num-1 do
t[i+1]={}
for j=0,num-1 do
local x=pw*i +pw/2
local y=ph*j + ph/2
local col,alpha = obj.getpixel(x,y)
local r,g,b=RGB(col)
local lum = ( 0.298912 * r + 0.586611 * g + 0.114478 * b )/255
t[i+1][j+1]={(x-w/2)*scl, (y-h/2)*scl, lum,alpha,col}
end
end

for i=1,#t do
for j=1,#t do
local x,y,lum,alpha,col=unpack(t[i][j])
if alpha>0 then
for k=0,math.floor(lum*10) do
local z= k*lum*zd
obj.setoption("billboard",3)
obj.load("figure","円", HSV(255+(360-hi)*lum,100,100),6)


--local x,y,z=ROT(x,y,z)
obj.draw(x, y + 50*lum, z, 1-lum+.2, 1-lum^2 ,-gv("rx"),-gv("ry"),-gv("rz"))
end
end
end
end


-------------------------------
-------------------------------
--シンプルな自動フェードイン、アウト
--------------------------------------------------------------
IO([フェードイン時間,フェードアウト時間,time,totaltime])
IO(0.5, 3) --0.5秒でフェードイン,3秒でフェードアウト
IO() -- 省略で IN,OUTともに1秒

function IO(induration, outduration,time,total)
local iD=induration or 1
local oD=outduration or 1
local time=time or obj.time
local total=total or obj.totaltime
local start=math.min(1,math.max(0,(time/iD)))
local ending=(total-time-oD)/oD + 1
ending=math.min(1,math.max(0,ending))
obj.alpha = obj.alpha*(start*ending)^2
return (start*ending)
end

--------------------------------------------------------------
--滑らかgetaudio
--------------------------------------------------------------
--AudioAve([分割数,平均化参照範囲,取得データの種類])
--戻り値はgetaudioと同様のテーブルです。
-- obj.oy = obj.oy - AudioAve(obj.num,4)[obj.index+1]/50 -- ダイレクトに使う例

function AudioAve(size,range,Type)

local size = size or 1
local range = range or 3
local Type=Type or "spectrum"
local buf={}
local L=obj.layer
local num=obj.getaudio(buf,"audiobuffer",Type,size)

if(range<2)then
return buf ,num --rangeが1以下だと普通のobj.getaudioを返して終わり。
else

if(obj.index==0)then --これがないと個別オブジェクト時に暴れる
if(GA_buf==nil)then GA_buf={}
end
if(GA_buf[L]==nil)then GA_buf[L]={} end --レイヤーで分けないと複数使用時暴れる

table.insert(GA_buf[L],buf)
if(#GA_buf[L]>range)then
table.remove(GA_buf[L],1
)
end
if(not #GA_buf[L]==range)then --rangeが変更された場合は初期化
GA_buf[L]={}
end
end

local V={}
for i=1,num do
local t=0
for j=0,range-1 do
t=t + GA_buf[L][range-j][i]
end
V[i]=t/range
end

return V,num,(#GA_buf[L][1])
end
end

--------------------------------------------------------------
--各種パラメータを引き継ぐobj.load
--------------------------------------------------------------
--個別オブジェクトでobj.load(obj.index)をよく使うので
--第一引数をテーブルにすると元のオブジェクトを描画してからloadします。
--テーブルはobj.drawの引数と同じです。 {x,y,z,zoom,alpha,rx,ry,rz}
--空のテーブルでもok obj_load({} , ...)


function obj_load(...)

local t={...}


local x,y,z=obj.ox,obj.oy,obj.oz
local rx,ry,rz = obj.rx,obj.ry,obj.rz
local cx,cy,cz = obj.cx,obj.cy,obj.cz
local zoom,alp,aspect = obj.zoom,obj.alpha,obj.aspect

if string.find(tostring(t[1]),"table:")then
obj.draw(unpack(t[1]))
table.remove(t,1)
end
obj.load(unpack(t))
obj.ox,obj.oy,obj.oz = x,y,z
obj.rx,obj.ry,obj.rz =rx,ry,rz
obj.cx,obj.cy,obj.cz = cx,cy,cz

obj.zoom,obj.alpha,obj.aspect = zoom,alp,aspect
end


end


--------------------------------------------------------------
--ロード中のオブジェクトの色と座標をget
--------------------------------------------------------------
get_col(縦分割数,横分割数,座標獲得明るさ閾値[,明るさ表示])
col,pos,pos2 = get_col(5,5,0,1)
colにカラーのテーブル , posに座標 ,pos2に座標(入れ子状)
col ={col1,col2...},pos={x,y,z, x,y,z,...} ,pos2 ={{x,y,z},{x,y,z},...}
(格子線と組み合わせた作例)

function get_col(width_num, height_num, Value_threshold, view)
local wn, hn= width_num, height_num
local VT = Value_threshold
local view=view or 0
local w,h=obj.getpixel()
local zoom=obj.getvalue("zoom")/100 * obj.zoom
local fw,fh=w/wn,h/hn
local c,p,P={},{},{}
obj.draw() --元を表示


for i=0,hn-1 do
for j=0,wn-1 do
local x = j*w/wn + fw/2
local y = i*h/hn + fh/2
local col,alpha=obj.getpixel(x,y)
local H,S,V=HSV(col)
if (V>=VT and alpha>0)then
x = (x - w/2) * zoom
y = (y - h/2) * zoom
local z = 0
table.insert(c,col)
table.insert(p,x);table.insert(p,y);table.insert(p,z)
table.insert(P,{x,y,z})

end
end
end


--表示
if view==1 then
for i=1,#c do
local col=c[i]
--local x,y,z = p[i*3-2],p[i*3-1],p[i*3]
local x,y,z = unpack(P[i])
obj.setfont("inconsolata",20,4,col)
local H,S,V=HSV(col)
obj.load(V)
obj.draw(x,y,z,.8,1)
end
end

return c,p,P
end

-------------------------------
-------------------------------
--震える関数版
--------------------------------------------------------------
-- shake(変化時間[,最小値,最大値,シード])
-- obj.alpha = shake(300,0,1,obj.index)

function shake(interval,min,max,seed)
if not min then min,max,seed=-1,1,0 end
seed=seed or 0
if interval==0 then
return rand(min,max,seed)
else
local s=seed
min,max=min*1000,max*1000
local t = obj.time*100/interval
local p = math.floor(t)
t = t-p
local x0 = rand(min,max,s,p+0)/1000
local x1 = rand(min,max,s,p+1)/1000
local x2 = rand(min,max,s,p+2)/1000
local x3 = rand(min,max,s,p+3)/1000
return obj.interpolation(t,x0,x1,x2,x3)
end
end

--------------------------------------------------------------
--複数のレイヤーの座標を獲得(いつもの、テーブル無し版)
--------------------------------------------------------------
-- GL(座標を取得したいレイヤーを任意数)

function GL(...)
local t = {...}
local tx = {".x",".y",".z"}
local n = 3
local V = {}
for k,v in ipairs(t) do
for i=1,n do
table.insert(V,obj.getvalue("layer"..v..tx[i]))
end
end
return V
end


--------------------------------------------------------------
なんにでも四角形枠を追加
--------------------------------------------------------------
-- Rect([枠色 , 枠線幅 , 枠透明度 , 元透明度 , 縦幅拡張 ,横幅拡張 , 元画像位置x,元画像位置y])
使用例

function Rect(color,line,alp1,alp2,exw,exh,px,py)
color = color or obj.getpixel(0,0)
line,alp1,alp2,exw,exh,px,py=line or 1, alp1 or 1, alp2 or 1,
exw or 0, exh or 0, px or 0, py or 0
--obj.loadを使うので各値を一時退避
local x,y,z=obj.ox,obj.oy,obj.oz
local rx,ry,rz = obj.rx,obj.ry,obj.rz
local cx,cy,cz = obj.cx,obj.cy,obj.cz
local zoom,alp = obj.zoom,obj.alpha
obj.copybuffer("cache:org","obj")

local w,h=obj.getpixel()
-- -1~1 の縦横比獲得
w,h = w+exw,h+exh
local S=math.max(w,h)
local asp=(h/w*w)/S - (w/h*h)/S

obj.setoption("drawtarget","tempbuffer",w,h)
obj.load("figure","四角形",color,S,line,asp)
obj.draw(0,0,0,1,alp1)
obj.copybuffer("obj","cache:org")
obj.draw(px,py,0,1,alp2)
obj.copybuffer("obj","tmp")
obj.ox,obj.oy,obj.oz = x,y,z
obj.rx,obj.ry,obj.rz =rx,ry,rz
obj.cx,obj.cy,obj.cz = cx,cy,cz
obj.zoom,obj.alpha = zoom,alp
end


--------------------------------------------------------------
なんにでも四角形枠を追加(drawpoly)

--------------------------------------------------------------

--現在画像の縦横pixel数を獲得
local w,h=obj.getpixel()
w,h=w+2, h+2 --サイズを変更する場合はここで加算


--途中でobj.loadを使用するので位置情報が初期化される前に座標を一度保存しておく
--テキストは中心点の移動で位置を調整しているのでobj.cx,obj.cyも必要(アライメントも含む)
local x,y = obj.ox,obj.oy
local cx,cy= obj.oy,obj.cy

--[[
--回転軸が常に画像の中心になるようにする場合
local zoom=obj.getvalue("zoom")*.01
x,y = x-cy*zoom ,y-cy*zoom
cx,cy = 0, 0
]]

--現在持っている画像("obj")をキャッシュ("cache:任意の名前")へコピー
--obj.copybuffer(何処へ,何を)
obj.copybuffer("cache:text","obj")

--現在持っている画像のサイズで仮想バッファを作成し
--obj.draw ,obj.drawpolyでの描画先を仮想バッファに変更します
--仮想バッファは「常に見えない場所にある」もう一つのキャンバスです

obj.setoption("dst","tmp",w,h)

--obj.drawpolyで引き延ばす元の四角形をロード
obj.load("figure","四角形",0xffffff,1)

--obj.drawpolyで仮想バッファに仮想バッファと同じサイズで描画
w,h=w/2, h/2

obj.drawpoly(-w,-h,0, w,-h,0, w,h,0, -w,h,0, 0,0,0,0,0,0,0,0, 1)

--次に元々の画像を呼び出して仮想バッファに描画
obj.copybuffer("obj","cache:text")
obj.draw()

--仮想バッファは見えないところにある場所にあるキャンバスなので
--現在持っている画像("obj")に仮想バッファからコピー
--obj.draw,obj.drawpolyをフレームバッファに対して使っていないので
呼び出すだけでOK
obj.copybuffer("obj","tmp")

--位置をあらかじめ保存していた位置へ移動
obj.ox,obj.oy=x,y
obj.cx,obj.cy=cx,cy

--------------------------------------------------------------
--四角形を円に
--------------------------------------------------------------
Polar(開き具合,幅,ぼかし,内側ぼかし)
--comp,width,blurは0~100の値を想定

function Polar(comp,width,blur,inside_blur)
local w,h=obj.getpixel()
local comp=comp *0.01
local blur = w/2*(math.max(0,blur)*0.01)
local width = width
local inside_blur=insede_blur
local adj=(w/2)*(blur/2)*0.01
local pgs=(-w/2 - adj) + (w + adj)*(comp)
local line =(-w/2)+w*(width*0.01)
obj.effect("斜めクリッピング","中心X",pgs,"角度",90,"ぼかし",blur)
obj.effect("斜めクリッピング","中心Y",line,"角度",180,"ぼかし",inside_blur,"幅",-w/3*0)
obj.effect("極座標変換")

end


--------------------------------------------------------------
--個別オブジェクト用ミラーもどき(回転させても下に居座る)
--------------------------------------------------------------

local alpha= 0.5 --透明度
local fade = 200 -- 減衰
local adjust = 20 --境目調整
obj.effect()
obj.copybuffer("tmp","obj")
obj.draw()
obj.copybuffer("obj","tmp")
obj.zoom=-obj.zoom
local n = 0
if math.abs(obj.rx)>90 and math.abs(obj.rx)<270 then
n=-180 end
obj.ry=obj.ry-180
obj.effect("斜めクリッピング","角度",n+180-obj.rz,"ぼかし",fade)
obj.draw(0,adjust,0,1,alpha)


--------------------------------------------------------------
--LUXもどき
--------------------------------------------------------------

local w,h = obj.getpixel()
local alp = obj.alpha
local s =math.sqrt(w*w+h*h)
obj.effect()
obj.effect("ぼかし","範囲",s/4+0)
obj.effect("グロー","強さ",40+40/s*2,"しきい値",0,"拡散",10)
obj.draw(0,0,0,0.8,0.5)
local num =9
for i=1,num,1/4 do
local d=(i/10)^2* 1.9 --Reach
local zm=i^2 * 1.2--size
local alp=alp * (i*.8)^2+1 -- intensity
obj.draw(-obj.x*d,-obj.y*d,-obj.z*d,zm,1/alp)
end


--------------------------------------------------------------
--縦書き文字を個別回転(拡大率に対して無力)
--------------------------------------------------------------

local t ={1,4,5} -- 回転させたい文字を指定
local r = 0 -- 回転加算値

local zoom=obj.getvalue("zoom")/100

for key,value in pairs(t) do
if (obj.index+1 == value) then


local cx,cy = obj.cx*zoom,obj.cy*zoom -- cx,cy の値を取得してから
obj.cx,obj.cy = 0,0 -- cx,cy を0に
obj.ox,obj.oy = (obj.ox-cx),(obj.oy-cy) -- ox,oyにcx,cy の値を加味。


obj.rz = obj.getvalue("rz") + r -- させたい処理。obj.effect("お好きなエフェクト") 等。

end
end

--------------------------------------------------------------
--画像ループもどき(意味なし)
--------------------------------------------------------------

local wn, hn= 4, 12
local num=wn*hn
local d=num/hn
d=math.floor(d)
local w,h=obj.getpixel()
local col=obj.getpixel(0,0)

for i=0,num-1 do
local x=w * (i%d)
local y=h * math.floor(i/d)
x=x - w*(d-1)/2
y=y - h/2*num/d
local alp=shake( rand(40,200,i,0) ,0.1, 1, i) or rand(40,200,0,i)/200
obj.setfont("",0,0,col)
obj.load("FK."..math.floor(alp*100))
obj.effect()
obj.draw(x,y,0,1,alp)
end



--------------------------------------------------------------
--図形の"円"の円周を移動する円(ファンネル)
--------------------------------------------------------------

local size,num = 20,12 --サイズと数
local w,h=obj.getpixel()

local col=obj.getpixel(0,0)
obj.setoption("drawtarget","tempbuffer",w+20,h+20)
obj.setoption("blend", "alpha_max" )
local zoom= 1 --obj.getvalue("zoom")/100
obj.draw()
obj.load("figure","円",col,size)
local x,y
local t=math.min(obj.time/3^2,1,obj.totaltime-obj.time)
local R=math.rad(obj.getvalue("rz"))
for i=0,num do
local r=rand(0,120,i,0)/120
x=math.cos(math.pi/2*obj.time*(1.2-r)+i/2)*t
y=-math.sin(math.pi/2*obj.time*(1.2-r)+i/2)*t

obj.draw(x*(w/2-2) *zoom,y*(h/2-2) *zoom,0,0.5,(1 or math.abs(y)))
end
obj.load"tempbuffer"



---------------------------------------------------------------
オブジェクト背後に□
--------------------------------------------------------------

local expa =5
local ZOOM = 1.1
local colt = {0xe8d3b4, 0xfb4950 , 0x152a34 , 0xa5a69b, 0xf3b653}--指定数だけ枠が出る
local Ws,Hs=obj.getpixel()
local zoom=obj.getvalue("zoom")/100
local tempW,tempH=(Ws+expa*#colt)*ZOOM,(Hs+expa*#colt)*ZOOM
local x,y,z=obj.ox, obj.oy, obj.oz
local cx,cy=obj.cx ,obj.cy
obj.copybuffer("cache:e","obj")
obj.setoption("drawtarget","tempbuffer",tempW,tempH)
local function dp(Ws,Hs,X,Y,color,alpha)
local X=X or 0
local Y=Y or 0
local color=color or obj.getpixel(0,0)
local alpha=alpha or obj.alpha
local w,h=Ws/2 ,Hs/2
obj.load("figure","四角形",color,1)
obj.drawpoly(-w+X,-h+Y,0 ,w+X,-h+Y,0 ,w+X,h+Y,0 ,-w+X,h+Y,0 ,0,0 ,0,0 ,0,0 ,0,0 ,alpha)
end
local cl=#colt-1
for i=0,cl do
i = cl-i
dp( (Ws+(expa)*i)*ZOOM, (Hs+(expa)*i)*ZOOM ,0,0,colt[i%#colt+1],1)
end
obj.copybuffer("obj","cache:e")
--obj.effect()
obj.draw()
obj.load("tempbuffer")
obj.ox, obj.oy, obj.oz = x,y,z
obj.cx,obj.cy=cx,cy



---------------------------------------------
配置をシームレスに行ったり来たり
---------------------------------------------


local t = obj.time --(なんか適当に増える値 ※一桁ずつゆっくり増える値 )

local w,h=obj.getpixel()
local id,it= math.modf(t)

local c,n =1-it , it
--ここから配置パターンを色々登録
local amp=150 --円形配置時のサイズ

local org = {obj.ox,obj.oy}
local zero = {0,0}
local tate = {0, obj.index*h - ((obj.num-1)*h)/2 }
local yoko = {obj.index*w - ((obj.num-1)*w)/2 ,0}

local en =
{math.cos(math.rad(360/obj.num*obj.index))*amp,
-math.sin(math.rad(360/obj.num*obj.index))*amp}
local sin =

{(obj.num-obj.index)*10 - ((obj.num)*10)/2,
math.sin(obj.time*2+obj.index)*w}


local T={org,zero,tate,yoko,en,sin,org} --配置パターンをここに幾つでも
--呼び出し
local ix,iy = T[id%#T+1][1]*c,T[id%#T+1][2]*c
local nx,ny = T[(id+1)%#T+1][1]*n,T[(id+1)%#T+1][2]*n
obj.ox,obj.oy= ix+nx, iy+ny



コメント

コメントはまだありません
コメントを書き込むにはログインしてください。

いまブロマガで人気の記事