AviUtl用雑多スクリプト
閉じる
閉じる

新しい記事を投稿しました。シェアして読者に伝えましょう

×

AviUtl用雑多スクリプト

2015-07-13 05:06

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

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

    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



    広告
    コメントを書く
    コメントをするには、
    ログインして下さい。