• AviUtl拡張編集 私的関数備忘録

    2018-09-11 11:58

    ただのメモですがお好きにご利用頂けます
    使って何が起きても責任は持てません。
    基本拡張編集に元々ある機能で事足りますが勉強用
    色変換はrikky_moduleをお勧めします
    getsection以外使い道があまり無いような...



    -- HSVをRGBに直接変換
    -- h 0~360
    -- s 0~100
    -- v 0~100

    local function round(x)
    return math.floor(x+0.5)
    end

    function HSVtoRGB(h, s, v)
    h,s,v = h/360, s*0.01, v*0.01
    h = h % 1
    local c = v * s
    local x = c * (1 - math.abs((h*6) % 2 - 1))
    local m = v - c
    local mod = math.floor(h*6) + 1
    local r = ({c, x, 0, 0, x, c})[mod] + m
    local g = ({x, c, c, x, 0, 0})[mod] + m
    local b = ({0, 0, x, c, c, x})[mod] + m
    return round(r*255), round(g*255), round(b*255)
    end


    -- RGB を HSV に変換

    function RGBtoHSV(r, g, b)
    local max = math.max(r,g,b)
    if (max==0) then
    return 0,0,0
    end
    local min = math.min(r,g,b)
    local delta = (max-min)
    if (delta<0.00392) then
    return 0,0,round(max/2.55)
    end
    local H
    if (r>=max) then
    H = 60*((g-b)/delta)
    elseif (g>=max) then
    H = 60*(2+(b-r)/delta)
    else
    H = 60*(4+(r-g)/delta)
    end
    if H<0 then H = H+360 end
    return round(H),round(100*delta/max),round(max/2.55)
    end


    -- 拡張編集の関数 RGB と大体一緒の挙動
    -- HEXtoRGB(255,255,255) 戻り値 0xffffff
    -- HEXtoRGB(0xffffff) 戻り値 255,255,255

    function HEXtoRGB(...)
    local m = {...}
    if (#m == 3) then
    return SHIFT(m[1],16) + SHIFT(m[2],8) + m[3]
    end
    return SHIFT(m[1],-16), SHIFT(m[1],-8)%256, m[1]%256
    end


    -- rikky_moduleを使ったオーディオスペクトラム

    -- num = 戻り値のデータ数 (1 ~ 8192) (精度による)
    -- reso = 精度(0~3)、周波数成分の分解能
    -- mean = 平均化数(0~3)、 1以上だと滑らかな動き
    -- loger = 対数表示(0 or 1)、小さな音でも派手めに変化してくれる

    -- 戻り値は numで指定した要素のテーブルです。中の値は概ね0~1の範囲に収まります

    function audio_spectrum(num,reso,mean,loger)
    require("rikky_module")
    num,reso,mean,loger = (num or 128),(reso or 0),(mean or 0),(loger or 0)

    mean = math.min(mean,3)
    local d = 1 / (mean*2 + 1)
    local k = (loger==0 and 1/10000) or 1
    local m = {}
    for i=-mean,mean do
    m[#m+1] = rikky_module.audiobuffer(i,"SPECTRUM","relative","monaual",num,reso)
    end

    local v = {}
    local peak = 0
    for i=1,num do
    local sum = 0
    for j=1,#m do
    sum = sum + m[j][i]
    end
    v[i] = sum*d*k
    if (v[i] > peak) then
    peak = v[i]
    end
    end

    if (loger~=1) then
    return v, peak
    else
    peak = 0
    local l = 1 / 13.28785687
    for i=1,num do
    v[i] = math.log(1+v[i], 2) * l
    if (v[i] > peak) then
    peak = v[i]
    end
    end
    return v, peak
    end
    end




    -- [[
    中間点の数、現在の中間点区間番号、中間点の有る時間、中間点毎の長さ、区間の進行度、中間点基準の時間
    をまとめて取得します。
    トラックバースクリプトなら関数が用意されているのですがアニメーション効果用には無いので。

    local s = getsection() -- sに結果を渡す
    s.num = 中間点の総数 - 1
    s.keytime = 中間点の打ってある時間をまとめたテーブル (s.keytime[1] = 一つ目の中間点がある時間)
    s.section = 現在いる中間点の区間番号、中間点が無ければ常に0
    s.duration = 現在いる中間点から次の中間点までの長さ、中間点が無ければobj.totaltimeと同じ
    s.ratio = 現在いる中間点から次の中間点までの進行度を(0~1)で表したもの
    s.time = 中間点毎に0から始まる時間、中間点が無ければobj.time同じ
    ]]

    function getsection()
    local num = obj.getoption("section_num")
    local section = 0
    local time = obj.time
    local duration = obj.totaltime
    local ratio = time / duration
    local keytime = {[0]=0}
    if (num==1) then
    return {num=num, section=section, keytime=keytime, duration=duration, ratio=ratio, time=time}
    end
    for i=1,num do
    keytime[i] = obj.getvalue("time",0,i)
    end
    for i=1,num-1 do
    if (obj.time >= keytime[i]) then
    section = i
    time = obj.time - keytime[i]
    duration = keytime[i+1] - keytime[i]
    ratio = time / duration
    end
    end
    return {num=num, section=section, keytime=keytime, duration=duration, ratio=ratio, time=time}
    end






  • 広告
  • ディレイ動画補足

    2018-06-24 11:532
    ディレイ sm26789854 の補足です


    テキストに追従するメッシュ状の線と面を描画します。
    こういうやつ。スクリプト制御にコピペです。



    • テキスト等の個別オブジェクトに面を張るスクリプト
    これは個別オブジェクト本体につけます
    全ての行の字数が同じでないとうまくいきません。

    TA-Arrange等の使用後にでもつけるといいかも
    https://www.dropbox.com/s/5ok3w90t1vtgoha/%40TA-Track.anm?dl=0

    local l = 10 -- 横分割数と合わせる(設定必須)
    local col = 0xffffff -- 色
    local alp = 0.8 -- 透明度
    --local w,h = obj.getpixel() --オブジェクトの色を使いたい場合はこの二行を有効に
    --col,alp = obj.getpixel((w-1)/2,(h-1)/2)
    if(obj.index==0)then Q = {} end
    Q[obj.index]={obj.x+obj.ox,obj.y+obj.oy,obj.z+obj.oz,obj.alpha*alp,col}
    if(obj.index==obj.num-1)then
    obj.draw()
    obj.load("figure","四角形",0,1)
    obj.rz=0
    obj.ox,obj.oy,obj.oz = obj.ox-obj.x, obj.oy-obj.y, obj.oz-obj.z
    for i=0,#Q-l do
    if(i%l~=l-1)then --右端と左端の接続を回避
    local a,b,c,d=Q[i],Q[i+1],Q[i+1+l],Q[i+l]
    obj.putpixel(0,0,a[5],a[4]*b[4]*c[4])
    obj.drawpoly(a[1],a[2],a[3],a[1],a[2],a[3],b[1],b[2],b[3],c[1],c[2],c[3])
    obj.putpixel(0,0,d[5],a[4]*c[4]*d[4])
    obj.drawpoly(a[1],a[2],a[3],a[1],a[2],a[3],c[1],c[2],c[3],d[1],d[2],d[3])
    end
    end
    end


    • 点線を描画するスクリプト
    テツさんの格子線スクリプトと大体同じ物です。
    上記のオブジェクトより下のレイヤーで使います
    サイズの小さい図形に使用します。

    TA-Arrangeを使用している場合は
    格子線スクリプトの座標欄に POS と入れると点描画されます。

    local num = -15 --マイナスだと描画間隔、プラスだと描画数指定
    local fade = 300 -- この距離より離れると消えていく
    local ln = 0 --1にすると元のオブジェクトの位置に描画しない

    local function clamp(x)
    return (x<=0 and 0) or (x>=1 and 1) or x
    end

    local function draw_dot(a,b,num,fade)
    local v = {b[1]-a[1],b[2]-a[2],b[3]-a[3]}
    local l = math.sqrt(v[1]*v[1]+v[2]*v[2]+v[3]*v[3])
    local alp = 1-clamp((l-fade)/(fade/2))
    if l<100 then alp = 1-clamp((l-100)/(50-100)) end
    if (alp<=0) then return end
    local n = (num<0 and l / -num) or num
    v = {v[1]/n,v[2]/n,v[3]/n}
    for i=ln,n-ln do
    obj.draw(a[1]+v[1]*i,a[2]+v[2]*i,a[3]+v[3]*i,alp,alp)
    end
    end
    obj.setoption("billboard",3)
    for i=0,#Q-1 do
    for j=i+1,#Q do
    draw_dot(Q[i],Q[j],num,fade)
    end
    end


  • カスタムフレアをカメラと連動させる

    2016-10-15 10:37
    ティムさんの謹製カスタムフレアが更新されたそうです。

    せっかくなのでフレアの位置をオブジェクトに追従するようにしつつ
    カメラに対応する方法をメモ。
    そして誤記訂正
    exedit.lua 正 exedit.auf


    先ずはカスタムレア本体を入手してscriptフォルダへ。



    次にrikkyさんの便利なdllセットを入手して
    rikky_module.dllをpluginsフォルダへ。
    拡張編集(exedit.auf)をpluginsフォルダへ入れていない構成の場合はexedit.aufと同じ階層へ。



    カメラ制御で使用する方法ですが
    カスタムフレア本体はカメラ制御下には置かない
    ということに注意してください。

    任意のオブジェクトをカスタムフレアのアンカーポイントとして使います。
    フレアの光点にしたいオブジェクトにスクリプト制御を使用して以下をコピペ。
    ※このオブジェクトはカメラ制御下に置きます。
    require("rikky_module")
    local cam = rikky_module.camerainfo()
    Flarepos = {cam.ix, cam.iy,0, 0,0,0}
    その後カスタムフレアのベースの設定ダイアログを開き
    位置移動のチェックを外した状態にし、
    座標の項目に Flarepos と入れればOKです。
    ※Flareposはただの変数名なのでお好きなもに変えて構いません。
    ただしobjは使用厳禁。

    この方法はオブジェクトの位置には追従しますが
    rikkyさんの改造版であるカスタムフレア_camと違い
    カメラの距離でサイズの変化はしませんのでご注意。