[HN Gopher] Quaternions
       ___________________________________________________________________
        
       Quaternions
        
       Author : the_origami_fox
       Score  : 273 points
       Date   : 2021-12-10 14:30 UTC (8 hours ago)
        
 (HTM) web link (liorsinai.github.io)
 (TXT) w3m dump (liorsinai.github.io)
        
       | Chabsff wrote:
       | I've been out of the games sphere for a long time, but is slerp()
       | really the default idiomatic interpolation approach in modern
       | games nowadays?
       | 
       | There are a vanishingly small number of scenarios where lerp() +
       | normalize() doesn't work perfectly well enough and it is
       | drastically faster and SIMD-friendly. That used to be the case at
       | least.
        
         | an1sotropy wrote:
         | as for why lerp+normalize isn't enough: it all depends on the
         | distance between things being blended, no? With far away end
         | points, the apparent speed of the rotation would be fast, slow,
         | fast, at the beginning, middle, end, which could be a bummer.
        
           | Chabsff wrote:
           | The two aspects that slerp() addresses over lerp() +
           | normalize() are 1) it can deal with pole-to-pole
           | interpolation 2) It always takes the shortest path.
           | 
           | In practice, the former is often provably never going to
           | happen, and the later doesn't actually matter from a
           | qualitative standpoint: Quaternion interpolation will always
           | look a bit weird over large angles, especially if there's a
           | roll component to one of the orientations.
           | 
           | As far as having a constant interpolation speed: again, this
           | is rarely perceptible, and truly linear transitions from one
           | orientation to another looks janky so some amount of
           | filtering happens anyways (an ease-in-ease-out for example).
           | 
           | But yeah, for very large interpolations, it can create a
           | slight authoring/runtime skew. My rule of thumb used to be:
           | use slerp() when the orientations can be at least 120 degrees
           | apart, or when lerp() yields weird results. However, it's
           | really rare to be interpolating over such a large orientation
           | change, you almost always have a few keyframes or dead-
           | reckoning syncs in between.
           | 
           | Again: This might be an outdated perspective though.
        
         | gugagore wrote:
         | You can see what's wrong with that approach by considering the
         | difference between traveling at constant speed along the arc of
         | a circle versus traveling at constant speed along a chord, and
         | projecting the point (out from the center) onto the arc.
         | 
         | It works great if the chord is far away from the center (and
         | also the angle is less than a half turn). If the chord goes
         | through the center, it doesn't work at all.
        
           | Chabsff wrote:
           | 10-12 years ago, the consensus used to be that this
           | singularity simply does not show up in the wild in the vast
           | majority of scenarios, and the performance hit of using
           | `slerp()` is just not worth it unless truly needed.
           | 
           | It was essentially the same reasoning as for using `-ffast-
           | math`. Yeah it's not "correct", but users can't tell the
           | difference and it has a measurable performance benefit.
           | 
           | To be clear, I'm not questioning using slerp() at all, it
           | definitely has a role to play. I'm just wondering about using
           | it by _default_ as implied by the post.
        
             | gugagore wrote:
             | Yeah, I understand. I just wanted to show that one can
             | understand the exact nature of the approximation in 2D
             | geometry.
             | 
             | I think it's useful to think of it as a separate category
             | of "wrong" than -ffast-math, which is "wrong" because two
             | expressions that are mathematically equivalent over real
             | numbers, like a + (b + c) and (a + b) + c, are not
             | equivalent over floating-point numbers.
             | 
             | Using lerp in place of slerp is like using x in place of
             | sin(x). (The small-angle approximation) They're not
             | equivalent over the real numbers.
        
               | Chabsff wrote:
               | My apologies. I thought you were providing an explanation
               | as to why slerp() is preferred in general. The circle
               | example is a really good way to frame the distinction.
        
         | dahart wrote:
         | I don't think the scenarios where uniform steps of angle is
         | vanishingly small. There are plenty of cases where it matters
         | to animators, on character rigs, on cameras
         | 
         | The amount that it matters depends on the angle between keys.
         | Suggesting it rarely matters means you're claiming nobody ever
         | animates large angles, which I can confidently say I've seen
         | plenty of counter-examples in game development.
         | 
         | I also wouldn't be so sure that lerp+normalize is that much
         | faster on today's GPUs. Normalize takes a sqrt and reciprocal
         | or divide, while slerp takes a few sin evaluations and a recip
         | or divide. These special functions these days execute in a
         | separate pipeline from linear (FMA) type instructions, and can
         | be had for "free" as long as you can mix enough independent
         | linear math in between the special functions. It used to be
         | that sin() was very slow, but these days you can often mix a
         | couple calls in without affecting your perf at all.
        
       | trylfthsk wrote:
       | W.R Hamilton's discovery of the Quaternions is semi-famous
       | itself, with the story being that after the critical flash of
       | insight he carved the equation describing quaternion
       | multiplication into a bridge in Ireland with a penknife.
       | 
       | A interesting read is this letter [0] written the following day,
       | where he explains his ideas in his own words. It's a great (and
       | accessible!) look into his thought process.
       | 
       | [0]
       | https://www.maths.tcd.ie/pub/HistMath/People/Hamilton/QLette...
        
         | ww520 wrote:
         | The story goes that he was with his wife going to a dinner. On
         | the way he got the flash of insight after years of working on
         | the problem but he had no paper to write it down. When passing
         | a bridge, he carved the equation on the side of the bridge to
         | remind himself on the way back after the dinner.
        
           | agumonkey wrote:
           | always have a bridge nearby whenever you're trying to enter
           | history
        
             | tiborsaas wrote:
             | Ah that explains my failed attempts. It was always too far.
        
               | Agentlien wrote:
               | A bridge too far?
        
       | Jun8 wrote:
       | 3B1B is also informative, especially in explaining why C was not
       | extended using triplets but 4-tuples were needed:
       | https://youtu.be/d4EgbgTm0Bg.
       | 
       | Here's a Math SE answer on why:
       | https://math.stackexchange.com/questions/1784166/why-are-the...,
       | here's a more ELI5 discussion:
       | https://www.reddit.com/r/math/comments/9urjyx/why_there_is_n....
       | I especially like this very intuitive comment in that thread :
       | https://www.reddit.com/r/math/comments/9urjyx/comment/e96j4l...
       | 
       | Left as an exercise to reader: prove that no such n-tuples exist
       | for n>4.
        
         | MayeulC wrote:
         | This comment is about C the set of complex numbers, not the
         | progamming language. It left me confused for a moment.
        
         | [deleted]
        
         | pdonis wrote:
         | _> prove that no such n-tuples exist for n >4._
         | 
         | It depends on how you define "such" n-tuples. The octonions (n
         | = 8) aren't associative, but they have all the other relevant
         | properties.
        
           | Jun8 wrote:
           | You're absolutely right, forgot to mention associativity: htt
           | ps://en.m.wikipedia.org/wiki/Frobenius_theorem_(real_divi...
        
       | h2odragon wrote:
       | Very nice thats a reference to keep and come back to thanks.
        
       | imadr wrote:
       | Very nice interactive visualizations! I've made a similar article
       | some time ago https://imadr.me/rotations-with-quaternions/
        
       | matsemann wrote:
       | About rotation and interpolation, I once had a bug in animated
       | CSS transforms of all things, in which IE decided to rotate the
       | element around another axis but still end up at the correct
       | position. That one made me raise my eyebrows. No idea if IE
       | actually was in the wrong, though, but in my head interpolating
       | the xyz value I'm changing feels like the correct way to do it.
        
       | newpavlov wrote:
       | In my opinion, Geometric Algebra and bivectors
       | (https://bivector.net) in particular is a much better (both
       | practically and pedagogically) approach compared to quaternions
       | and significantly more elegant. It's a real shame that people
       | continue to focus so much on quaternions in this day and age.
        
         | chombier wrote:
         | > It's a real shame that people continue to focus so much on
         | quaternions in this day and age.
         | 
         | No really, unit quaternions are nice because it's pretty clear
         | they belong to a sphere, therefore you can fairly easily extend
         | geometric methods on the usual sphere to perform filtering,
         | averaging, interpolation etc on rotations.
         | 
         | With GA it's not so obvious.
        
         | kilovoltaire wrote:
         | Came here to say this!
         | 
         | I always felt like quaternions weren't a perfect fit for 3d
         | rotation, and when I finally learned about bivectors my faith
         | in the elegance of mathematics was restored :D
         | 
         | I liked this article: https://marctenbosch.com/quaternions/
        
           | the__alchemist wrote:
           | > Why does i2=j2=k2=-1 and ij=k? Why do we take a vector and
           | upgrade it to an "imaginary" vector in order to transform it,
           | like q(xi+yj+zk)q*? Who cares as long as it rotates vectors
           | the right way, right?
           | 
           | Yikes! This is the sort of thing that scares people away from
           | complex numbers from a young age.
        
             | [deleted]
        
             | Twisol wrote:
             | Aren't you doing a bit of an injustice to that article by
             | cherry-picking that line? It's obviously written
             | humorously; the very next words are:
             | 
             | > Personally, I have always found it important to actually
             | understand the things I am using. I remember learning about
             | Cross Products and Quaternions and being confused about why
             | they worked this way, but nobody talked about it. Later on
             | I learned about Geometric Algebra and suddenly I could see
             | that the questions I had were legitimate, and everything
             | became so much clearer.
             | 
             | Clearly, "who care as long as" is not the true belief of
             | the author, but rather a mocking call-out of teachers who
             | do think that way.
        
         | chadcmulligan wrote:
         | GA strikes me as the monad's of physics
        
         | jvanderbot wrote:
         | Quanternions' ubiquity is relatively recent. Rotation matrices
         | ruled supreme in games and graphics and it was only after
         | concerted effort to abolish R's were Q's made ubiquitous.
         | 
         | Two heartbeats later, we're bearish on Q's.
        
         | joppy wrote:
         | Quaternions are the even part of the Clifford (aka Geometric)
         | algebra associated to a three-dimensional space, so the
         | connection is quite close. This case is also quite special
         | because the quaternions form a division algebra over the real
         | numbers, meaning that each nonzero quaternion has an inverse.
         | Finite-dimensional real division algebras are quite rare:
         | indeed the only ones up to isomorphism are the real numbers,
         | complex numbers, and quaternions.
         | 
         | Geometric algebra is great if you want to extend things to
         | higher dimensions, or spaces with different metric signatures
         | (the 4-dimensional spacetime for example). But quaternions
         | should not be discounted just because they fit into a
         | generalisation - they have many quite special properties all of
         | their own.
        
           | rovolo wrote:
           | To be pedantic, "each nonzero quaternion has a
           | _multiplicative_ inverse "
        
         | wyager wrote:
         | Specifically, GA allows you to invent complex numbers,
         | quaternions, etc. very easily instead of it taking hundreds of
         | years.
         | 
         | I've read _linear and geometric algebra_ and it 's amazing for
         | linear operations. Unfortunately it gets more complex when you
         | want to use it for nonlinear operations (such as translation) -
         | now you need to use CGA or PGA or something. Still, seems like
         | it would be amazing for computer graphics, physical simulation,
         | etc. especially if someone can figure out a good strategy for
         | efficient compilation (e.g. representing a multivector with
         | exactly the minimal number of non-zero entries, with non-zero
         | basis elements tracked at compile time).
        
         | ChrisLomont wrote:
         | GA is much slower in practice and takes more to store. In
         | places speed and cache are important, quaternions are much
         | better.
         | 
         | Game engines don't need much if anything from GA (and I've
         | written about using GA decades ago for software, and did it for
         | some time, before realizing that trading that elegance for
         | worse performance was not worth it).
         | 
         | Here's [1] one example from the godfather of GA demonstrating
         | how poorly GA performs
         | 
         | [1]
         | https://webspace.science.uu.nl/~kreve101/asci/GAraytracer.pd...
        
           | [deleted]
        
           | fanf2 wrote:
           | I have done some experiments with type-directed static
           | optimization of geometric algebra, but I didn't get far
           | enough to find out if it would scale up to real applications.
           | The idea was to represent in the type system which components
           | are known to be zero, so that (for instance) the GA
           | representation of a vector or a rotation is the same size as
           | it would be as a traditional matrix-based linear algebra. And
           | the type system can check that the resulting of an operation
           | is what you expect, eg, two planes intersect in a line. So,
           | similar optimizations to gaigen, but (I hoped) more automatic
           | and less runtime machinery. But as I said, I didn't get it to
           | work.
        
             | ChrisLomont wrote:
             | >the same size as it would be as a traditional matrix-based
             | linear algebra
             | 
             | You can get it that small, it's all been done, but that's
             | far larger than a quat, which can be stored in 3 components
             | when normalized, and in 4 for quick and easy computation.
             | 
             | For large models and more importantly scarce GPU memory,
             | increasing model size results in less complex models and
             | slower computation.
             | 
             | There really is no benefit for 3D engines I can tell (and I
             | was early on the GA bandwagon 20ish years ago... It just
             | has not and I suspect will never pan out due to the
             | inefficiencies not being worth it).
        
             | fault1 wrote:
             | i've played with some libraries recently in julia that
             | followed this strategy;
             | https://discourse.julialang.org/t/ann-cliffordalgebras-
             | jl/71...
             | 
             | and I was surprised at how high dimensionality you could
             | go. I'd like to see a c++20 version.
        
       | an1sotropy wrote:
       | David Eberly has written a huge amount of great and free intro
       | mathematical papers. The "Mathematics/Algebra" section of [1] has
       | a few things on quaternions, including a nice self-contained
       | linear algebra-based derivation of why it makes sense to
       | represent a rotation with four numbers, which ends up being a
       | sneaky introduction to quaternions [2]
       | 
       | [1]
       | https://www.geometrictools.com/Documentation/Documentation.h...
       | 
       | [2]
       | https://www.geometrictools.com/Documentation/LinearAlgebraic...
        
       | analog31 wrote:
       | Ask HN: Do quaternions have any interesting properties, akin to
       | those of complex numbers, when calculus is applied? The only
       | application I've ever seen is for doing rotations in computer
       | graphics.
        
         | Chabsff wrote:
         | Still mostly relevant to their use as encoding for
         | transformations, but the fact that a unit quaternion's
         | conjugate is also its inverse is _extremely_ useful from a
         | computational performance point of view.
        
         | fault1 wrote:
         | per wikipedia (hence the interest in twistors, spin spaces and
         | clifford algebras in physics):
         | 
         | Quaternions also capture the spinorial character of rotations
         | in three dimensions. For a three-dimensional object connected
         | to its (fixed) surroundings by slack strings or bands, the
         | strings or bands can be untangled after two complete turns
         | about some fixed axis from an initial untangled state.
         | Algebraically, the quaternion describing such a rotation
         | changes from a scalar +1 (initially), through (scalar +
         | pseudovector) values to scalar -1 (at one full turn), through
         | (scalar + pseudovector) values back to scalar +1 (at two full
         | turns). This cycle repeats every 2 turns. After 2n turns
         | (integer n > 0), without any intermediate untangling attempts,
         | the strings/bands can be partially untangled back to the 2(n -
         | 1) turns state with each application of the same procedure used
         | in untangling from 2 turns to 0 turns. Applying the same
         | procedure n times will take a 2n-tangled object back to the
         | untangled or 0 turn state. The untangling process also removes
         | any rotation-generated twisting about the strings/bands
         | themselves. Simple 3D mechanical models can be used to
         | demonstrate these facts.
        
         | AnimalMuppet wrote:
         | If I understand correctly, yes, calculus on quaternions is a
         | useful thing. I'm not sure whether or not you have an
         | equivalent of the residue theorem from the calculus of complex
         | variables, but I'm pretty sure that you can do path integrals
         | and stuff...
        
           | mathgenius wrote:
           | John Baez was tweeting about this recently:
           | 
           | https://twitter.com/johncarlosbaez/status/146720413326244659.
           | ..
        
       | ivanstojic wrote:
       | Interesting thing to remember: quaternions are a special
       | application of rotors, a concept which may be easier to
       | understand as a base:
       | 
       | https://marctenbosch.com/quaternions/
        
       | dr_orpheus wrote:
       | > I did not encounter quaternions in all my years of engineering,
       | although a lecturer once alluded to them during a class in my
       | masters.
       | 
       | I know that I am not coming in with same perspective as a lot of
       | the other software engineers/graphics developers, but I started
       | learning about quaternions freshman year of college. For
       | aerospace engineering quaternions are used almost exclusively for
       | spacecraft attitude determination and control. For a very dynamic
       | system they are very useful.
       | 
       | There are some limitations that I have seen, and I have seen
       | Rodrigues parameters (or modified Rodrigues parameters) used
       | instead which are mentioned near the end of the article.
        
       | btilly wrote:
       | Quaternion trivia.
       | 
       | There was at one point a debate in physics about whether it was
       | better to use quaternions or linear algebra for physics. With i,
       | j, and k being the unit vectors, and the real numbers
       | representing time. In the end, of course, linear algebra won. But
       | we still use i, j, and k as the unit vectors. And in electrical
       | engineering where i wound up hijacked for current, they use j as
       | the square root of -1.
        
       | darkstarsys wrote:
       | This is fine; there are lots of similar "intro to quaternions"
       | pages around. One thing I haven't seen yet is someone showing how
       | to interpolate between multiple quaternions over time, smoothly.
       | (Hint: it's not slerp.) It's a non-trivial problem.
        
         | JadeNB wrote:
         | > Hint: it's not slerp.
         | 
         | What is slerp?
        
           | chas wrote:
           | Spherical linear interpolation.
           | (https://en.m.wikipedia.org/wiki/Slerp)
        
         | chombier wrote:
         | See "A General Construction Scheme for Unit Quaternion Curves
         | with Simple High Order Derivatives" (Kim, 1995) for a simple
         | extension of Hermite splines to Lie groups, including unit
         | quaternions.
        
       | marcodiego wrote:
       | tldr: Simply explained without demonstrations: Quaternions are
       | hypercomplex numbers of the form
       | 
       | w + xi + yj + zk
       | 
       | Where w, x, y, and z are real and i^2 = j^2 = k^2 = -1 and ij =
       | k, ji = -k, jk = i, kj = -i, ki = j, ik = -j.
       | 
       | Being u = (x, y, z) = xi + yj + zk a unitary vector, it is
       | possible rotate any vector q by an angle theta around u by doing:
       | 
       | pqp'
       | 
       | where p = cos(theta/2) + sin(theta/2)u and p' = cos(theta/2) -
       | sin(theta/2)u .
        
         | handrous wrote:
         | > Quaternions are hypercomplex numbers of the form
         | 
         | I'm gonna guess "hypercomplex" means "involves imaginary
         | numbers" due to the rest of this.
         | 
         | > Where w, x, y, and z are real and i^2 = j^2 = k^2 = -1 and ij
         | = k, ji = -k, jk = i, kj = -i, ki = j, ik = -j.
         | 
         | Why even use different letters for i, j, and k, if they're all
         | the same thing? Which thing appears to be i, as in, the square
         | root of -1, that is to say, the most well-known and basic
         | imaginary number, if I'm reading this right. As for the second
         | part, I can't even begin to unravel the significance. I know it
         | must not be, but it just seems like arbitrary rules added
         | for... some unknown reason.
         | 
         | > Being u = (x, y, z) = xi + yj + zk a unitary vector, it is
         | possible rotate any vector q by an angle theta around u by
         | doing:
         | 
         | > pqp'
         | 
         | > where p = cos(theta/2) + sin(theta/2)u and p' = cos(theta/2)
         | - sin(theta/2)u .
         | 
         | Oooooh kay... 1) Where'd w go? Is this one of those things
         | where there's a (situationally-defined) constant in the formula
         | but we just pretend it doesn't exist most of the time (until it
         | comes time to actually use the math to, like, do anything
         | real)? _Would_ we need to bring it back in to apply the rest of
         | this? 2)  "u =" is just defining something, fine, but (x, y, z)
         | doesn't seem to equal the thing after it at all--I suppose this
         | is a shorthand function notation, though it seems really weird
         | to me to use equality to relate that. Am I right, or is this
         | something else?, 3) A quaternion is... a point, then? Since
         | we're rotating around it? 4) I've got a feeling that theta
         | needs a direction in this hypercomplex space but don't see
         | where it's coming from. Somewhere "off screen", in this
         | explanation? Or is it there but I'm not seeing it?
        
           | cardiffspaceman wrote:
           | It seems to me that i, j, and k are three things that have
           | the same property, not three identical things.
        
             | handrous wrote:
             | TIL that not every imaginary number is just "i" with
             | optional scaling applied. Was taught "the square root of
             | negative one _is_ i ".
        
               | fault1 wrote:
               | i wish i was taught in terms of euler' formula, which is
               | probably the most useful:
               | https://en.wikipedia.org/wiki/Euler%27s_formula
        
               | Twisol wrote:
               | That's a heck of a great observation.
               | 
               | In the complex numbers, every imaginary number is,
               | indeed, just "i" scaled. But the quaternions are like
               | three copies of the complex numbers glued together; you
               | have multiple kinds of "imaginary", each with their own
               | unit -- like "i", but now also copies of it, "j" and "k".
               | 
               | To bring this somewhere more familiar, you can probably
               | imagine the real number line as a physical line
               | stretching off to infinity. This line has a point called
               | "1". Now if we take two more copies of this line, they
               | each have their own point called "1" -- a different one
               | for each line. And if you stick all three of these lines
               | together as a three-dimensional set of axes, you get a
               | world in which you have three 1s coexisting. We just say
               | "in the X direction" to be clear about which we're
               | talking about, or group them together in (x, y, z)
               | triples -- in which case X's 1 is called (1, 0, 0).
               | 
               | The situation is the same for quaternions -- we glue one
               | real line together with three copies of the imaginary
               | line. So we get three different i's, and we give them
               | different names to distinguish them.
        
           | AnimalMuppet wrote:
           | No, i, j, and k are _not_ the same thing. They are the three
           | distinct square roots of -1. You thus wind up with a space
           | with one real axis and three orthogonal imaginary axes.
           | 
           | Why should -1 have three distinct imaginary roots? Well, why
           | should it have one? Essentially, we just made up i, and we
           | found out that the complex numbers had some really useful
           | algebraic properties. The same is true of the quaternions.
           | 
           | But why not two imaginary roots, or four, or 17? Those turn
           | out _not_ to have nice algebraic properties. The only other
           | thing out there are the octonions, with 7 imaginary roots.
        
             | the_only_law wrote:
             | And like that I've given up hope of ever having a good
             | understanding of any mathematical field.
        
           | at_compile_time wrote:
           | Sounds a lot like the first time I tried to understand
           | quaternions. The explanation in geometric algebra as a scalar
           | and bivector gives it an intuitive geometric sense that words
           | like words like "hypercomplex" fail to. Others here have
           | linked to that material.
        
           | marcodiego wrote:
           | >> Quaternions are hypercomplex numbers of the form
           | 
           | >
           | 
           | >I'm gonna guess "hypercomplex" means "involves imaginary
           | numbers" due to the rest of this.
           | 
           | Think it is right.
           | 
           | >>
           | 
           | >> Where w, x, y, and z are real and i^2 = j^2 = k^2 = -1 and
           | ij = k, ji = -k, jk = i, kj = -i, ki = j, ik = -j.
           | 
           | >
           | 
           | >Why even use different letters for i, j, and k, if they're
           | all the same thing? Which thing appears to be i, as in, the
           | square root of -1, that is to say, the most well-known and
           | basic imaginary number, if I'm reading this right.
           | 
           | They are not the same thing. All of these are equal to -1
           | when squared, but they are different when multiplied by any
           | other of this set and multiplication between them is anti-
           | commutative.
           | 
           | >As for the second part, I can't even begin to unravel the
           | significance. I know it must not be, but it just seems like
           | arbitrary rules added for... some unknown reason.
           | 
           | >
           | 
           | These are not added for unknown reasons. They specify
           | rotations of unitary vectors of a canonical base around one
           | another.
           | 
           | >> Being u = (x, y, z) = xi + yj + zk a unitary vector, it is
           | possible rotate any vector q by an angle theta around u by
           | doing:
           | 
           | >>
           | 
           | >> pqp'
           | 
           | >>
           | 
           | >> where p = cos(theta/2) + sin(theta/2)u and p' =
           | cos(theta/2) - sin(theta/2)u .
           | 
           | >>
           | 
           | >Oooooh kay... 1) Where'd w go?
           | 
           | The coordinate 'w' is the real part. For the vector 'u', such
           | coordinate is 0. For 'p' and 'p'', it is cos(theta/2).
           | 
           | >Is this one of those things where there's a (situationally-
           | defined) constant in the formula but we just pretend it
           | doesn't exist most of the time (until it comes time to
           | actually use the math to, like, do anything real)?
           | 
           | No.
           | 
           | >Would we need to bring it back in to apply the rest of this?
           | 
           | No. Just follow the rules to multiply hypercomplex numbers
           | and the rotation will occur.
           | 
           | >2) "u =" is just defining something, fine, but (x, y, z)
           | doesn't seem to equal the thing after it at all--I suppose
           | this is a shorthand function notation, though it seems really
           | weird to me to use equality to relate that. Am I right, or is
           | this something else?,
           | 
           | The notation '(x, y, z)' is just a shorter notation for "xi +
           | yj + zk". For this problem, the vector 'u' defines the axis
           | of rotation.
           | 
           | >3) A quaternion is... a point, then? Since we're rotating
           | around it?
           | 
           | You can see a quaternion as a point in R^4 since it has 4
           | coordinates. Actually it describes an axis of rotation, by
           | its imaginary part, and the angle of rotation.
           | 
           | >4) I've got a feeling that theta needs a direction in this
           | hypercomplex space but don't see where it's coming from.
           | Somewhere "off screen", in this explanation? Or is it there
           | but I'm not seeing it?
           | 
           | >
           | 
           | The axis of rotation is actually the vector "u".
        
             | handrous wrote:
             | Thank you, this was very helpful.
             | 
             | > The axis of rotation is actually the vector "u".
             | 
             | Ah, I thought the vector was what we were rotating.
        
               | marcodiego wrote:
               | I think "p" is better described as a point instead of a
               | vector. So, a better writing could be: "[..]it is
               | possible rotate any point q by an angle theta around the
               | axis define by u [...]"
        
         | coldacid wrote:
         | I don't believe that most people will consider that "simply
         | explained".
        
           | marcodiego wrote:
           | Maybe succinctly?
        
             | coldacid wrote:
             | Yes, it is certainly succinct. But only simple and
             | explained for math majors. :D
        
         | [deleted]
        
         | OccamsRazr wrote:
         | tldr tldr (Since your version is for people who already
         | understand undergraduate math, this version is for people who
         | already understand upper-level undergraduate/graduate math):
         | 
         | If you try to use a product of 3 rotation matrices that
         | represent rotations around fixed axes to represent rotations in
         | 3D, there will inevitably be gimbal lock because there cannot
         | exist a covering map from a product of 3 circles to SO(3).
         | (Gimbal lock happens at the points where the map locally fails
         | to be a covering map)
         | 
         | SU(2) is the universal cover of SO(3). The unit quaternions are
         | a faithful representation of SU(2). Conveniently, the double
         | cover map from SU(2) to SO(3) is dead simple in this
         | representation: a unit quaternion q in SU(2) act on a purely
         | imaginary quaternion (thought of as a vector in R^3) by
         | conjugation. This is the formula you wrote.
         | 
         | Since it is a covering map, there is no gimbal lock.
         | 
         | Edited to fix explanation.
        
       | dang wrote:
       | Ongoing related thread:
       | 
       |  _Let 's remove Quaternions from every 3D Engine (2018)_ -
       | https://news.ycombinator.com/item?id=29512302
        
       | jcun4128 wrote:
       | Nice I will learn these for IMU stuff, I'm still a noob
       | currently.
        
       | [deleted]
        
       | Const-me wrote:
       | One interesting thing about quaternions that's almost never
       | mentioned anywhere on the internets, there're two conventions for
       | them.
       | 
       | The convention in that article is known as "Hamilton's
       | quaternions". There's another incompatible one usually called
       | "JPL quaternions", for some American Jet Propulsion Laboratory.
       | 
       | Authors of 99% articles about the quaternions, and software
       | libraries implementing quaternions, are assuming exactly one of
       | these conventions, and almost never mention which one that is.
       | 
       | More info there:
       | https://fzheng.me/2017/11/12/quaternion_conventions_en/
        
         | billforsternz wrote:
         | I remember reading some library quaternion code (sorry can't
         | remember which library) that started out with a lovely quote
         | from Hamilton on how the idea burst into his mind in a flash as
         | he walked with his wife near the river Liffey I think it was in
         | Dublin. So I guess they mentioned it, at least indirectly.
        
         | thermistokles wrote:
         | There are actually even more. You can actually have 12
         | different variations depending on certain choices. Though the
         | other sources of differences are minor.
         | 
         | https://arxiv.org/abs/1711.02508
         | 
         | This is actually a great source of frustration in the robotics
         | state estimation community, as you have the influential
         | University of Minnesota using JPL, and most other universities
         | using Hamiltonian.
        
         | fault1 wrote:
         | you also see the variations from the group structure;
         | 
         | https://en.wikipedia.org/wiki/Quaternion_group
        
       | gibsonf1 wrote:
       | The absolute best instruction on quaternions I've seen is the
       | 3Blue1Brown series on your tube and their incredible live
       | quaternion viewer:
       | https://www.youtube.com/watch?v=zjMuIxRvygQ&t=24s
       | 
       | I was able to learn enough from this to then use quaternion
       | matrix transformations extensively in my startup to incredible
       | effect.
        
       | pixelpoet wrote:
       | Smallest of small notes: in TeX, "cos" is rendered as a product
       | of 3 italicised variables c, o and s, whereas the escaped literal
       | "\cos" is rendered as the cosine function.
        
         | the_origami_fox wrote:
         | Author here: thanks for the tip. Definitely think this looks
         | better
        
       | steve_adams_86 wrote:
       | I remember the first time I encountered quaternions, and it was
       | in a similar context. I was using PiQT 3d to move models in a
       | simulation.
       | 
       | At first it really bothered me that quaternions were a black box
       | to me, yet so easy to use in so many contexts. What kind of magic
       | was happening? I had to know.
       | 
       | My math is terrible. I spent actual days revisiting YouTube
       | videos explaining quaternions but my limited brain cells were
       | failing to properly grasp it. I had to know though, I'd go crazy
       | writing so much code that depends on something I couldn't
       | understand.
       | 
       | It took a long time. This would have been very helpful.
       | Quaternions are very cool, and well worth reading about if you do
       | anything in the digital 3d world.
       | 
       | I think I can still hear my brain sizzling as I tried to absorb
       | this stuff.
        
         | dilawar wrote:
         | Try reading it up again. My experience is that with age theory
         | gets easier.
        
       | akeck wrote:
       | I've been teaching myself geometric algebra which is apparently
       | isomorphic to quaternion algebra. Some people prefer GA for 3D
       | modeling work.
        
         | W0lf wrote:
         | Computing in higher dimensions is nice, although pretty
         | difficult to implement efficiently. Hence, Quaternions are
         | mostly used nowadays, I think.
        
       | smcameron wrote:
       | This page is a little more information dense, but it's what I
       | learned quaternions from (after bashing my head against it for a
       | couple of weeks) and it's good as a refresher because it is so
       | dense.
       | 
       | http://www.tutis.ca/Rotate/7quaternions.htm
       | 
       | One thing I didn't see in the OP's linked article is how to
       | transform a quaternion into a different coordinate system defined
       | by another quaternion. For example, suppose you have a spaceship
       | in a game at an arbitrary orientation defined by Q1 which is a
       | rotation away from a conventional "unrotated" orientation, and
       | you want to input say 5 degrees of yaw to the right. Well, you
       | just construct a quaternion Q2 that is 5 degrees yaw to the right
       | from this conventional unrotated orientation, and you can use
       | quaternion conjugation to transform Q2 into the orientation of Q1
       | where it can then be applied to the spaceship's orientation. OP's
       | link mentioned quaternion conjugation, but didn't really mention
       | what it was good for. It is described in section IV of the
       | 7quaternions link.
        
       | jodrellblank wrote:
       | > although a lecturer once eluded to them during a class in my
       | masters
       | 
       | Would be more amusing if "they eluded a lecturer" or "a lecturer
       | once elided them".
       | 
       | ("alluded to them").
        
         | anentropic wrote:
         | also: gimbol -> gimbal
        
           | naikrovek wrote:
           | yeah that one drove me nuts for some reason.
        
             | the_origami_fox wrote:
             | Author here: these typos totally eluded me. Will fix them.
        
               | naikrovek wrote:
               | tpyos elide us all
        
           | w0mbat wrote:
           | I came here to report the same two typos. Thanks.
        
       | dhosek wrote:
       | I first encountered quaternions in the concept of abstract
       | algebra. It's interesting to think of it as part of a spectrum
       | starting with reals and continuing to octonions (and beyond).
       | Interestingly with each extension we lose something:
       | 
       | Complex numbers (2-dimensional): No more ordering
       | 
       | Quaternions (4-dimensional): No more commutative multiplication
       | 
       | Octonions (8-dimensional): No more associative multiplication
       | 
       | Sedenions (16-dimensional): We lose the alternative property,
       | i.e., with octonions its still true that _x_ ( _xy_ ) = ( _xx_ )
       | _y_ but with sedenions it is not.
       | 
       | We can continue this process indefinitely, although I know
       | nothing of the characteristics of trigintaduonions or what comes
       | later. I suspect that it might be the loss of the flexible
       | identity next, _a_ ( _ba_ ) = ( _ab_ ) _a_ but I don 't know for
       | sure.
        
         | macrolocal wrote:
         | One neat characteristic is that the derivations of these higher
         | Cayley-Dickinson algebras stabilize!
         | 
         | [1] https://projecteuclid.org/journals/pacific-journal-of-
         | mathem...
        
         | galaxyLogic wrote:
         | Here's a short article that gave me some insight into the
         | matter:
         | 
         | https://nautil.us/blog/the-strange-numbers-that-birthed-mode...
         | 
         | "Place your phone face-up on a flat surface, for example. Spin
         | it 90 degrees to the left, and then flip it away from you. Note
         | which way the camera points.
         | 
         | Returning to the original position, flip it away from you first
         | and then turn it to the left second. See how the camera points
         | to the right instead?
         | 
         | This initially alarming property, known as non-commutativity,
         | turns out to be a feature the quaternions share with reality "
        
         | Zamicol wrote:
         | Why do you think the dimensions are in powers of two?
        
           | Twisol wrote:
           | Because the construction generating this sequence of algebras
           | doubles the dimension every time.
           | 
           | https://en.m.wikipedia.org/wiki/Cayley%E2%80%93Dickson_const.
           | ..
        
         | avz wrote:
         | Interestingly, if we go in the opposite direction we also loose
         | something:
         | 
         | Real numbers (1-dimensional): No more algebraic closure [1]
         | 
         | though as you suggest we do gain a nice ordering where "nice"
         | means "compatible with operations". BTW, you can always impose
         | _some_ ordering on all of these sets. It is the orderings '
         | compatibility with arithmetic that we lose going from real
         | numbers to complex numbers.
         | 
         | This can be generalized a little. Real numbers fail to be
         | algebraically closed because some real polynomials lack real
         | solutions, e.g. xx=-2. Complex numbers "fix" this problem since
         | there every n degree polynomial has exactly n roots (counting
         | multiplicity). In a sense, quaternions overdo this, e.g. xx=-2
         | has an infinite number of solutions (exercise for the reader).
         | However, since quaternion multiplication is not commutative,
         | polynomials as traditionally understood are ill-defined. For
         | example, axx, xax and xxa are different degree two quaternion
         | "polynomials". Ugh.
         | 
         | [1]: https://en.wikipedia.org/wiki/Algebraically_closed_field
        
         | nabla9 wrote:
         | First 4 (reals, complex, quaternions, octonions) are normed
         | division algebras.
         | 
         | Normed means that each number has associated nonnegative real
         | number that describes the "size" of the number, also |xy| <=
         | |x||y|. Number having a size (a norm) is very useful concept.
         | 
         | Sedions and the rest are less useful because they are not
         | normed algebras.
        
       | adamnemecek wrote:
       | You should check out the bivector community dedicated to
       | geometric algebra https://bivector.net/.
       | 
       | Check out a demo https://observablehq.com/@enkimute/animated-
       | orbits
       | 
       | Join the discord https://discord.gg/vGY6pPk.
       | 
       | Enki (the guy behind bivector) also gave a talk on GA at SIGGRAPH
       | 2019 https://www.youtube.com/watch?v=tX4H_ctggYo
        
       | 2143 wrote:
       | I remember "quarternions" from my math-heavy computer graphics
       | class.
       | 
       | Today, I have zero recollection of what they were or why it was
       | in my graphics class. Heck I barely remember anything from that
       | class today, which is ironical considering it was a required
       | class for me to graduate that semester.
       | 
       | I wish my job had atleast a little more to do withwhat I learnt
       | in college.
       | 
       | (I'm a web developer, and I'd like to get closer to the machine.)
        
       ___________________________________________________________________
       (page generated 2021-12-10 23:00 UTC)