• quaternion graphics in C or C-style C++?

    From David Melik@21:1/5 to All on Sat Aug 19 21:57:59 2017
    XPost: comp.lang.c, comp.lang.c++

    I'm interested learning how quaternions simplify three-dimensional (3D) graphics programming, such as for a wireframe cube in C or C-style C++
    (which I've programmed before, and is on my homepage for GCC C++ w/SDL,
    maybe modifiable to C, and has a simple BSD-style license,) doing all
    the details, i.e., not using libraries (except, perhaps put_pixel() and
    line(), not even some matrix library, let alone graphics ones doing it
    all for you.)

    I.e., the only thing I'd want to use from C++ for this (since I'm trying
    to learn more C and linear algebra) is in the case in C++ you can set
    your matrix's values all at once, rather than I recall, in C, I had to
    do one element at a time. So, I want to be able to comment out that
    one-line assignment, and write C-style multiple lines, if I want to
    save as a .C instead of .CC.

    I combined the three standard 3x3 3D rotation matrices into one in which
    I can input angles I want, then multiplied it by my 3x8 matrix of the
    cube vertices (actually one by one, with a for-loop,) and after doing perspective and displaying the cube, iterated through time (t) to move
    the cube. But, I recall from a university math club lecture,
    quaternions already have (x,y,z) defined for all t with respect to
    whatever 3D rotation angles you use.

    So, I'd like to know, how can quaternions simplify this process? I
    recall they're something like a scalar on some (x,y,z) but forgot how
    that would seem to simplify any multiplication or iteration.

    Rather than in one suggestion I was given, saying break this down into
    more objects such as vertex vectors and a rotation matrix with twice as
    many angles than I need, I'd still prefer to use an object matrix
    (defining my cube's vertices,) and rotation matrices (and saw at least a
    couple different types, maybe still with several of each that could be multiplied,) but if there's a way to do either fewer matrix
    multiplications, or not so much iteration, that would be a benefit... is
    that what one could do with quaternions? Or, is there some simpler way,
    that will still reduce the amount of code you need to write, and amount
    of variables/objects you need to use, as well as the calculations?

    David (Darwin in USA code/math/graphics/art/music Demoscene) http://www.cwu.edu/~melikd/

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From bartc@21:1/5 to David Melik on Sun Aug 20 12:21:26 2017
    XPost: comp.lang.c, comp.lang.c++

    On 20/08/2017 05:57, David Melik wrote:
    I'm interested learning how quaternions simplify three-dimensional (3D) graphics programming, such as for a wireframe cube in C or C-style C++
    (which I've programmed before, and is on my homepage for GCC C++ w/SDL,

    (http://www.cwu.edu/~melikd/math/demosrc/demo.cpp)

    maybe modifiable to C, and has a simple BSD-style license,) doing all
    the details, i.e., not using libraries (except, perhaps put_pixel() and line(), not even some matrix library, let alone graphics ones doing it
    all for you.)

    One comment:

    //define polyhedra
    int cube_100[3][8]={{-50, -50, 50, 50, -50, -50, 50, 50},
    {-50, 50, 50, -50, -50, 50, 50, -50},
    {-50, -50, -50, -50, 50, 50, 50, 50}};
    int cube_a[3][8]={{-50, -50, 50, 50, -50, -50, 50, 50},
    {-50, 50, 50, -50, -50, 50, 50, -50},
    {-50, -50, -50, -50, 50, 50, 50, 50}};

    This looks rather peculiar; is each (x,y,z) point represented as a
    vertical column here?

    It is more normal to store x, y and z together, for example (also using
    floats rather than ints, but I don't know if the above is a requirement
    of SDL):

    typedef struct { float x,y,z;} Point;

    Point cube[8] = {
    {-50, -50, -50},
    {-50, 50, -50},
    etc

    Then, if vertices of a cube are indexed 0 to 7, the Z component of
    vertex 4 would be:

    cube[4].z

    (Your code which uses indices for both, and in a backwards order, gets confusing later on.)

    So, I'd like to know, how can quaternions simplify this process? I

    (Can't help there; don't know quaternions.)

    recall they're something like a scalar on some (x,y,z) but forgot how
    that would seem to simplify any multiplication or iteration.

    Rather than in one suggestion I was given, saying break this down into
    more objects such as vertex vectors and a rotation matrix with twice as
    many angles than I need, I'd still prefer to use an object matrix
    (defining my cube's vertices,) and rotation matrices (and saw at least a couple different types, maybe still with several of each that could be multiplied,) but if there's a way to do either fewer matrix
    multiplications,

    How many were you thinking of? A cube has 8 corners, so would need 8 transformations (applying a transformation matrix to each point to yield
    a new point).

    You only need to multiply matrices to combine transformations. That's
    done once then you can apply the same result to any number of points
    (ie. vertices).

    Not sure about all the things your code does; one part seems to rotate a
    2D cube 360 degrees, 6 degrees at a time so 60 (or 61) rotations are
    applied.

    To do similar with a 3D cube, which has 8 corners, you might try this
    for each iteration:

    Set up a new rotation matrix for this new angle
    Copy the 8 vertices into a new cube
    Apply the matrix on the new cube
    Draw it (presumably using 12 edges between 12 pairs of those 8 vertices)

    This is compared with, for example, taking an edge at a time, and
    transforming the two endpoints, as you will do 24 transformations rather
    than 8.

    A faster way of rotating such a cube is to set up a rotation matrix for
    6 degrees. Take a copy of the original cube. Then:

    Draw the cube
    Apply the 6 degree rotation to each of the 8 vertices
    Repeat 60 times

    So this avoids copying vertices, or re-calculating the rotation matrix.
    But incremental errors can build up.

    --
    bartc

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Joe Pfeiffer@21:1/5 to David Melik on Sun Aug 20 17:16:26 2017
    XPost: comp.lang.c, comp.lang.c++

    David Melik <dchmelik@gmail.com> writes:

    I'm interested learning how quaternions simplify three-dimensional
    (3D) graphics programming, such as for a wireframe cube in C or
    C-style C++ (which I've programmed before, and is on my homepage for
    GCC C++ w/SDL, maybe modifiable to C, and has a simple BSD-style
    license,) doing all the details, i.e., not using libraries (except,
    perhaps put_pixel() and line(), not even some matrix library, let
    alone graphics ones doing it all for you.)

    I.e., the only thing I'd want to use from C++ for this (since I'm
    trying to learn more C and linear algebra) is in the case in C++ you
    can set your matrix's values all at once, rather than I recall, in C,
    I had to do one element at a time. So, I want to be able to comment
    out that one-line assignment, and write C-style multiple lines, if I
    want to save as a .C instead of .CC.

    I combined the three standard 3x3 3D rotation matrices into one in
    which I can input angles I want, then multiplied it by my 3x8 matrix
    of the cube vertices (actually one by one, with a for-loop,) and after
    doing perspective and displaying the cube, iterated through time (t)
    to move the cube. But, I recall from a university math club lecture, quaternions already have (x,y,z) defined for all t with respect to
    whatever 3D rotation angles you use.

    So, I'd like to know, how can quaternions simplify this process? I
    recall they're something like a scalar on some (x,y,z) but forgot how
    that would seem to simplify any multiplication or iteration.

    Rather than in one suggestion I was given, saying break this down into
    more objects such as vertex vectors and a rotation matrix with twice
    as many angles than I need, I'd still prefer to use an object matrix (defining my cube's vertices,) and rotation matrices (and saw at least
    a couple different types, maybe still with several of each that could
    be multiplied,) but if there's a way to do either fewer matrix multiplications, or not so much iteration, that would be a
    benefit... is that what one could do with quaternions? Or, is there
    some simpler way, that will still reduce the amount of code you need
    to write, and amount of variables/objects you need to use, as well as
    the calculations?

    David (Darwin in USA code/math/graphics/art/music Demoscene) http://www.cwu.edu/~melikd/


    If you're looking for what I think you are, search on affine
    transformation matrices. The wikipedia page https://en.wikipedia.org/wiki/Transformation_matrix appears at first
    glance to give a good introduction; it's also a chapter in just about
    any computer graphics textbook.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From David Melik@21:1/5 to All on Wed Aug 23 02:57:56 2017
    XPost: comp.lang.c, comp.lang.c++

    (reply below is on Usenet and 'blind carbon copy' (BCC) to a listserv)

    On 08/21/2017 05:12 AM, SG wrote:
    On Sunday, August 20, 2017 at 6:58:21 AM UTC+2, David Melik wrote:

    So, I'd like to know, how can quaternions simplify this process? I
    recall they're something like a scalar on some (x,y,z) but forgot how
    that would seem to simplify any multiplication or iteration.

    Quaternions are useful if you need a compact representation of a 3D
    rotation matrix. Given a normalized quaternion q, it's rather easy to determine a corresponding rotation matrix R

    R = q2rot(q) (I won't bother defining q2rot)

    Not define... why? If, for example, quaternions (or anything) were
    being described in a pure mathematics textbook, *everything* would be
    defined, probably full detail (unless left as an exercise, where at
    least they'd define their terms.) It turns out I won't necessarily need definition now (if you see my reply to your question below,) but...


    And for every rotation matrix R there are two such quaternions:
    q and -q. This q2rot functions has the following properties:

    q2rot(q) = q2rot(-q) and

    q2rot(a * b) = q2rot(a) * q2rot(b).

    Given the last equality and the fact that multiplying quaternions is
    cheaper than multiplying 3x3 rotation matrices, quaternions allow you
    to efficiently multiply lots of 3D rotations together. So, if you
    need to multiply lots of rotations, quaternions are going to be more efficient for that.

    However, if you want to apply the resulting rotation to a collection
    of points (like the vertices of your cube), you should probably
    convert the quaternion back to a 3x3 rotation matrix because this
    matrix representation is more efficient for such things in terms of
    number of necessary floating point operations.

    Ok, so apparently they don't really improve something as basic as
    rotating a cube. So, if I made a larger or generalized 3D system, they
    could be useful.

    For the cube I did, I combined my rotation matrices for the three angles myself, beforehand. So, it seems, I won't achieve anything more by
    replacing that.


    I think that answers your question?

    Part of it (and all most important parts for now.) I still want to
    learn quaternions for a 3D C or C-style C++ program, and now have a
    better overview (not details)... but you've clarified, I should try a 3D
    thing they're more useful for, first, or just a calculation program.
    So, I'll have to choose which way to continue, before any more detailed questions.

    That's all for now on on Usenet from me.


    ------------------------------------------------------------------------
    Note to listserv I sent this to (after recent discussion.) Double-check
    any reply you write won't also have Usenet newsgroups in 'To:,' unless
    desired (probably will only be 'To:' me, but I forgot how it works when
    you post to a listserv & Usenet both.) My original post (only small
    part quoted above) was to Usenet news://comp.graphics.algorithms , news://comp.lang.c , news://comp.lang.c++ newsgroups.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Richard Damon@21:1/5 to David Melik on Wed Aug 23 07:56:07 2017
    XPost: comp.lang.c, comp.lang.c++

    On 8/23/17 5:57 AM, David Melik wrote:
    (reply below is on Usenet and 'blind carbon copy' (BCC) to a listserv)

    On 08/21/2017 05:12 AM, SG wrote:
    On Sunday, August 20, 2017 at 6:58:21 AM UTC+2, David Melik wrote:

    So, I'd like to know, how can quaternions simplify this process?  I
    recall they're something like a scalar on some (x,y,z) but forgot how
    that would seem to simplify any multiplication or iteration.

    Quaternions are useful if you need a compact representation of a 3D
    rotation matrix.  Given a normalized quaternion q, it's rather easy to
    determine a corresponding rotation matrix R

       R = q2rot(q)   (I won't bother defining q2rot)

    Not define... why?  If, for example, quaternions (or anything) were
    being described in a pure mathematics textbook, *everything* would be defined, probably full detail (unless left as an exercise, where at
    least they'd define their terms.)  It turns out I won't necessarily need definition now (if you see my reply to your question below,) but...


    I think he meant that he wasn't going to write out the code for q2rot(). Quaternions are well defined mathematically, and the creation of q2rot()
    is a mostly mechanical process of looking at the definition and putting
    it to code.

    And for every rotation matrix R there are two such quaternions:
    q and -q. This q2rot functions has the following properties:

       q2rot(q) = q2rot(-q)  and

       q2rot(a * b) = q2rot(a) * q2rot(b).

    Given the last equality and the fact that multiplying quaternions is
    cheaper than multiplying 3x3 rotation matrices, quaternions allow you
    to efficiently multiply lots of 3D rotations together.  So, if you
    need to multiply lots of rotations, quaternions are going to be more
    efficient for that.

    However, if you want to apply the resulting rotation to a collection
    of points (like the vertices of your cube), you should probably
    convert the quaternion back to a 3x3 rotation matrix because this
    matrix representation is more efficient for such things in terms of
    number of necessary floating point operations.

    Ok, so apparently they don't really improve something as basic as
    rotating a cube.  So, if I made a larger  or generalized 3D system, they could be useful.

    For the cube I did, I combined my rotation matrices for the three angles myself, beforehand. So, it seems, I won't achieve anything more by
    replacing that.

    Quaternions provide a compact notation for representing an orientation,
    and a fairly simple way to chain rotations. For actually doing the
    rotations to lots of objects, the simple rotation matrix can be
    simpler/faster (so converting the Quaternion to a matrix near the end
    makes sense). One other factor is computational stability, chaining
    Quaternions can't mess up the scale of orthogonality of the axes, while
    with a rotation matrix, the round off errors in each operation can
    gradually build up to cause these sorts of errors,

    I think that answers your question?

    Part of it (and all most important parts for now.)  I still want to
    learn quaternions for a 3D C or C-style C++ program, and now have a
    better overview (not details)... but you've clarified, I should try a 3D thing they're more useful for, first, or just a calculation program. So,
    I'll have to choose which way to continue, before any more detailed questions.

    That's all for now on on Usenet from me.



    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From ngry@21:1/5 to All on Wed Aug 30 00:22:23 2017
    Hi,

    I think David Eberly have answered mostly all your questions, please look following :

    1) Quaternion Algebra and Calculus https://www.geometrictools.com/Documentation/Quaternions.pdf

    2) Rotation Representations and Performance Issues https://www.geometrictools.com/Documentation/RotationIssues.pdf

    3) Constrained Quaternions Using Euler Angles https://www.geometrictools.com/Documentation/ConstrainedQuaternions.pdf

    4) A Linear Algebraic Approach to Quaternions https://www.geometrictools.com/Documentation/LinearAlgebraicQuaternions.pdf

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)