Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

quaternion improvements and new features #43

Merged
merged 38 commits into from
Apr 11, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
ae06c51
improve glm_mat4_mulN for non-DEBUG environment
recp Apr 7, 2018
9b8748a
quat: quaternion to mat3
recp Apr 7, 2018
619ecdc
quat: improve normalize
recp Apr 7, 2018
f5140ea
quat: mat4_mul_quat helper
recp Apr 7, 2018
257c57d
mat4 to quaternion
recp Apr 7, 2018
12c5307
vec3 and vec4 sign helper
recp Apr 7, 2018
b27603c
normalize quaternion before converting to matrix
recp Apr 7, 2018
81bda74
vector square root
recp Apr 8, 2018
932f638
optimize mat4 to quaternion
recp Apr 8, 2018
e4e0fa6
sse2 version of vec4 dot product
recp Apr 8, 2018
381b2fd
fix vec4_norm2, use dot for vec3_norm2
recp Apr 8, 2018
f0daaca
improve matrix to quaternion
recp Apr 8, 2018
7615f78
improve quaternion to matrix
recp Apr 8, 2018
3dc93c5
convert quaterinon to xyzw order (part 1)
recp Apr 9, 2018
d79e584
update credits file
recp Apr 9, 2018
76e9f74
conjugate of quaternion
recp Apr 9, 2018
b21df8f
inverse of quaternion
recp Apr 9, 2018
cc1d3b5
quat: implement add, sub, real and imag helpers
recp Apr 9, 2018
93a08fc
quat: axis angle of quaternion
recp Apr 9, 2018
6f69da3
quaternion multiplication
recp Apr 9, 2018
591c881
vec: extend flip sign to store result in another vector
recp Apr 10, 2018
1fb82a1
quat: use vector functions for available operations
recp Apr 10, 2018
416e2f4
vec: lerp for vec3 and vec4
recp Apr 10, 2018
290bcf1
quat: add lerp and improve slerp
recp Apr 10, 2018
f0a51b3
quat: transposed/inverted version of quat2mat
recp Apr 10, 2018
9466182
quat: create view wmatrix with quaternion helper
recp Apr 10, 2018
18ef0d7
quat: quaternion for look rotation ( from source point to dest point )
recp Apr 10, 2018
4c79fee
quat: additional tests for angle, axis, mul (hamilton product)
recp Apr 10, 2018
5dec688
add additional tests and comments to quat tests
recp Apr 10, 2018
010dcc9
optimize normalize quaternion with SIMD
recp Apr 10, 2018
b1fa7ff
normalize axis quaternion axis-angle constructor
recp Apr 10, 2018
d447876
improve glm_vec_rotate
recp Apr 10, 2018
80d255e
rotate vector using quaternion
recp Apr 10, 2018
fdea135
replace mat4_mulq with glm_quat_rotate
recp Apr 11, 2018
51278b2
quat: update call versions of quaternion
recp Apr 11, 2018
de55850
add call version of vector extensions
recp Apr 11, 2018
0e63c24
update docs
recp Apr 11, 2018
9ae8da3
update version to v0.4.0
recp Apr 11, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -59,4 +59,5 @@ cglm_test_ios/*
cglm_test_iosTests/*
docs/build/*
win/cglm_test_*
* copy.*
* copy.*
*.o
7 changes: 7 additions & 0 deletions CREDITS
Original file line number Diff line number Diff line change
Expand Up @@ -43,3 +43,10 @@ https://github.com/erich666/GraphicsGems/blob/master/gems/TransBox.c
6. Cull frustum
http://www.txutxi.com/?p=584
http://old.cescg.org/CESCG-2002/DSykoraJJelinek/

7. Quaternions
Initial mat4_quat is borrowed from Apple's simd library


8. Vector Rotation using Quaternion
https://gamedev.stackexchange.com/questions/28395/rotating-vector3-by-a-quaternion
2 changes: 1 addition & 1 deletion configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
#*****************************************************************************

AC_PREREQ([2.69])
AC_INIT([cglm], [0.3.6], [[email protected]])
AC_INIT([cglm], [0.4.0], [[email protected]])
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects])

AC_CONFIG_MACRO_DIR([m4])
Expand Down
274 changes: 253 additions & 21 deletions docs/source/quat.rst
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,16 @@ quaternions

Header: cglm/quat.h

**Important:** *cglm* stores quaternion as [w, x, y, z] in memory, don't
forget that when changing quaternion items manually. For instance *quat[3]*
is *quat.z* and *quat[0*] is *quat.w*. This may change in the future if *cglm*
will got enough request to do that. Probably it will not be changed in near
future
**Important:** *cglm* stores quaternion as **[x, y, z, w]** in memory
since **v0.4.0** it was **[w, x, y, z]**
before v0.4.0 ( **v0.3.5 and earlier** ). w is real part.

There are some TODOs for quaternions check TODO list to see them.
What you can do with quaternions with existing functions is (Some of them):

Also **versor** is identity quaternion so the type may change to **vec4** or
something else. This will not affect existing functions for your engine because
*versor* is alias of *vec4*
- You can rotate transform matrix using quaterion
- You can rotate vector using quaterion
- You can create view matrix using quaterion
- You can create a lookrotation (from source point to dest)

Table of contents (click to go):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Expand All @@ -28,14 +27,35 @@ Macros:
Functions:

1. :c:func:`glm_quat_identity`
#. :c:func:`glm_quat_init`
#. :c:func:`glm_quat`
#. :c:func:`glm_quatv`
#. :c:func:`glm_quat_copy`
#. :c:func:`glm_quat_norm`
#. :c:func:`glm_quat_normalize`
#. :c:func:`glm_quat_normalize_to`
#. :c:func:`glm_quat_dot`
#. :c:func:`glm_quat_mulv`
#. :c:func:`glm_quat_conjugate`
#. :c:func:`glm_quat_inv`
#. :c:func:`glm_quat_add`
#. :c:func:`glm_quat_sub`
#. :c:func:`glm_quat_real`
#. :c:func:`glm_quat_imag`
#. :c:func:`glm_quat_imagn`
#. :c:func:`glm_quat_imaglen`
#. :c:func:`glm_quat_angle`
#. :c:func:`glm_quat_axis`
#. :c:func:`glm_quat_mul`
#. :c:func:`glm_quat_mat4`
#. :c:func:`glm_quat_mat4t`
#. :c:func:`glm_quat_mat3`
#. :c:func:`glm_quat_mat3t`
#. :c:func:`glm_quat_lerp`
#. :c:func:`glm_quat_slerp`
#. :c:func:`glm_quat_look`
#. :c:func:`glm_quat_for`
#. :c:func:`glm_quat_forp`
#. :c:func:`glm_quat_rotatev`

Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~
Expand All @@ -47,25 +67,48 @@ Functions documentation
Parameters:
| *[in, out]* **q** quaternion

.. c:function:: void glm_quat_init(versor q, float x, float y, float z, float w)

| inits quaternion with given values

Parameters:
| *[out]* **q** quaternion
| *[in]* **x** imag.x
| *[in]* **y** imag.y
| *[in]* **z** imag.z
| *[in]* **w** w (real part)

.. c:function:: void glm_quat(versor q, float angle, float x, float y, float z)

| creates NEW quaternion with individual axis components

| given axis will be normalized

Parameters:
| *[out]* **q** quaternion
| *[in]* **angle** angle (radians)
| *[in]* **x** axis.x
| *[in]* **y** axis.y
| *[in]* **z** axis.z

.. c:function:: void glm_quatv(versor q, float angle, vec3 v)
.. c:function:: void glm_quatv(versor q, float angle, vec3 axis)

| creates NEW quaternion with axis vector

| given axis will be normalized

Parameters:
| *[out]* **q** quaternion
| *[in]* **angle** angle (radians)
| *[in]* **v** axis
| *[in]* **axis** axis (will be normalized)

.. c:function:: void glm_quat_copy(versor q, versor dest)

| copy quaternion to another one

Parameters:
| *[in]* **q** source quaternion
| *[out]* **dest** destination quaternion

.. c:function:: float glm_quat_norm(versor q)

Expand All @@ -77,31 +120,133 @@ Functions documentation
Returns:
norm (magnitude)

.. c:function:: void glm_quat_normalize_to(versor q, versor dest)

| normalize quaternion and store result in dest, original one will not be normalized

Parameters:
| *[in]* **q** quaternion to normalize into
| *[out]* **dest** destination quaternion

.. c:function:: void glm_quat_normalize(versor q)

| normalize quaternion

Parameters:
| *[in, out]* **q** quaternion

.. c:function:: float glm_quat_dot(versor q, versor r)
.. c:function:: float glm_quat_dot(versor p, versor q)

dot product of two quaternion

Parameters:
| *[in]* **q1** quaternion 1
| *[in]* **q2** quaternion 2
| *[in]* **p** quaternion 1
| *[in]* **q** quaternion 2

Returns:
dot product

.. c:function:: void glm_quat_mulv(versor q1, versor q2, versor dest)
.. c:function:: void glm_quat_conjugate(versor q, versor dest)

conjugate of quaternion

Parameters:
| *[in]* **q** quaternion
| *[in]* **dest** conjugate

.. c:function:: void glm_quat_inv(versor q, versor dest)

inverse of non-zero quaternion

Parameters:
| *[in]* **q** quaternion
| *[in]* **dest** inverse quaternion

.. c:function:: void glm_quat_add(versor p, versor q, versor dest)

add (componentwise) two quaternions and store result in dest

Parameters:
| *[in]* **p** quaternion 1
| *[in]* **q** quaternion 2
| *[in]* **dest** result quaternion

.. c:function:: void glm_quat_sub(versor p, versor q, versor dest)

subtract (componentwise) two quaternions and store result in dest

Parameters:
| *[in]* **p** quaternion 1
| *[in]* **q** quaternion 2
| *[in]* **dest** result quaternion

.. c:function:: float glm_quat_real(versor q)

returns real part of quaternion

Parameters:
| *[in]* **q** quaternion

Returns:
real part (quat.w)

.. c:function:: void glm_quat_imag(versor q, vec3 dest)

returns imaginary part of quaternion

Parameters:
| *[in]* **q** quaternion
| *[out]* **dest** imag

.. c:function:: void glm_quat_imagn(versor q, vec3 dest)

returns normalized imaginary part of quaternion

Parameters:
| *[in]* **q** quaternion
| *[out]* **dest** imag

.. c:function:: float glm_quat_imaglen(versor q)

returns length of imaginary part of quaternion

Parameters:
| *[in]* **q** quaternion

Returns:
norm of imaginary part

.. c:function:: float glm_quat_angle(versor q)

returns angle of quaternion

Parameters:
| *[in]* **q** quaternion

Returns:
angles of quat (radians)

.. c:function:: void glm_quat_axis(versor q, versor dest)

axis of quaternion

Parameters:
| *[in]* **p** quaternion
| *[out]* **dest** axis of quaternion

.. c:function:: void glm_quat_mul(versor p, versor q, versor dest)

| multiplies two quaternion and stores result in dest

| this is also called Hamilton Product

| According to WikiPedia:
| The product of two rotation quaternions [clarification needed] will be
equivalent to the rotation q followed by the rotation p

Parameters:
| *[in]* **q1** quaternion 1
| *[in]* **q2** quaternion 2
| *[in]* **p** quaternion 1 (first rotation)
| *[in]* **q** quaternion 2 (second rotation)
| *[out]* **dest** result quaternion

.. c:function:: void glm_quat_mat4(versor q, mat4 dest)
Expand All @@ -112,13 +257,100 @@ Functions documentation
| *[in]* **q** quaternion
| *[out]* **dest** result matrix

.. c:function:: void glm_quat_mat4t(versor q, mat4 dest)

| convert quaternion to mat4 (transposed). This is transposed version of glm_quat_mat4

Parameters:
| *[in]* **q** quaternion
| *[out]* **dest** result matrix

.. c:function:: void glm_quat_mat3(versor q, mat3 dest)

| convert quaternion to mat3

Parameters:
| *[in]* **q** quaternion
| *[out]* **dest** result matrix

.. c:function:: void glm_quat_mat3t(versor q, mat3 dest)

| convert quaternion to mat3 (transposed). This is transposed version of glm_quat_mat3

Parameters:
| *[in]* **q** quaternion
| *[out]* **dest** result matrix

.. c:function:: void glm_quat_lerp(versor from, versor to, float t, versor dest)

| interpolates between two quaternions
| using spherical linear interpolation (LERP)

Parameters:
| *[in]* **from** from
| *[in]* **to** to
| *[in]* **t** interpolant (amount) clamped between 0 and 1
| *[out]* **dest** result quaternion

.. c:function:: void glm_quat_slerp(versor q, versor r, float t, versor dest)

| interpolates between two quaternions
| using spherical linear interpolation (SLERP)

Parameters:
| *[in]* **q** from
| *[in]* **r** to
| *[in]* **t** amout
| *[in]* **from** from
| *[in]* **to** to
| *[in]* **t** interpolant (amount) clamped between 0 and 1
| *[out]* **dest** result quaternion

.. c:function:: void glm_quat_look(vec3 eye, versor ori, mat4 dest)

| creates view matrix using quaternion as camera orientation

Parameters:
| *[in]* **eye** eye
| *[in]* **ori** orientation in world space as quaternion
| *[out]* **dest** result matrix

.. c:function:: void glm_quat_for(vec3 dir, vec3 fwd, vec3 up, versor dest)

| creates look rotation quaternion

Parameters:
| *[in]* **dir** direction to look
| *[in]* **fwd** forward vector
| *[in]* **up** up vector
| *[out]* **dest** result matrix

.. c:function:: void glm_quat_forp(vec3 from, vec3 to, vec3 fwd, vec3 up, versor dest)

| creates look rotation quaternion using source and destination positions p suffix stands for position

| this is similar to glm_quat_for except this computes direction for glm_quat_for for you.

Parameters:
| *[in]* **from** source point
| *[in]* **to** destination point
| *[in]* **fwd** forward vector
| *[in]* **up** up vector
| *[out]* **dest** result matrix

.. c:function:: void glm_quat_rotatev(versor q, vec3 v, vec3 dest)

| crotate vector using using quaternion

Parameters:
| *[in]* **q** quaternion
| *[in]* **v** vector to rotate
| *[out]* **dest** rotated vector

.. c:function:: void glm_quat_rotate(mat4 m, versor q, mat4 dest)

| rotate existing transform matrix using quaternion

instead of passing identity matrix, consider to use quat_mat4 functions

Parameters:
| *[in]* **m** existing transform matrix to rotate
| *[in]* **q** quaternion
| *[out]* **dest** rotated matrix/transform
Loading