カメラ自動透過スクリプト AviUtl拡張編集用 小品 +α
閉じる
閉じる

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

×

カメラ自動透過スクリプト AviUtl拡張編集用 小品 +α

2014-12-10 17:55
    カメラの接近で自動的に透明になるAviUtl拡張編集用スクリプト小品です。
    以前配布していた物とほぼ同じです。
    線から下をテキストにコピペ、
    カメラ自動透過.anm
    と言う名前で保存してscriptフォルダに入れて使って下さい。




    --track0:消去距離,-200,10000,0
    --track1:Fade,-200,10000,0
    --track2:リニア減衰,0,1,0,1
    --track3:サイズ無視,0,1,0,1
    --check0:透明度,1

    --dialog:ぼかし%,local bokeh=0;ぼかしサイズ固定/chk,local lock=0;移動(相対),local position=0;(1加算/2反転),local k=0;

    --[[
    これを付けたオブジェクトにカメラが接近すると自動で透明化します。
    カメラ接近時のドット感を誤魔化したい人向け。
    かなり適当です。角度が付いた接近や視野角の変化には自動で対応しないので
    うまく消去距離とFadeを調整して下さい。
    フェードはリニア減衰でないと効果が判り辛いと思います。
    おまけで透明度の変化と合わせてぼかしたり、移動したりするオプションが付いています。(加算、反転は移動専用のパラメータです)
    個別オブジェクトにも対応します。

    注意点
    ぼかしは個別テキスト以外だと上手く動作しないと思われます。(領域拡張などで十分なマージンを取ってからサイズ固定ぼかしならそれなりです)
    大きな画像は早めに透過開始するので困る場合はサイズ無視を1にして下さい。

    ]]


    local cam = obj.getoption("camera_param")

    local Aov = (math.atan(obj.screen_h/(cam.d*2))*360/math.pi)

    local cam_pos = {cam.x ,cam.y ,cam.z}
    local this_layer_pos = {obj.x+obj.ox ,obj.y+obj.oy ,obj.z+obj.oz}
    local size = math.max(200,obj.w,obj.h)/2
    if obj.track3==1 then size=100 end
    local start = 200 + obj.track1 + size --適当減衰範囲
    if start<100 then start=100 end;
    local zure = obj.track0-100+(start/2) --減衰開始位置ズレ

    local function Length(P1,P2)
    local Dist = math.sqrt((P1[1]-P2[1])^2+(P1[2]-P2[2])^2+(P1[3]-P2[3])^2)
    return Dist
    end

    local Distance = Length(cam_pos, this_layer_pos)-zure
    local A=1
    if Distance < start and obj.track2==1 then
    A = 1*(Distance/(start/100))*0.01 -- linear
    elseif Distance < start then
    A = 1+math.log((Distance/(start/100))*0.01)
    end


    A = math.max(0,A)

    obj.effect("ぼかし","範囲",bokeh*(1-A),"サイズ固定",lock)

    local x,y,z=position,position,position

    if string.find(tostring(position),"table:")==1 then
    x,y,z= position[1],position[2],position[3]
    elseif position==nil then
    x,y,z=0,0,0
    end

    local AA=1-A
    if k==1 then
    obj.ox=obj.ox + (x)*(AA)
    obj.oy=obj.oy + (y)*(AA)
    obj.oz=obj.oz + (z)*(AA)
    else

    if k==2 then AA=A end
    obj.ox=obj.ox + (this_layer_pos[1]*x/100)*(AA)
    obj.oy=obj.oy + (this_layer_pos[2]*y/100)*(AA)
    obj.oz=obj.oz + (this_layer_pos[3]*z/100)*(AA)
    end

    if obj.check0 then
    obj.alpha=math.max(0,obj.alpha*A)
    end

    --ここまで-------------------------------------------------------------------------------------




    デフォルトエフェクトのクリッピングに少し機能を追加したスクリプトです
    個別オブジェクトに使うとオーディオ波形代わりにもなります。
    線から下をテキストにコピペ、
    クリッピング+.anm
    と言う名前で保存してscriptフォルダに入れて使って下さい



    --track0:上,0,4000,0
    --track1:下,0,4000,0
    --track2:左,0,4000,0
    --track3:右,0,4000,0
    --check0:リンク,0
    --dialog:上,local A=0;下,local B=0;左,local C=0;右,local D=0;個別タイプ[1-5],local Type=0;タイプ影響%,local amo=100;seed,local seed=1


    --[[
    上下と左右を其々リンクして上下&左右を同時に動かせるだけです。
    ダイアログは数値入力やスクリプト用。

    個別タイプは個別オブジェクトやオブジェクト分割時に
    1-ランダム
    2-順
    3-逆順
    4-凸
    5-凹
    のように動作します。

    seedにマイナスの値を入れると音声の影響を受けます(seedが奇数の場合はspectrum、偶数の場合はfourierを使います)
    ]]

    local w,h=obj.getpixel()
    w,h=w-1,h-1

    local min=math.min
    A=A+obj.track0
    B=B+obj.track1
    C=C+obj.track2
    D=D+obj.track3

    amo=(amo or 100)
    amo=amo/100

    if Type==1 then
    A=amo*A*obj.rand(1000,5000,obj.index*-1*seed,1)/1000
    B=amo*B*obj.rand(1000,5000,obj.index*-2*seed,2)/1000
    C=amo*C*obj.rand(1000,5000,obj.index*-3*seed,3)/1000
    D=amo*D*obj.rand(1000,5000,obj.index*-4*seed,4)/1000
    end

    local F=1
    local ID=obj.index*amo
    local num=obj.num*amo

    if Type==2 then
    F=1+ID
    elseif Type==3 then
    F=1+num-ID
    elseif Type==4 then
    F=1+math.abs(num/2-ID)
    elseif Type==5 then
    F=1+(num/2-math.abs(num/2-ID))
    end

    local T=0
    if seed<0 then
    local S={"spectrum","fourier"}
    local DF={4000,1000}
    local I={obj.index+1,math.floor((800/obj.num))*(obj.index+1)}
    local f,f,t=obj.getaudio(nil,"audiobuffer",S[math.abs(seed%2-2)],obj.num)
    T=t[I[math.abs(seed%2-2)]] / DF[math.abs(seed%2-2)]
    T=T*amo
    end

    A=min(h,A*(F+T))
    B=min(h,B*(F+T))
    C=min(w,C*(F+T))
    D=min(w,D*(F+T))


    if obj.check0 then
    obj.effect("クリッピング","上",A/2-1,"下",A/2,"左",C/2-1,"右",C/2)
    local w1,h1=obj.getpixel()
    if (w1<=1 or h1<=1) then
    obj.alpha=0
    end

    else

    obj.effect("クリッピング","上",A,"下",B,"左",C,"右",D)
    local w1,h1=obj.getpixel()
    if (w1<1 or h1<1) then
    obj.effect("クリッピング","上",min(h1/2,A)"下",min(h1/2,B),"左",min(w1/2,C),"右",min(w1/2,D))
    obj.alpha=0
    end
    end


    function linear(t, t_min, t_max, value1, value2 )
    -- t_min ,t_max (t が t_minからt_maxに移動する範囲を)
    -- value1 ,value2 (vaue1からvalue2の範囲にして返す)
    if not value1 then
    value1 , value2 = 0, 1
    end

    local c =(t_max - t_min)
    local n = t/c - t_min/c
    value2 = value2-value1
    return value2 * n + value1
    end




    --memo

    local name="" --格納(親)の名前 空文字だとLがレイヤ指定
    local L={4,6,7} --格納(親)のindex またはレイヤ

    local Color={0xfea643,0xf2d15b,0xb1c67c,0x6bb184,0x448663}

    obj.draw()
    local col=obj.getpixel(0,0,"col")
    local function Gv(L,type)
    local type=type or 3
    type=math.min(4,type)
    local GV=obj.getvalue
    local V={}
    local T={".x",".y",".z"}
    for k=1,#L do
    for i=1,type do
    table.insert(V,GV("layer"..L[k]..T[i]))
    end
    end
    return V
    end

    local function draw_layer(L)
    for i=1,#L-1 do
    local F
    if name=="" then
    F=Gv({L[i], L[i+1]})
    else
    F=R_NEST(name, {L[i], L[i+1]})
    end
    local x0,y0,z0, x1,y1,z1=unpack(F)
    local x,y,z=obj.x,obj.y,obj.z
    obj.load("figure","四角形",Color[i%#Color+1],1)
    obj.drawpoly(x0-x,y0-y,z0-z, x1-x,y1-y,z1-z, 0,0,0, 0,0,0 ,0,0,0,0,0,0,0,0, 1/(math.exp(i/#L-0.1)))
    end
    end
    draw_layer(L)



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