93のブロマガ

AviUtl 格子線やトラッキングライン等のアンカーポイントを好きに動かしたい

2014/09/05 01:06 投稿

コメント:2

  • タグ:
  • 登録タグはありません
  • タグ:
  • 登録タグはありません
…とは思いませんか。
私は思います。
なのでスクリプト制御を使います。
と思ったのですがやはりあまり良くない方法の様なので止めておきます

1、適当に図形を置く
2、図形にスクリプト制御を適用し

K_pos={}
K_Layer=obj.layer-1
local t=obj.layer-K_Layer
K_pos[t*3-2]=obj.x+obj.ox
K_pos[t*3-1]=obj.y+obj.oy
K_pos[t*3]=obj.z+obj.oz


3、その図形をCtrl+Dで一つ増やし オレンジ色の行を削除

local t=obj.layer-K_Layer
K_pos[t*3-2]=obj.x+obj.ox
K_pos[t*3-1]=obj.y+obj.oy
K_pos[t*3]=obj.z+obj.oz

4、その図形をCtrl+Dで増殖
5、カスタムオブジェクト格子線の座標に K_pos と入力

以上です。
格子線自身のアンカーポイントを触らないように
左上にある謎のマウスマークをクリックしてロックしておきます。

zバッファonのカメラ制御下ではアングルによっては消えてしまいます。ナンデ?
きっとあまり良い方法ではないのでしょう。




デフォルトにあるカスタムオブジェクトの多角形や
トラッキングライン2Dに使いたい場合は
K_pos[t*2-1]=obj.x+obj.ox
K_pos[t*2]=obj.y+obj.oy


※ 個別オブジェクトの座標を使いたい場合

※テキスト個別はフォントによっては上手くいかないようです。ナンデ?
画像ループ個別やオブジェクト分割等に。

--個別オブジェクトの座標を取得

if obj.index==0 then
multi_obj={}
end
multi_obj[obj.index+1]={obj.ox+obj.x,obj.oy+obj.y,obj.oz+obj.z}


local t={}

for i =1,(#multi_obj) do
for j=1,3 do
table.insert(t,multi_obj[i][j])

end
end
koushi_p=t --格子線などに koushi_p

local t2={}
for i =1,(#multi_obj) do
t2[i*2-1]=multi_obj[i][1]
t2[i*2]=multi_obj[i][2]

end
takaku_p=t2 --多角形やTrackingライン2D等に takaku_p




omake
上記の色付文字の個別オブジェクトの座標を取得している場合にだけ使える
意味不明のエフェクト。TA円形など+ランダム移動した後に座標を取得するとなんかでます
※以下はサイズ1の四角形にスクリプト制御。


local maxdistance=100 --消え始める距離
function poly_u_A(murti_obj,p1,p2,p3,p4,dist)
local function length(P1,P2)
D = math.sqrt((P1[1]-P2[1])^2+(P1[2]-P2[2])^2+(P1[3]-P2[3])^2)
return D end

local alp=obj.alpha
local p4=p4 or p3
local T={p1,p2,p3,p4}
local idx = multi_obj
local v ={}

for i =1,4 do
v[i*3-2]=idx[T[i]][1]
v[i*3-1]=idx[T[i]][2]
v[i*3-0]=idx[T[i]][3]

end
local maxdist=math.max(length(idx[1],idx[2]),length(idx[2],idx[3]),
length(idx[3],idx[4]),length(idx[4],idx[1]))

alp=math.min(1,1/math.exp((maxdist-dist)/100))
if alp<1/10000 then alp=0 end

local u1,v2=obj.getpixel()
local u0,v0=0,0
local x0,y0,z0,x1,y1,z1,x2,y2,z2,x3,y3,z3=unpack(v)
obj.drawpoly(x0,y0,z0,x1,y1,z1,x2,y2,z2,x3,y3,z3, u0,v0,u1,v0,u1,v2,u0,v2,alp)
end

local m_pol=multi_obj
table.insert(m_pol,m_pol[1])
table.insert(m_pol,m_pol[2])


for i=1,#m_pol-2 do
poly_u_A(m_pol,i,i+1,i+2,i+2,maxdistance)
end

----------------------owari

--最後の太字文を以下と書き換えるといい加減に面生成する

for i=1,#multi_obj-1 do
poly_u_A(multi_obj ,i,i+1,#multi_obj-i,#multi_obj-i,maxdistance)
end
--ナニコレ









Layerに数値、変数、テキストを与えると一つの配列に纏める関数

基本、Layerはテーブルで書く。 Layer={1,2,a,b,"t","pos"}
数値はレイヤー、
変数は3の倍数の配列、 a={obj.x,obj.y,obj.z, -obj.x,-obj.y,-obj.z} --等
テキストは「
パラメータ格納@自動座標取得」で付けた名前を意味します。

xyに1を入れると纏めた後、z軸要素を取り除く GetLayer(Layer,1)
Layer が数値の場合は単一レイヤーの座標を配列にする(謎)

引数無し GetLayer() だと現在のオブジェクトの座標を相対座標込で配列に纏めます。
以前の記事のposition()と同様。


function GetLayer(Layer,xy)

local type = function(v)
local v = v
local s = tostring(v)
if(s == v)then return "s" end
if(string.find(s, "table:"))then return "t" end
return "n"
end

local P={}
local L = Layer
local GV=obj.getvalue
local V=get_val_all
local T={"x","y","z",".x",".y",".z"}
local E ="layer"
if Layer==nil then
P[1]=obj.x+obj.ox P[2]=obj.y+obj.oy P[3]=obj.z+obj.oz
return P

elseif type(L)=="t" then
for i =1,#L do

if type(L[i])=="s" then
for j=1,3 do
table.insert(P,V[L[i]..T[j]])
end
elseif type(L[i])=="n" then
for k=1,3 do
local U=E..L[i]
table.insert(P,GV(U..T[k+3]))
end
elseif type(L[i])=="t" then
for l = 1,#L[i] do
table.insert(P,L[i][l])
end
end
end
end
if type(L)=="n" then
for i=1,3 do
P[i]=GV(E..L..T[i+3])
end
end

if (xy==1) then
for i=1,#P/3 do
table.remove(P,i*2+1) end
end
return P
end


function LookAt(p)
--pにレイヤー番号か座標(配列で)を入れるとz軸が自動回転。まんま。

local type = function(v)
local v = v
local s = tostring(v)
if(s == v)then return "string" end
if(string.find(s, "table:"))then return "table" end
return "number"
end

local X1=obj.x+obj.ox
local Y1=obj.y+obj.oy
if type(p)=="number" then

X2=obj.getvalue("layer"..p..".x")
Y2=obj.getvalue("layer"..p..".y")
elseif type(p)=="table" then
X2=p[1]
Y2=p[2]
elseif type(p)=="string" then
X2=get_val_all[p.."x"]
Y2=get_val_all[p.."y"]

end

local rot=math.deg(math.atan2(Y2-Y1,X2-X1))
obj.rz=obj.rz+rot+90
return rot
end


レイヤー番号を入れるとてきとーに面で結ぶ、距離で消える
LP({3,4,5,6,7,8,9},500) --レイヤー3,4,5,6,7,8,9にあるオブジェクトをポリゴンで結ぶ、結ぶ点同士距離が500を超えるとフェード。GetLayer関数を何処かで実行済み前提


function LP(Layer,distance)
local function Tri_p(p1,p2,p3,distance)
local T={p1,p2,p3} --レイヤ番号3つ
local Start=distance --消え始める距離
local function L(P1,P2) --lengthまんま
D = (P1[1]-P2[1])^2+(P1[2]-P2[2])^2+(P1[3]-P2[3])^2
return D end

local G=GetLayer --GetLayer==レイヤー番号で座標を獲得する関数
local v={}

for i =1,4 do
j=i
if i>3 then j=3 end
v[i*3-2]=G(T[j])[1]
v[i*3-1]=G(T[j])[2]
v[i*3-0]=G(T[j])[3]
end

local len=(L(G(T[1]),G(T[2]))+ L(G(T[2]),G(T[3])) + L(G(T[3]),G(T[1]) ))/3

--三点の距離平均
len=math.sqrt(len)-Start
local alp=math.min(1,1/math.exp(len/100))
local u1,v2=obj.getpixel()
local u0,v0=0,0
local x0,y0,z0,x1,y1,z1,x2,y2,z2,x3,y3,z3=unpack(v)
obj.drawpoly(x0,y0,z0,x1,y1,z1,x2,y2,z2,x3,y3,z3, u0,v0,u1,v0,u1,v2,u0,v2,alp)
end

table.insert(Layer,Layer[1])

for i=1,#Layer do
Tri_p(Layer[i],Layer[i+1],Layer[#Layer],distance)
end

for j=1,#Layer-2 do
Tri_p(Layer[j],Layer[j+1],Layer[j+2],distance)
end

end


--個別オブジェクト用,物凄くてきとーに面で結ぶ、距離で消える、modeの数値で配置パターンの変化するけどぶっ壊れている
--個別オブジェクトの座標を取得前提 MP(multi_obj,300,1)


function MP(multiobj,distance,mode)
local mode=math.floor(mode) or 0
local function L(P1,P2)
D = (P1[1]-P2[1])^2+(P1[2]-P2[2])^2+(P1[3]-P2[3])^2
return D end

local PM=multiobj
local function poly_m(p1,p2,p3,distance)
local T={PM[p1],PM[p2],PM[p3],PM[p3]}
local v ={}
for i =1,4 do
v[i*3-2]=T[i][1]
v[i*3-1]=T[i][2]
v[i*3]=T[i][3]
end

local len=(L(T[1],T[2])+ L(T[2],T[3]) + L(T[3],T[1]))/3
len=math.sqrt(len)-distance
local alp=math.min(1,1/math.exp(len/100))

local u1,v2=obj.getpixel()
local u0,v0=0,0
local x0,y0,z0,x1,y1,z1,x2,y2,z2,x3,y3,z3=unpack(v)
obj.drawpoly(x0,y0,z0,x1,y1,z1,x2,y2,z2,x3,y3,z3, u0,v0,u1,v0,u1,v2,u0,v2,alp)
end


for i=1,#PM-1-mode do
poly_m(i,i+1+mode,#PM-mode,distance)
end
for j=1,#PM-1-mode do
poly_m(j,j+1+mode,1+mode,distance)

end
end



簡易版obj.getaudio,アニメーション効果のダイアログで直接使いたかったので
audio(12) = オーディオスペクトラムを12分割した配列を返す
audio(12,3) = 上記の配列の3番目の値を一応返す
audio(12,3,700) =上記の値の(0 ~ 700)の範囲を(0< ~ ≦1)の自然対数に変換した値を返す手抜き用
(expがマイナスだと1~0の動作反転)
obj.alpha=audio(6,3,1000) --音に合わせて消える
obj.ox=audio(1,1,600)*200 --音に合わせてx座標が0~200の範囲で動く,

function audio(div,freq,exp)
--div(分割数)[,freq(配列の位置),exp(0~1の範囲で動く値に変換,expはバッファの最大値)]

buf={}
val = obj.getaudio(buf,"audiobuffer","spectrum",div)
if freq==nil then
return buf

elseif exp==nil then
val=buf[freq]

return val
elseif exp<0 then
val=math.exp(buf[freq]/exp)
return val
else
val=1-(exp/math.exp(buf[freq]/exp))/exp
return val
end
end




個別座標再配置スクリプト
これはアニメーション効果です、メモ帳などにコピペし、拡張子を .anm にして保存、
scriptフォルダに入れて読み込ませます


--track0:倍率,-1000,1000,100
--track1:X倍率,-1000,1000,100
--track2:Y倍率,-1000,1000,100
--track3:Affect,-1000,1000,100
--dialog:座標,pos={};3Dアンカー/chk,local D=0;Z倍率,local Z=100;

--[[
あっくんさんがtwitterでつぶやいていたネタです
アンカーポイントで個別テキストなどを好きな位置に移動可能です。
TAの前にこれをかけるとTAを使いつつ自由に配置出来るようです。
トラックバーのAffectを0にするとスクリプトを掛ける前の配置になります。
これを利用した多段重ねで色々な配置を記録できます。
倍率はおまけ。
仕様上2Dモードでは最大16文字まで、3Dは6~12文字前後までしかまともに動きません。
]]

local zoom=obj.track0/100

Z=Z/100 or 1
local X,Y,moto = obj.track1/100, obj.track2/100,obj.track3/100

if D==1 then

obj.setanchor("pos",obj.num,"line","xyz")
obj.ox=pos[obj.index*3+1]*(zoom*X*moto)+(obj.ox-obj.ox*moto)
obj.oy=pos[obj.index*3+2]*(zoom*Y*moto)+(obj.oy-obj.oy*moto)
obj.oz=pos[obj.index*3+3]*(zoom*Z*moto)+(obj.oz-obj.oz*moto)

else
obj.setanchor("pos",obj.num,"line")
obj.ox=pos[obj.index*2+1]*(zoom*X*moto)+(obj.ox-obj.ox*moto)
obj.oy=pos[obj.index*2+2]*(zoom*Y*moto)+(obj.oy-obj.oy*moto)

end




コメント

iori/キ
No.1 (2015/02/23 16:24)
うぐっぐ...うぐぐ...これが理解できたら93さんのようなかっこいい動画が...!?
C・L_another
No.2 (2016/04/03 04:02)
ま じ で わ か ん な い(鼻水垂らしながらアホ顔の表情で言っている)
コメントを書き込むにはログインしてください。

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