class Tracksperanto::Tool::Lerp
This tool adds linearly interpolated keyframes BETWEEN the keyframes passing through the exporter
Public Class Methods
action_description()
click to toggle source
# File lib/tools/lerp.rb, line 4 def self.action_description "Interpolate missing keyframes of all the trackers" end
Public Instance Methods
end_tracker_segment()
click to toggle source
Calls superclass method
# File lib/tools/lerp.rb, line 8 def end_tracker_segment @last_f, @last_x, @last_y, @last_res = nil, nil, nil, nil super end
export_point(frame, float_x, float_y, float_residual)
click to toggle source
Calls superclass method
# File lib/tools/lerp.rb, line 13 def export_point(frame, float_x, float_y, float_residual) if @last_f && (frame - @last_f > 1) # Interpolate! interpolated_frames = [] interpolated_x = [] lerp(@last_f, @last_x, frame, float_x) do | interp_f, interp_x | interpolated_frames << interp_f interpolated_x << interp_x end interpolated_y = [] lerp(@last_f, @last_y, frame, float_y) do | interp_f, interp_y | interpolated_y << interp_y end interpolated_res = [] lerp(@last_f, @last_res, frame, float_residual) do | interp_f, interp_res | interpolated_res << interp_res end tuples = interpolated_frames.zip(interpolated_x).zip(interpolated_y).zip(interpolated_res).map{|e| e.flatten } tuples.each do | f, x, y, r | super(f.to_i, x, y, r) end else super(frame, float_x + (@x_shift || 0), float_y + (@y_shift || 0), float_residual) end @last_f, @last_x, @last_y, @last_res = frame, float_x, float_y, float_residual end
Private Instance Methods
lerp(last_x, last_y, x, y) { |interp_x, interp_y| ... }
click to toggle source
Do a simple linear interpolxion. The function will yield the interim X and Y, one tuple per whole value between the set points, and return the last tuple (so you can return-assign from it in a loop)
# File lib/tools/lerp.rb, line 48 def lerp(last_x, last_y, x, y) #:yields: interp_x, interp_y if last_x.nil? yield(x, y) else gap_size = x - last_x increment = (y.to_f - last_y) / gap_size.to_f (1..gap_size).each do | index | yield(last_x + index, last_y + (increment * index)) end end return [x, y] end