Computing normals for 3D Bézier curves
pomax.github.io
pomax.github.io
So I finally managed to get a better approach documented, based on a nice paper on Rotation Minimising Frames, with some textual explanation, some code for the programmers amongst us, and an interactive graphic to show how much better that is compared to Frenet normals.
My projection method fails when the tangent turns more than 90 degrees, of course, so adaptive sampling of the curve is required for the general case. I assume that adaptive sampling is still required for the method presented here? Are there some advantages to mirroring around the midpoint’s tangent plane?
It is worth noting that for the Quadratic Bézier curve, the Frenet Frame is a rotation minimizing frame. Frenet & RMF only differ for cubics and higher.
This guide is excellent, BTW, I refer to it all the time. Thank you!
Getting a tangent to change that drastically over a small interval is quite hard, except on a cusp, where the curve itself is discontinuous (so anything that happens at the cusp is always going to be wrong). Of course, cusps only occur in planar curves, but you _could_ still run into that. Splitting the curve at the cusp and treating it as two curves, to be joined "however is the most aesthetically pleasing way" is basically your only option.
A shift and renomalization is a very efficient RMF, but can lead to weird things when the projected binormal ends up lying in the plane of curvature. Say, a curve that starts off going up and left/right, then changes direction from left/right to front/back. If we're not framing on small enough intervals, the binormal of a frame on one side of that change projected to the other side of that change will suddenly lie in the plane of curvature, and renormalisation can suddenly be broken.
FWIW, I ran into near cusps with 3D curves immediately in production with hair physics simulations. They don’t happen a lot, but the frames are needed for guide hairs, so popping when frames flip is extremely noticeable, even though they not crazy common.
> Splitting the curve at the cusp and treating it as two curves, to be joined "however is the most aesthetically pleasing way" is basically your only option.
I came up with an adaptive sampling method that can guarantee a step size with no more than a given minimum change of angle. It worked well in my case for CG hair with cubics. (Not published, but happy to describe if you have any interest.)
I’ve also seen a really neat parametric remapping method for quadratics that can precompute all parameter values with an exact constant change of angle for every step.
The other advantage of maximum angle sampling is when calculating arc length of a curve with piecewise approximation.
Anyway, It’s entirely possible that seeing as many very near cusps as we did was because our physics simulation was under constrained or not very good. ;) But for whatever reason, my experience left me with the feeling that they’re common enough to be a serious concern, rather than rare and easily avoidable...
If you run into cusps a lot on a hair simulation, that feels like evidence of a bad model, but plenty of good things have been done with bad models so that's hardly an indictment on the process. If your model yields loads of cusps, you need a solution, and this type of RMF is probably a very expensive solution.
Using Unity's functions, it looks like the rotation for the current point can just be: ``` Q(t) = Quaternion.LookRotation(P(t)-P(t-1), Q(t-1) * Vector3.up); ``` (where Q is the list of rotations and P is the set of Points)
Possible also with the method IQ defines in this article (accumulating aligning delta rotations over the course of the curve): http://iquilezles.org/www/articles/noacos/noacos.htm
My point is that Bézier curves have great bang for the buck. A kid can understand the principle and an adult mathematician/engineer can write a thesis about them. And the curves look equally pretty to both parties. The topic sucks you in!
[With that said, I think this is actually a really nice article, and well-presented.]
The "computer equivalent of bike-shedding" would be arguing over indentation style[0] and tabs vs. spaces, or over naming conventions[1].
I'm not sure that the thing you're pointing out has a name, actually, but it also shows up in the form of endlessly reimplemented canonical example apps like todo lists as well as the examples you cited.
A related phenomenon - I think - is Zawinski's law of software envelopment[2], as "reading mail" is the kind of feature that meets the same sweet-spot criteria.
[0] https://en.wikipedia.org/wiki/Indentation_style
[1] https://en.wikipedia.org/wiki/Naming_convention_(programming...
[2] http://www.catb.org/~esr/jargon/html/Z/Zawinskis-Law.html
I still see almost no articles in this space: they're all either the (super valuable) jason davies style "here is why they work, it's just linear interpolation!" pages, or very short explanations that give the calculus expression, and then... stop. This in contrast to linear algebra and calculus, which as general maths subjects have an almost countless number of free ebooks, book-sites, college professors putting up slide decks for their entire courses, and researchers making their phd theses and research papers available online.
This is still a niche subject (it's a tiny speck in the Venn diagram of calculus, linear algebra, geometry, and graphics programming), especially as most people don't need to know anything about Bezier curves to _use_ them in things like CSS or Illustrator; you can make them do what you want just by playing with them.
If you need to program with them, though, you have a problem: of course, you can find all the information in this primer if you want to look up 30 different web pages that all cover each section on their own, with disjointed maths notation and level of detail, but that's how you figure out any niche subject in the absence of single page resources like this primer =)
That’s how Hacker News works. To make the front page, enough people have to up-vote the article.
I think comments might influence the article ranking too, but I don’t know that. If you’re not interested in this topic, why comment on the article?
As to why there might be a lot of developers on Hacker News interested in Bézier curves, they’re used a lot, and they’re taught a lot. More or less all video games & CG movies ever made use them for animation & modeling. Most fonts in use are defined by Bézier curves. SVG & web animations use Bézier curves. Motion planning and mapping people use them for boundaries & routes. And those are just a few applications.
What good would confirming that some other people feel the same way do? We've already established that the fact people are both submitting and up-voting Bezier articles means that there are enough people interested, relative to other articles. The existence of this article on the front page means that the only thing wrong here is your own expectation that people aren't interested in Bezier curves, right? Personally, I'm pretty sure that some people reading HN don't care about Bezier curves, but I know for a fact that quite a few do, because enough people are posting and bubbling up articles on the topic.
I have no idea what percentage of the HN crowd cares about Bezier curves, but fortunately it doesn't take a majority to get articles on the front page. I love that niche topics come across the front page, that it only takes a handful of interested people. That's exactly why I come to HN.
So, enjoy it and have fun. If you want HN articles to have more things you find interesting, then submit and up-vote the things you care about.
My normal pace of writing new sections is "maybe once every half year", this time I was requested to write about rotation minimising frames less than a month after the previous update, so if you remember seeing this same primer last month: you did indeed, although it was on a completely topic (namely, curve fitting).