ニコニコチャンネルメニュー

ブロマガ - ニコニコチャンネル

93のブロマガ

AviUtl拡張編集で3D空間に直線を引く関数

2016/08/01 00:35 投稿

コメント:2

  • タグ:
  • AviUtl


polyline = function(
p0, --点座標0
p1, --点座標1
width, --線幅(省略可)
color, --線色(省略可)
alpha --透明度(省略可)
)
local g=obj.getvalue
local w,h=0,0
if color then
obj.load("figure","四角形",color,1)
else
w,h=obj.getpixel()
end
alpha = alpha or 1
width = width or 1
local c = obj.getoption("camera_param")
local a = {p1[1]-p0[1], p1[2]-p0[2], p1[3]-p0[3]}
local b = {c.x-p0[1], c.y-p0[2], c.z-p0[3]}
local n = {a[2]*b[3]-a[3]*b[2],a[3]*b[1]-a[1]*b[3],a[1]*b[2]-a[2]*b[1]}
local l = math.sqrt(n[1]*n[1] + n[2]*n[2] + n[3]*n[3])
local nx,ny,nz = (n[1]/l)*width*.5, (n[2]/l)*width*.5 ,(n[3]/l)*width*.5
local x0,y0,z0 = p0[1]-nx,p0[2]-ny,p0[3]-nz
local x1,y1,z1 = p1[1]-nx,p1[2]-ny,p1[3]-nz
local x2,y2,z2 = p1[1]+nx,p1[2]+ny,p1[3]+nz
local x3,y3,z3 = p0[1]+nx,p0[2]+ny,p0[3]+nz
obj.drawpoly(x0,y0,z0, x1,y1,z1, x2,y2,z2, x3,y3,z3,0,0,w,0,w,h,0,h,alpha)
end


・座標p0と座標p1を結ぶ線を作ります。点の座標は テーブル {x,y,z} 入力。
・widthは線の幅、(0.1なども可)
・alphaは透明度、
・colorは色を指定します。(指定なしだと現在のオブジェクト自体を横に引き延ばします)

カメラを動かしても太さがまあまあ変化しずらい線を引きます。細いとそれなりの見栄えです。
直接フィルタ効果はかけられないのでフレームバッファなどを使用してください。
※二点とカメラ位置で作った面の法線方向に線幅をとるというやり方なので
すべて一直線に並ぶとさすがに見えなくなってしまいます。
またオブジェクト自体をトラックバーやグループ制御で回転させた場合も消えるアングルができます。

--例00
--原点から上に線を伸ばします
local p0={0,0,0}
local p1={0,-400,0}
polyline(p0,p1,4,0xffff12)

--例01
--オブジェクトに移動させるアニメーションをつけると軌跡を作ります
local n=42 --分割数
local delay=1 --ずれ時間
if obj.time-delay<obj.totaltime then
delay = delay * (obj.totaltime-obj.time)
end
local g=obj.getvalue
local x,y,z
obj.copybuffer("tmp","obj")
for i=0,n-1 do
obj.copybuffer("obj","tmp")
local t=obj.time - delay/n*i
t=math.max(0,math.min(t,obj.totaltime))
local p0={x,y,z}
x=g("x",t)-obj.x
y=g("y",t)-obj.y
z=g("z",t)-obj.z
local p1={x,y,z}
obj.alpha = 1-(i/(n-1))
obj.draw(x,y,z)
if i>0 then
polyline(p0,p1,1,0xffffff,obj.alpha)
end
end


--例2
-- tのカッコに入れたレイヤーを結ぶ線を作ります
local t = {7,8,9,10,11,12} --線で結びたいレイヤーを。

local g=obj.getvalue
local l="layer"

-- すべて結ぶ線を作ります
for i=1,#t do
for j=i,#t-1 do
local p1 = {g(l..t[i]..".x"),g(l..t[i]..".y"),g(l..t[i]..".z")}
local p2 = {g(l..t[j%#t+1]..".x"),g(l..t[j%#t+1]..".y"),g(l..t[j%#t+1]..".z")}
polyline(p1,p2,1,0xffffff)
end
end

--こちらはぐるっと一周する線を引くパターン
for i=1,#t do
local p1 = {g(l..t[i]..".x"),g(l..t[i]..".y"),g(l..t[i]..".z")}
local p2 = {g(l..t[i%#t+1]..".x"),g(l..t[i%#t+1]..".y"),g(l..t[i%#t+1]..".z")}
polyline(p1,p2,1,0xffffff)
end


コメント

yuumaww
No.1 (2016/10/01 16:22)
場違いコメントですみません
個別座標再配置スクリプトの説明のドロップボックスのリンクが切れているので修正をお願いします
93 (著者)
No.2 (2016/10/09 21:00)
指摘ありがとうございます。修正しました。
コメントを書き込むにはログインしてください。

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