euler angles
Header: cglm/euler.h
You may wonder what glm_euler_sq type ( _sq stands for sequence ) and
glm_euler_by_order()
do.
I used them to convert euler angles in one coordinate system to another. For
instance if you have Z_UP euler angles and if you want to convert it
to Y_UP axis then glm_euler_by_order()
is your friend. For more
information check glm_euler_order()
documentation
You must pass arrays as array, if you use C compiler then you can use something like this:
float pitch, yaw, roll;
mat4 rot;
/* pitch = ...; yaw = ...; roll = ... */
glm_euler((vec3){pitch, yaw, roll}, rot);
Rotation Conveniention
Current cglm’s euler functions uses these convention:
Tait–Bryan angles (x-y-z convention)
Intrinsic rotations (pitch, yaw and roll). This is reserve order of extrinsic (elevation, heading and bank) rotation
Right hand rule (actually all rotations in cglm use RH)
All angles used in cglm are RADIANS not degrees
NOTE: The default glm_euler()
function is the short name of
glm_euler_xyz()
this is why you can’t see glm_euler_xyz()
.
When you see an euler function which doesn’t have any X, Y, Z suffix then
assume that uses _xyz (or instead it accept order as parameter).
If rotation doesn’t work properly, your options:
If you use (or paste) degrees convert it to radians before calling an euler function
float pitch, yaw, roll;
mat4 rot;
/* pitch = degrees; yaw = degrees; roll = degrees */
glm_euler((vec3){glm_rad(pitch), glm_rad(yaw), glm_rad(roll)}, rot);
Convention mismatch. You may have extrinsic angles, if you do (if you must) then consider to use reverse order e.g if you have xyz extrinsic then use zyx
cglm may implemented it wrong, consider to create an issue to report it or pull request to fix it
Table of contents (click to go):
Types:
glm_euler_sq
Functions:
Functions documentation
-
glm_euler_sq glm_euler_order(int ord[3])
- packs euler angles order to glm_euler_sq enum.
To use
glm_euler_by_order()
function you need glm_euler_sq. You can get it with this function.You can build param like this:
X = 0, Y = 1, Z = 2if you have ZYX order then you pass this: [2, 1, 0] = ZYX. if you have YXZ order then you pass this: [1, 0, 2] = YXZ
As you can see first item specifies which axis will be first then the second one specifies which one will be next an so on.
- Parameters:
- [in] ord euler angles order [Angle1, Angle2, Angle2]
- Returns:
packed euler order
-
void glm_euler_angles(mat4 m, vec3 dest)
- extract euler angles (in radians) using xyz order
- Parameters:
- [in] m affine transform[out] dest angles vector [x, y, z]
-
void glm_euler(vec3 angles, mat4 dest)
- build rotation matrix from euler angles
this is alias of glm_euler_xyz function
- Parameters:
- [in] angles angles as vector [Xangle, Yangle, Zangle][in] dest rotation matrix
-
void glm_euler_xyz(vec3 angles, mat4 dest)
- build rotation matrix from euler angles
- Parameters:
- [in] angles angles as vector [Xangle, Yangle, Zangle][in] dest rotation matrix
-
void glm_euler_zyx(vec3 angles, mat4 dest)
- build rotation matrix from euler angles
- Parameters:
- [in] angles angles as vector [Xangle, Yangle, Zangle][in] dest rotation matrix
-
void glm_euler_zxy(vec3 angles, mat4 dest)
- build rotation matrix from euler angles
- Parameters:
- [in] angles angles as vector [Xangle, Yangle, Zangle][in] dest rotation matrix
-
void glm_euler_xzy(vec3 angles, mat4 dest)
- build rotation matrix from euler angles
- Parameters:
- [in] angles angles as vector [Xangle, Yangle, Zangle][in] dest rotation matrix
-
void glm_euler_yzx(vec3 angles, mat4 dest)
build rotation matrix from euler angles
- Parameters:
- [in] angles angles as vector [Xangle, Yangle, Zangle][in] dest rotation matrix
-
void glm_euler_yxz(vec3 angles, mat4 dest)
- build rotation matrix from euler angles
- Parameters:
- [in] angles angles as vector [Xangle, Yangle, Zangle][in] dest rotation matrix
-
void glm_euler_by_order(vec3 angles, glm_euler_sq ord, mat4 dest)
- build rotation matrix from euler angles with given euler order.
Use
glm_euler_order()
function to build ord parameter- Parameters:
- [in] angles angles as vector [Xangle, Yangle, Zangle][in] ord euler order[in] dest rotation matrix