2014/11/24(月) [n年前の日記]
#1 [dxruby][spriter] Cubic Bezierとやらを実験
Spriter の補間曲線は3種類から選べるのだけど。
3次ベジェ曲線は4つの制御点を必要とするけれど、Spriter の補間曲線設定画面を見る限り、以下のような値になってる予感。
ということで、DXRuby を使って3次ベジェ曲線を描いて検証。
_3次ベジェ曲線の数式 を参考にさせてもらいました。ありがたや。
x座標値と t の値がずれるのかなと思ったけれど、見た目は同じっぽい。ということは、t を与えてy値だけを得て、その値を補間用の割合として使えそうかなと。x座標値は使わないし、y1 = 0、y4 = 1 なので、式も少し簡単にできそう。
- linear : 直線
- Instant : 補間なし
- Custom (Cubic) : Spriter free 版では Cubic のみ選べる。
3次ベジェ曲線は4つの制御点を必要とするけれど、Spriter の補間曲線設定画面を見る限り、以下のような値になってる予感。
- 開始点 : (0, 0)
- 制御点A : (1/3, c1)
- 制御点B : (2/3, c2)
- 終了点 : (1, 1)
ということで、DXRuby を使って3次ベジェ曲線を描いて検証。
# cubic-bezier test require 'dxruby' def draw_cubic_bezier(x1, y1, x2, y2, x3, y3, x4, y4, col0, col1) ox, oy = x1, y1 0.step(1.0, 0.05) do |t| tp = 1.0 - t a = t ** 3 b = 3 * (t ** 2) * tp c = 3 * t * (tp ** 2) d = tp ** 3 x = a * x4 + b * x3 + c * x2 + d * x1 y = a * y4 + b * y3 + c * y2 + d * y1 Window.drawLine(ox, oy, x, y, col0, 10) Window.drawBoxFill(x-1, y-1, x+1, y+1, col1, 20) ox, oy = x, y end end fnt = Font.new(14) Window.loop do break if Input.keyPush?(K_ESCAPE) x1, y1 = 0, 0 x4, y4 = (Window.width - 1), (Window.height - 1) r0 = (Input.mousePosX.to_f / Window.width) r1 = (Input.mousePosY.to_f / Window.height) x2, y2 = (Window.width * 0.333), Window.height * r0 x3, y3 = (Window.width * 0.666), Window.height * r1 0.step(1.0, 0.05) do |t| x = t * Window.width Window.drawLine(x, 0, x, Window.height, [64, 64, 64]) end Window.drawBoxFill(x2 -2, y2 -2, x2 +2, y2 +2, C_RED) Window.drawBoxFill(x3 -2, y3 -2, x3 +2, y3 +2, C_RED) draw_cubic_bezier(x1, y1, x2, y2, x3, y3, x4, y4, C_BLUE, C_GREEN) Window.drawFont(4, 4, sprintf("CPU %4d %", Window.getLoad), fnt) endマウスカーソルを動かすと、中間にある2つの制御点の位置が変わる。
_3次ベジェ曲線の数式 を参考にさせてもらいました。ありがたや。
x座標値と t の値がずれるのかなと思ったけれど、見た目は同じっぽい。ということは、t を与えてy値だけを得て、その値を補間用の割合として使えそうかなと。x座標値は使わないし、y1 = 0、y4 = 1 なので、式も少し簡単にできそう。
[ ツッコむ ]
以上です。