ベジェ軌道上に個別オブジェクトを置く
ベジエ軌道
三次のベジエ軌道は、始点、終点、2つの制御点から成ります。
4つの点から三次関数の係数を求めるには以下のようにします。
$ a=-p_{0} + 3p_{1} -3p_{2} + p_{3}
$ b= 3p_{0} -6p_{1} + 3p_{2}
$ c= -3p_{0} + 3p_{1}
$ d= p_{0}
座標と角度とアークタンジェント
座標(ベクトル)から角度を求めるには、arctanを使います。luaにはmath.atan2()がありますね。オブジェクトの底辺が常に(0, 0)を向くようにするには以下のように書きます。
code:lua
obj.rz=math.deg(math.atan2(obj.x, -obj.y))
aviutlの座標系は、右下が第一象限、左下が第二象限です。回転方向(obj.rz)と対応させるには-obj.oyとなるので、注意が必要ですね。
スクリプトを書く
はい、材料が揃いました。
ベジェ軌道の制御点から三次関数の係数を求め、個別オブジェクトの座標を決めます。
また、三次関数の微分が接線方向となるので、微分(ベクトル)からarctanで角度を求め、回転させます。
code:TA_Bezier_M.lua
--[[
TA_Bezier_M.anm
ベジェ軌道にテキストをのせるやつ
]]
--track0:offset,-100,100,0,0.01
--track1:width,0,500,100,0.01
--track2:rotZ,-3600,3600,0,0.01
--dialog:set_anchor,pos={-200,0,-200,100,200,-100,200,0};
--アンカー
obj.setanchor("pos", 4, "line")
--制御点->三次関数の係数
local function BezierCoefficient(p1,p2,p3,p4)
local c={}
c1 = -1 * p1 + 3 * p2 - 3 * p3 + 1 * p4 c2 = 3 * p1 - 6 * p2 + 3 * p3 return c
end
--三次関数
local function BezierLineC(c,t)
return ((c1*t+c2)*t+c3)*t+c4 end
--三次関数の微分
local function BezierLineC1(c,t)
return (3*c1*t+2*c2)*t+c3 end
local cx=BezierCoefficient(pos1,pos3,pos5,pos7) local cy=BezierCoefficient(pos2,pos4,pos6,pos8) local width=obj.track1/100
local offset=width*(obj.index+obj.track0)/obj.num
local ax=BezierLineC(cx, offset)
local ay=BezierLineC(cy, offset)
local ar=math.deg(math.atan2(BezierLineC1(cx, offset), -BezierLineC1(cy, offset)))-90
obj.ox=ax
obj.oy=ay
obj.rz=obj.rz+obj.track2+ar
by metaphysical bard