5
$\begingroup$

I'm designing software for generating animation curves. I'd like the curves to be based on those found in Blender 3D, which they call "F-Curves." According to the page on the Blender Wiki, they are similar to Bezier curves but they are a function of time rather than a parametric function. This is necessary because the property that the curve represents cannot have more than one value at any given time.

So far, I haven't been able to find a mathematical definition for an F-Curve. Does anyone here know they are defined? The screenshots on the wiki page might give some clues. Are they just Bezier curves with a restricted set of inputs? Or are they something fundamentally different?

Edit: Here's a screenshot of the curve. It's important that the control points have the ability to influence the curve more or less than an adjacent control point. This is possible with Bezier curves, but once the influence of one control point is strong enough, you can get loops in the curve or the curve will turn back on itself, both of which are undesirable for an F-Curve.

enter image description here

$\endgroup$
1
  • $\begingroup$ Wikipedia says An FCurve (also written f-curve) is a function curve or the graph of a function. An example of a FCurve is a spline. Apart from being a function of time, I think that you may have to read the implementation in order to understand Blender's definition of an F-Curve (the interpolation algorithms, etc). $\endgroup$
    – chubakueno
    Jun 28, 2014 at 6:33

1 Answer 1

1
$\begingroup$

My guess is that they are cubic Hermite polynomials. These are indeed closely related to Bézier curves. They are sometimes called F-curves because they were popularized in CAD by someone named Jim Ferguson.

The idea is that you can construct a cubic curve by interpolating given values and slopes at its two end-points. Specifically, suppose you are given two values $p_0$ and $p_1$, and two end-slopes $q_0$ and $q_1$. Define a function $f(t)$ by $$ f(t)= (2t^3-3t^2+1)p_0 + (3t^2 - 2t^3)p_1 + (t^3-2t^2+t)q_0 + (t^3-t^2)q_1 $$ Then it's easy to verify that $f(0)=p_0$, $f(1)=p_1$, $f'(0)=q_0$, and $f'(1)=q_1$.

More details here.

$\endgroup$
4
  • $\begingroup$ Thanks for the quick response. Correct me if I'm wrong, but it looks like the only control I'd have over a given endpoint is its position and the slope of the tangent. However, if most animation curve editors, I can also give the slopes a strength so that one endpoint's tangent has a greater effect on the curve than another's. Is this possible with cubic Hermit polynomials? (I'll add a screenshot to my original question in case this one was unclear) $\endgroup$
    – Justin
    Jun 28, 2014 at 15:10
  • $\begingroup$ With real-valued functions, where $f(t)$ is just a number, what you say is true; you only have four control variables -- the end values and the end slopes. Another approach would be to use vector-valued functions. So , you interpret the end points and end derivatives as 2D vector quantities, which means that $f(t)$ will also be a 2D position. Then the lengths of the derivative vectors $q_0$ and $q_1$ give you the "strength" control you asked about. But then there is a problem if you want to get a $y$ value from a given $x$ value. It can be done, but it involves solving a cubic equation. $\endgroup$
    – bubba
    Jun 30, 2014 at 0:21
  • $\begingroup$ The vector-valued functions I described in the comment above are essentially just Bézier curves, of course. $\endgroup$
    – bubba
    Jun 30, 2014 at 0:23
  • $\begingroup$ If you want more degrees of freedom in a real-valued function, you'll have to use degree higher than 3. But my guess is that this is not what Blender is doing. $\endgroup$
    – bubba
    Jun 30, 2014 at 0:25

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .