93のブロマガ

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

2014/12/10 17:55 投稿

  • タグ:
  • AviUtl
カメラの接近で自動的に透明になる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)



コメント

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

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