Blender V4.3
BLI_math_rotation.h File Reference
#include "BLI_math_base.h"
#include "BLI_utildefines.h"
#include "DNA_vec_types.h"

Go to the source code of this file.

Macros

Conversion Defines
#define RAD2DEG(_rad)   ((_rad) * (180.0 / M_PI))
 
#define DEG2RAD(_deg)   ((_deg) * (M_PI / 180.0))
 
#define RAD2DEGF(_rad)   ((_rad) * (float)(180.0 / M_PI))
 
#define DEG2RADF(_deg)   ((_deg) * (float)(M_PI / 180.0))
 

Functions

Axis Angle
void axis_angle_normalized_to_quat (float r[4], const float axis[3], float angle)
 
void axis_angle_to_quat (float r[4], const float axis[3], float angle)
 
void axis_angle_to_mat3 (float R[3][3], const float axis[3], float angle)
 
void axis_angle_normalized_to_mat3_ex (float mat[3][3], const float axis[3], float angle_sin, float angle_cos)
 
void axis_angle_normalized_to_mat3 (float R[3][3], const float axis[3], float angle)
 
void axis_angle_to_mat4 (float R[4][4], const float axis[3], float angle)
 
void mat3_normalized_to_axis_angle (float axis[3], float *angle, const float mat[3][3])
 
void mat4_normalized_to_axis_angle (float axis[3], float *angle, const float mat[4][4])
 
void mat3_to_axis_angle (float axis[3], float *angle, const float mat[3][3])
 
void mat4_to_axis_angle (float axis[3], float *angle, const float mat[4][4])
 
void quat_to_axis_angle (float axis[3], float *angle, const float q[4])
 
void angle_to_mat2 (float R[2][2], float angle)
 
void axis_angle_to_mat3_single (float R[3][3], char axis, float angle)
 
void axis_angle_to_mat4_single (float R[4][4], char axis, float angle)
 
void axis_angle_to_quat_single (float q[4], char axis, float angle)
 
Exponential Map
void quat_to_expmap (float expmap[3], const float q[4])
 
void quat_normalized_to_expmap (float expmap[3], const float q[4])
 
void expmap_to_quat (float r[4], const float expmap[3])
 
XYZ Eulers
void eul_to_quat (float quat[4], const float eul[3])
 
void eul_to_mat3 (float mat[3][3], const float eul[3])
 
void eul_to_mat4 (float mat[4][4], const float eul[3])
 
void mat3_normalized_to_eul (float eul[3], const float mat[3][3])
 
void mat4_normalized_to_eul (float eul[3], const float m[4][4])
 
void mat3_to_eul (float eul[3], const float mat[3][3])
 
void mat4_to_eul (float eul[3], const float mat[4][4])
 
void quat_to_eul (float eul[3], const float quat[4])
 
void mat3_normalized_to_compatible_eul (float eul[3], const float oldrot[3], float mat[3][3])
 
void mat3_to_compatible_eul (float eul[3], const float oldrot[3], float mat[3][3])
 
void quat_to_compatible_eul (float eul[3], const float oldrot[3], const float quat[4])
 
void rotate_eul (float beul[3], char axis, float angle)
 
void compatible_eul (float eul[3], const float oldrot[3])
 
void add_eul_euleul (float r_eul[3], float a[3], float b[3], short order)
 
void sub_eul_euleul (float r_eul[3], float a[3], float b[3], short order)
 
Dual Quaternions
void copy_dq_dq (DualQuat *r, const DualQuat *dq)
 
void normalize_dq (DualQuat *dq, float totweight)
 
void add_weighted_dq_dq (DualQuat *dq_sum, const DualQuat *dq, float weight)
 
void add_weighted_dq_dq_pivot (DualQuat *dq_sum, const DualQuat *dq, const float pivot[3], float weight, bool compute_scale_matrix)
 
void mul_v3m3_dq (float r[3], float R[3][3], DualQuat *dq)
 
void mat4_to_dquat (DualQuat *dq, const float basemat[4][4], const float mat[4][4])
 
void dquat_to_mat4 (float R[4][4], const DualQuat *dq)
 
void quat_apply_track (float quat[4], short axis, short upflag)
 
void vec_apply_track (float vec[3], short axis)
 
float focallength_to_fov (float focal_length, float sensor)
 
float fov_to_focallength (float hfov, float sensor)
 
float angle_wrap_rad (float angle)
 
float angle_wrap_deg (float angle)
 
float angle_compat_rad (float angle, float angle_compat)
 
bool mat3_from_axis_conversion (int src_forward, int src_up, int dst_forward, int dst_up, float r_mat[3][3])
 
bool mat3_from_axis_conversion_single (int src_axis, int dst_axis, float r_mat[3][3])
 

Quaternions

Stored in (w, x, y, z) order.

#define print_qt_id(q)   print_qt(STRINGIFY(q), q)
 
void unit_axis_angle (float axis[3], float *angle)
 
void unit_qt (float q[4])
 
void copy_qt_qt (float q[4], const float a[4])
 
void mul_qt_qtqt (float q[4], const float a[4], const float b[4])
 
void mul_qt_v3 (const float q[4], float r[3])
 
void mul_qt_fl (float q[4], float f)
 
void pow_qt_fl_normalized (float q[4], float fac)
 
void sub_qt_qtqt (float q[4], const float a[4], const float b[4])
 
void invert_qt (float q[4])
 
void invert_qt_qt (float q1[4], const float q2[4])
 
void invert_qt_normalized (float q[4])
 
void invert_qt_qt_normalized (float q1[4], const float q2[4])
 
void conjugate_qt (float q[4])
 
void conjugate_qt_qt (float q1[4], const float q2[4])
 
float dot_qtqt (const float a[4], const float b[4])
 
float normalize_qt (float q[4])
 
float normalize_qt_qt (float r[4], const float q[4])
 
bool is_zero_qt (const float q[4])
 
void interp_dot_slerp (float t, float cosom, float r_w[2])
 
void interp_qt_qtqt (float q[4], const float a[4], const float b[4], float t)
 
void add_qt_qtqt (float q[4], const float a[4], const float b[4], float t)
 
void quat_to_mat3 (float m[3][3], const float q[4])
 
void quat_to_mat4 (float m[4][4], const float q[4])
 
void quat_to_compatible_quat (float q[4], const float a[4], const float old[4])
 
void mat3_normalized_to_quat_fast (float q[4], const float mat[3][3])
 
void mat3_normalized_to_quat (float q[4], const float mat[3][3])
 
void mat4_normalized_to_quat (float q[4], const float mat[4][4])
 
void mat3_to_quat (float q[4], const float mat[3][3])
 
void mat4_to_quat (float q[4], const float mat[4][4])
 
void tri_to_quat_ex (float quat[4], const float v1[3], const float v2[3], const float v3[3], const float no_orig[3])
 
float tri_to_quat (float q[4], const float a[3], const float b[3], const float c[3])
 
void vec_to_quat (float q[4], const float vec[3], short axis, short upflag)
 
void rotation_between_vecs_to_mat3 (float m[3][3], const float v1[3], const float v2[3])
 
void rotation_between_vecs_to_quat (float q[4], const float v1[3], const float v2[3])
 
void rotation_between_quats_to_quat (float q[4], const float q1[4], const float q2[4])
 
float quat_split_swing_and_twist (const float q_in[4], int axis, float r_swing[4], float r_twist[4])
 
float angle_normalized_qt (const float q[4])
 
float angle_normalized_qtqt (const float q1[4], const float q2[4])
 
float angle_qt (const float q[4])
 
float angle_qtqt (const float q1[4], const float q2[4])
 
float angle_signed_normalized_qt (const float q[4])
 
float angle_signed_normalized_qtqt (const float q1[4], const float q2[4])
 
float angle_signed_qt (const float q[4])
 
float angle_signed_qtqt (const float q1[4], const float q2[4])
 
void mat3_to_quat_legacy (float q[4], const float wmat[3][3])
 
void sin_cos_from_fraction (int numerator, int denominator, float *r_sin, float *r_cos)
 
void print_qt (const char *str, const float q[4])
 

Arbitrary Order Eulers

enum  eEulerRotationOrders {
  EULER_ORDER_DEFAULT = 1 , EULER_ORDER_XYZ = 1 , EULER_ORDER_XZY , EULER_ORDER_YXZ ,
  EULER_ORDER_YZX , EULER_ORDER_ZXY , EULER_ORDER_ZYX
}
 
typedef enum eEulerRotationOrders eEulerRotationOrders
 
void eulO_to_quat (float q[4], const float e[3], short order)
 
void eulO_to_mat3 (float M[3][3], const float e[3], short order)
 
void eulO_to_mat4 (float mat[4][4], const float e[3], short order)
 
void eulO_to_axis_angle (float axis[3], float *angle, const float eul[3], short order)
 
void eulO_to_gimbal_axis (float gmat[3][3], const float eul[3], short order)
 
void mat3_normalized_to_eulO (float eul[3], short order, const float m[3][3])
 
void mat4_normalized_to_eulO (float eul[3], short order, const float m[4][4])
 
void mat3_to_eulO (float eul[3], short order, const float m[3][3])
 
void mat4_to_eulO (float eul[3], short order, const float m[4][4])
 
void quat_to_eulO (float e[3], short order, const float q[4])
 
void axis_angle_to_eulO (float eul[3], short order, const float axis[3], float angle)
 
void mat3_normalized_to_compatible_eulO (float eul[3], const float oldrot[3], short order, const float mat[3][3])
 
void mat4_normalized_to_compatible_eulO (float eul[3], const float oldrot[3], short order, const float mat[4][4])
 
void mat3_to_compatible_eulO (float eul[3], const float oldrot[3], short order, const float mat[3][3])
 
void mat4_to_compatible_eulO (float eul[3], const float oldrot[3], short order, const float mat[4][4])
 
void quat_to_compatible_eulO (float eul[3], const float oldrot[3], short order, const float quat[4])
 
void rotate_eulO (float beul[3], short order, char axis, float angle)
 

Macro Definition Documentation

◆ DEG2RAD

◆ DEG2RADF

#define DEG2RADF ( _deg)    ((_deg) * (float)(M_PI / 180.0))

Definition at line 27 of file BLI_math_rotation.h.

Referenced by blender::bke::add_auto_smooth_node_tree(), blender::ed::object::add_generic_props(), blender::geometry::angle_match(), blender::geometry::angle_wrap(), ANIM_unit_mapping_get_factor(), Freestyle::AppView::AppView(), ARMATURE_OT_roll_clear(), axisProjection(), bc_create_restpose_mat(), bevel_list_flip_tangents(), BKE_freestyle_config_init(), BKE_linestyle_alpha_modifier_add(), BKE_linestyle_color_modifier_add(), BKE_linestyle_geometry_modifier_add(), BKE_linestyle_thickness_modifier_add(), blo_do_versions_260(), blo_do_versions_270(), blo_do_versions_290(), blo_do_versions_userdef(), blo_update_defaults_scene(), BLO_update_defaults_startup_blend(), BM_edge_calc_face_angle(), BM_edge_calc_face_angle_signed(), BM_edge_calc_face_angle_with_imat3(), bm_interior_face_group_calc_cost(), BM_vert_calc_edge_angle(), bmo_join_triangles_exec(), blender::ed::sculpt_paint::greasepencil::compute_auto_flip(), AnimationImporter::convert_to_focal_length(), blender::bke::create_auto_smooth_modifier(), CURVE_OT_draw(), blender::ed::curves::CURVES_OT_draw(), def_cmp_bokehimage(), def_cmp_boxmask(), def_cmp_chroma_matte(), def_cmp_dblur(), def_cmp_defocus(), def_cmp_ellipsemask(), def_cmp_glare(), def_sh_tex_sky(), blender::ed::sculpt_paint::do_clay_thumb_brush(), blender::ed::sculpt_paint::do_multiplane_scrape_brush(), do_transform_effect(), do_version_constraints_radians_degrees_270_1(), do_versions_nodetree_convert_angle(), draw_vectorscope_graticule(), edbm_screw_exec(), edbm_tris_convert_to_quads_exec(), blender::geometry::find_best_fit_for_island(), blender::geometry::fix_large_angle(), blender::compositor::GlareStreaksOperation::generate_glare(), blender::geometry::PackIsland::get_diagonal_support(), GPU_matrix_rotate_2d(), GPU_matrix_rotate_3fv(), GPU_matrix_rotate_axis(), imm_draw_circle_partial(), imm_draw_circle_partial_3d(), imm_draw_disk_partial(), imm_draw_disk_partial_3d(), init_text_effect(), join_triangle_props(), knife_snap_angle_relative(), knife_snap_angle_screen(), laplacian_triangle_area(), make_bevel_list_3D_minimum_twist(), MESH_OT_beautify_fill(), MESH_OT_dissolve_limited(), MESH_OT_edges_select_sharp(), MESH_OT_faces_select_linked_flat(), MESH_OT_knife_tool(), MESH_OT_spin(), MESH_OT_vert_connect_nonplanar(), blender::ed::sculpt_paint::multiplane_scrape_preview_draw(), blender::nodes::node_composite_chroma_matte_cc::node_composit_init_chroma_matte(), blender::nodes::node_shader_tex_sky_cc::node_shader_init_tex_sky(), blender::ed::object::OBJECT_OT_convert(), blender::ed::object::OBJECT_OT_shade_auto_smooth(), blender::ed::object::OBJECT_OT_shade_smooth_by_angle(), blender::draw::overlay::ForceFields::object_sync(), blender::ed::sculpt_paint::greasepencil::TwistOperation::on_stroke_extended(), OVERLAY_forcefield(), blender::geometry::pack_gobel(), blender::geometry::pack_islands_alpaca_rotate(), blender::geometry::plusminus_90_angle(), radial_control_modal(), blender::io::usd::USDLightReader::read_object_data(), rna_def_area_light(), rna_def_constraint_transform(), rna_def_linestyle(), rna_def_material_greasepencil(), rna_def_modifier_bevel(), rna_def_modifier_edgesplit(), rna_def_modifier_grease_pencil_texture(), rna_def_modifier_normaledit(), rna_def_scene_eevee(), rna_def_spot_light(), rna_def_statvis(), rna_def_sun_light(), rna_def_text(), rna_def_tool_settings(), rna_def_userdef_input(), rna_def_wipe(), RNA_def_world(), blender::geometry::rotate_inside_square(), seq_set_wipe_angle_cb(), seq_text_data_update(), blender::draw::statvis_calc_sharp(), blender::ed::object::TRANSFORM_OT_vertex_warp(), ui_but_pie_dir(), ui_draw_but_VECTORSCOPE(), blender::compositor::MathRadiansOperation::update_memory_buffer_partial(), blender::geometry::UVMinimumEnclosingSquareFinder::update_recursive(), UV_OT_smart_project(), v3d_editvertex_buts(), valuefn(), vectorscope_draw_target(), vieworbit_exec(), viewroll_exec(), viewrotate_apply_snap(), wm_gesture_straightline_do_angle_snap(), DocumentImporter::writeCamera(), DocumentImporter::writeLight(), and xml_read_transform().

◆ print_qt_id

#define print_qt_id ( q)    print_qt(STRINGIFY(q), q)

Definition at line 210 of file BLI_math_rotation.h.

◆ RAD2DEG

#define RAD2DEG ( _rad)    ((_rad) * (180.0 / M_PI))

◆ RAD2DEGF

Typedef Documentation

◆ eEulerRotationOrders

Enumeration Type Documentation

◆ eEulerRotationOrders

Enumerator
EULER_ORDER_DEFAULT 
EULER_ORDER_XYZ 
EULER_ORDER_XZY 
EULER_ORDER_YXZ 
EULER_ORDER_YZX 
EULER_ORDER_ZXY 
EULER_ORDER_ZYX 

Definition at line 329 of file BLI_math_rotation.h.

Function Documentation

◆ add_eul_euleul()

void add_eul_euleul ( float r_eul[3],
float a[3],
float b[3],
short order )

Definition at line 1933 of file math_rotation.c.

References b, eulO_to_quat(), mul_qt_qtqt(), and quat_to_eulO().

Referenced by ElementRotation_ex().

◆ add_qt_qtqt()

void add_qt_qtqt ( float q[4],
const float a[4],
const float b[4],
float t )

Definition at line 916 of file math_rotation.c.

References b.

Referenced by Quaternion_add().

◆ add_weighted_dq_dq()

void add_weighted_dq_dq ( DualQuat * dq_sum,
const DualQuat * dq,
float weight )

◆ add_weighted_dq_dq_pivot()

void add_weighted_dq_dq_pivot ( DualQuat * dq_sum,
const DualQuat * dq,
const float pivot[3],
const float weight,
const bool compute_scale_matrix )

Add the transformation defined by the given dual quaternion to the accumulator, using the specified pivot point for combining scale transformations.

If the resulting dual quaternion would only be used to transform the pivot point itself, this function can avoid fully computing the combined scale matrix to get a performance boost without affecting the result.

Definition at line 2108 of file math_rotation.c.

References add_weighted_dq_dq(), mul_v3_m4v3(), DualQuat::quat, DualQuat::scale, DualQuat::scale_weight, sub_v3_v3(), and DualQuat::trans.

Referenced by armdef_accumulate_matrix(), and pchan_deform_accumulate().

◆ angle_compat_rad()

float angle_compat_rad ( float angle,
float angle_compat )

Returns an angle compatible with angle_compat.

Definition at line 2336 of file math_rotation.c.

References angle_wrap_rad().

Referenced by gizmo_bisect_prop_angle_set(), gizmo_spin_prop_axis_angle_set(), and recalcData_edit_armature().

◆ angle_normalized_qt()

float angle_normalized_qt ( const float q[4])

◆ angle_normalized_qtqt()

float angle_normalized_qtqt ( const float q1[4],
const float q2[4] )

◆ angle_qt()

float angle_qt ( const float q[4])

Definition at line 626 of file math_rotation.c.

References angle_normalized_qt(), and normalize_qt_qt().

◆ angle_qtqt()

float angle_qtqt ( const float q1[4],
const float q2[4] )

Definition at line 647 of file math_rotation.c.

References angle_normalized_qtqt(), normalize_qt_qt(), and q1.

Referenced by angle_signed_qtqt().

◆ angle_signed_normalized_qt()

float angle_signed_normalized_qt ( const float q[4])

Definition at line 669 of file math_rotation.c.

References BLI_ASSERT_UNIT_QUAT, and safe_acosf().

Referenced by angle_signed_qt().

◆ angle_signed_normalized_qtqt()

float angle_signed_normalized_qtqt ( const float q1[4],
const float q2[4] )

Definition at line 679 of file math_rotation.c.

References angle_normalized_qtqt(), dot_qtqt(), negate_v4_v4(), and q1.

Referenced by ED_view3d_smooth_view_ex().

◆ angle_signed_qt()

float angle_signed_qt ( const float q[4])

Definition at line 690 of file math_rotation.c.

References angle_signed_normalized_qt(), and normalize_qt_qt().

◆ angle_signed_qtqt()

float angle_signed_qtqt ( const float q1[4],
const float q2[4] )

Definition at line 699 of file math_rotation.c.

References angle_qtqt(), dot_qtqt(), negate_v4_v4(), and q1.

Referenced by ED_view3d_quat_to_axis_view(), and view_axis_exec().

◆ angle_to_mat2()

◆ angle_wrap_deg()

float angle_wrap_deg ( float angle)

Definition at line 2331 of file math_rotation.c.

References mod_inline().

◆ angle_wrap_rad()

◆ axis_angle_normalized_to_mat3()

◆ axis_angle_normalized_to_mat3_ex()

void axis_angle_normalized_to_mat3_ex ( float mat[3][3],
const float axis[3],
float angle_sin,
float angle_cos )

axis angle to 3x3 matrix

This takes the angle with sin/cos applied so we can avoid calculating it in some cases.

Parameters
axisrotation axis (must be normalized).
angle_sinsin(angle)
angle_coscos(angle)

Definition at line 1124 of file math_rotation.c.

References BLI_ASSERT_UNIT_V3.

Referenced by axis_angle_normalized_to_mat3(), and rotation_between_vecs_to_mat3().

◆ axis_angle_normalized_to_quat()

◆ axis_angle_to_eulO()

void axis_angle_to_eulO ( float eul[3],
short order,
const float axis[3],
float angle )

◆ axis_angle_to_mat3()

◆ axis_angle_to_mat3_single()

void axis_angle_to_mat3_single ( float R[3][3],
char axis,
float angle )

◆ axis_angle_to_mat4()

void axis_angle_to_mat4 ( float R[4][4],
const float axis[3],
float angle )

Axis angle to 4x4 matrix - safer version (normalization of axis performed).

Definition at line 1177 of file math_rotation.c.

References axis_angle_to_mat3(), copy_m4_m3(), R, and unit_m4().

Referenced by constraintob_from_transdata(), TransformReader::dae_rotate_to_mat4(), AnimationImporter::evaluate_animation(), and GPU_matrix_rotate_3fv().

◆ axis_angle_to_mat4_single()

◆ axis_angle_to_quat()

◆ axis_angle_to_quat_single()

void axis_angle_to_quat_single ( float q[4],
char axis,
float angle )

◆ compatible_eul()

void compatible_eul ( float eul[3],
const float oldrot[3] )

Manipulate eul so it's close to oldrot while representing the same rotation with the aim of having the minimum difference between all axes.

This is typically done so interpolating the values between two euler rotations doesn't add undesired rotation (even rotating multiple times around one axis).

Definition at line 1514 of file math_rotation.c.

References fabsf, float, floorf, M_PI, and M_PI_2.

Referenced by dvar_eval_transChan(), Euler_make_compatible(), mat3_normalized_to_compatible_eul(), mat3_normalized_to_compatible_eulO(), and rotlike_evaluate().

◆ conjugate_qt()

void conjugate_qt ( float q[4])

Definition at line 99 of file math_rotation.c.

Referenced by invert_qt(), invert_qt_normalized(), and Quaternion_conjugate().

◆ conjugate_qt_qt()

void conjugate_qt_qt ( float q1[4],
const float q2[4] )

Definition at line 91 of file math_rotation.c.

References q1.

Referenced by rotation_between_quats_to_quat().

◆ copy_dq_dq()

void copy_dq_dq ( DualQuat * r,
const DualQuat * dq )

Definition at line 2225 of file math_rotation.c.

◆ copy_qt_qt()

void copy_qt_qt ( float q[4],
const float a[4] )

Definition at line 47 of file math_rotation.c.

Referenced by add_pose_transdata(), bevel_list_smooth(), BKE_object_tfm_backup(), BKE_object_tfm_restore(), BKE_pose_copy_pchan_result(), BKE_screen_view3d_do_versions_250(), BKE_where_on_path(), blo_update_defaults_screen(), bm_edgering_pair_interpolate(), boid_body(), calc_curve_deform(), createTransCursor_view3d(), createTransMBallVerts(), createTransSculpt(), do_path_effectors(), blender::ed::sculpt_paint::pose::do_pose_brush(), dquat_to_mat4(), ED_view3d_cameracontrol_acquire(), ED_view3d_cameracontrol_release(), ED_view3d_cursor3d_position_rotation(), ED_view3d_cursor3d_update(), ED_view3d_lastview_store(), ED_view3d_quat_from_axis_view(), ED_view3d_smooth_view_ex(), fcurves_to_pchan_links_get(), ViewOpsData::init_navigation(), interp_qt_qtqt(), interpolate_pathcache(), invert_qt_qt(), invert_qt_qt_normalized(), blender::ed::object::metaball_coords_and_quats_apply_with_mat4(), blender::ed::object::metaball_coords_and_quats_get(), minimum_twist_between_two_points(), modify_mesh(), normalize_qt_qt(), blender::ed::object::object_clear_rot(), ObjectToTransData(), offset_child(), pose_bone_do_paste(), pose_mirror_info_init(), pose_mirror_info_restore(), pose_slide_apply_quat(), poseAnim_mapping_reset(), psys_cache_edit_paths_iter(), psys_cache_paths(), psys_get_birth_coords(), psys_get_from_key(), psys_get_particle_on_path(), psys_path_iter_get(), psys_thread_create_path(), quat_mul_float(), quat_to_compatible_quat(), Quaternion_CreatePyObject(), Quaternion_imatmul(), restoreElement(), rotateBevelPiece(), blender::ed::object::rotation_from_view(), ViewOpsData::state_backup(), ViewOpsData::state_restore(), transform_data_ext_rotate(), view3d_localview_update_rv3d(), view3d_smooth_view_state_backup(), view3d_smooth_view_state_restore(), viewrotate_apply(), viewrotate_apply_snap(), WM_xr_action_binding_create(), WM_xr_action_state_get(), wm_xr_draw_matrices_create(), wm_xr_navigation_fly_modal(), wm_xr_session_event_create(), WM_xr_session_state_controller_aim_rotation_get(), WM_xr_session_state_controller_grip_rotation_get(), WM_xr_session_state_nav_rotation_get(), WM_xr_session_state_nav_rotation_set(), and wm_xr_session_state_update().

◆ dot_qtqt()

◆ dquat_to_mat4()

void dquat_to_mat4 ( float R[4][4],
const DualQuat * dq )

◆ eul_to_mat3()

◆ eul_to_mat4()

void eul_to_mat4 ( float mat[4][4],
const float eul[3] )

Definition at line 1366 of file math_rotation.c.

References cos(), and float.

Referenced by BKE_texture_mapping_init().

◆ eul_to_quat()

void eul_to_quat ( float quat[4],
const float eul[3] )

◆ eulO_to_axis_angle()

void eulO_to_axis_angle ( float axis[3],
float * angle,
const float eul[3],
short order )

◆ eulO_to_gimbal_axis()

void eulO_to_gimbal_axis ( float gmat[3][3],
const float eul[3],
short order )

The matrix is written to as 3 axis vectors.

Definition at line 1911 of file math_rotation.c.

References copy_v3_v3(), eulO_to_mat3(), get_rotation_order_info(), R, and zero_v3().

Referenced by gimbal_axis_object(), and gimbal_axis_pose().

◆ eulO_to_mat3()

◆ eulO_to_mat4()

void eulO_to_mat4 ( float mat[4][4],
const float e[3],
short order )

Construct 4x4 matrix from Euler angles (in radians).

Definition at line 1761 of file math_rotation.c.

References copy_m4_m3(), e, and eulO_to_mat3().

Referenced by BKE_pchan_minmax(), C_Matrix_LocRotScale(), and constraintob_from_transdata().

◆ eulO_to_quat()

void eulO_to_quat ( float q[4],
const float e[3],
short order )

◆ expmap_to_quat()

void expmap_to_quat ( float r[4],
const float expmap[3] )

◆ focallength_to_fov()

float focallength_to_fov ( float focal_length,
float sensor )

◆ fov_to_focallength()

float fov_to_focallength ( float hfov,
float sensor )

◆ interp_dot_slerp()

void interp_dot_slerp ( float t,
float cosom,
float r_w[2] )

Generic function for implementing slerp (quaternions and spherical vector coords).

Parameters
tfactor in [0..1]
cosomdot product from normalized vectors/quats.
r_wcalculated weights.

Definition at line 868 of file math_rotation.c.

References acosf, BLI_assert, eps, fabsf, IN_RANGE_INCL, LIKELY, and sinf.

Referenced by interp_qt_qtqt(), interp_v2_v2v2_slerp(), interp_v3_v3v3_slerp(), and Vector_slerp().

◆ interp_qt_qtqt()

◆ invert_qt()

void invert_qt ( float q[4])

Definition at line 111 of file math_rotation.c.

References conjugate_qt(), dot_qtqt(), and mul_qt_fl().

Referenced by invert_qt_qt(), and Quaternion_invert().

◆ invert_qt_normalized()

void invert_qt_normalized ( float q[4])

This is just conjugate_qt for cases we know q is unit-length. we could use conjugate_qt directly, but use this function to show intent, and assert if its ever becomes non-unit-length.

Definition at line 129 of file math_rotation.c.

References BLI_ASSERT_UNIT_QUAT, and conjugate_qt().

Referenced by BKE_object_mat3_to_rot(), dvar_eval_rotDiff(), ED_view3d_from_m4(), invert_qt_qt_normalized(), nla_combine_quaternion_get_inverted_lower_values(), nla_combine_quaternion_get_inverted_strip_values(), sub_eul_euleul(), view3d_boxview_sync_axis(), view3d_orbit_apply_dyn_ofs(), view_axis_exec(), and viewrotate_apply_snap().

◆ invert_qt_qt()

void invert_qt_qt ( float q1[4],
const float q2[4] )

Definition at line 123 of file math_rotation.c.

References copy_qt_qt(), invert_qt(), and q1.

◆ invert_qt_qt_normalized()

◆ is_zero_qt()

bool is_zero_qt ( const float q[4])

Definition at line 55 of file math_rotation.c.

◆ mat3_from_axis_conversion()

bool mat3_from_axis_conversion ( int src_forward,
int src_up,
int dst_forward,
int dst_up,
float r_mat[3][3] )

◆ mat3_from_axis_conversion_single()

bool mat3_from_axis_conversion_single ( int src_axis,
int dst_axis,
float r_mat[3][3] )

Use when the second axis can be guessed.

Definition at line 2457 of file math_rotation.c.

References mat3_from_axis_conversion(), and unit_m3().

Referenced by single_axis_convert(), and blender::math::tests::TEST().

◆ mat3_normalized_to_axis_angle()

void mat3_normalized_to_axis_angle ( float axis[3],
float * angle,
const float mat[3][3] )

3x3 matrix to axis angle.

Definition at line 1186 of file math_rotation.c.

References mat3_normalized_to_quat(), and quat_to_axis_angle().

Referenced by BKE_pchan_mat3_to_rot(), and pivotcon_evaluate().

◆ mat3_normalized_to_compatible_eul()

void mat3_normalized_to_compatible_eul ( float eul[3],
const float oldrot[3],
float mat[3][3] )

◆ mat3_normalized_to_compatible_eulO()

void mat3_normalized_to_compatible_eulO ( float eul[3],
const float oldrot[3],
short order,
const float mat[3][3] )

◆ mat3_normalized_to_eul()

void mat3_normalized_to_eul ( float eul[3],
const float mat[3][3] )

◆ mat3_normalized_to_eulO()

void mat3_normalized_to_eulO ( float eul[3],
short order,
const float m[3][3] )

Convert 3x3 matrix to Euler angles (in radians).

Definition at line 1770 of file math_rotation.c.

References copy_v3_v3(), fabsf, and mat3_normalized_to_eulo2().

Referenced by BKE_pchan_mat3_to_rot(), mat3_to_eulO(), mat4_normalized_to_eulO(), mat4_to_eulO(), Matrix_to_euler(), and quat_to_eulO().

◆ mat3_normalized_to_quat()

◆ mat3_normalized_to_quat_fast()

void mat3_normalized_to_quat_fast ( float q[4],
const float mat[3][3] )

◆ mat3_to_axis_angle()

void mat3_to_axis_angle ( float axis[3],
float * angle,
const float mat[3][3] )

Definition at line 1195 of file math_rotation.c.

References mat3_to_quat(), and quat_to_axis_angle().

Referenced by transform_data_ext_rotate().

◆ mat3_to_compatible_eul()

void mat3_to_compatible_eul ( float eul[3],
const float oldrot[3],
float mat[3][3] )

Definition at line 1578 of file math_rotation.c.

References mat3_normalized_to_compatible_eul(), and normalize_m3_m3().

◆ mat3_to_compatible_eulO()

void mat3_to_compatible_eulO ( float eul[3],
const float oldrot[3],
short order,
const float mat[3][3] )

◆ mat3_to_eul()

◆ mat3_to_eulO()

void mat3_to_eulO ( float eul[3],
short order,
const float m[3][3] )

◆ mat3_to_quat()

◆ mat3_to_quat_legacy()

void mat3_to_quat_legacy ( float q[4],
const float wmat[3][3] )

Legacy matrix to quaternion conversion, keep to prevent changes to existing boids & particle-system behavior. Use mat3_to_quat for new code.

Definition at line 421 of file math_rotation.c.

References angle(), atan2f, copy_m3_m3(), cosf, invert_m3_m3(), mul_m3_v3(), mul_qt_qtqt(), nor, normalize_m3(), normalize_v3(), q1, quat_to_mat3_no_error(), safe_acosf(), and sinf.

Referenced by boid_body(), psys_cache_edit_paths_iter(), psys_cache_paths(), and psys_get_birth_coords().

◆ mat4_normalized_to_axis_angle()

void mat4_normalized_to_axis_angle ( float axis[3],
float * angle,
const float mat[4][4] )

4x4 matrix to axis angle.

Definition at line 1205 of file math_rotation.c.

References mat4_normalized_to_quat(), and quat_to_axis_angle().

◆ mat4_normalized_to_compatible_eulO()

void mat4_normalized_to_compatible_eulO ( float eul[3],
const float oldrot[3],
short order,
const float mat[4][4] )

Definition at line 1847 of file math_rotation.c.

References copy_m3_m4(), and mat3_normalized_to_compatible_eulO().

◆ mat4_normalized_to_eul()

void mat4_normalized_to_eul ( float eul[3],
const float m[4][4] )

Definition at line 1445 of file math_rotation.c.

References copy_m3_m4(), and mat3_normalized_to_eul().

◆ mat4_normalized_to_eulO()

void mat4_normalized_to_eulO ( float eul[3],
short order,
const float m[4][4] )

Convert 4x4 matrix to Euler angles (in radians).

Definition at line 1795 of file math_rotation.c.

References copy_m3_m4(), and mat3_normalized_to_eulO().

◆ mat4_normalized_to_quat()

void mat4_normalized_to_quat ( float q[4],
const float mat[4][4] )

◆ mat4_to_axis_angle()

void mat4_to_axis_angle ( float axis[3],
float * angle,
const float mat[4][4] )

4x4 matrix to axis angle.

Definition at line 1215 of file math_rotation.c.

References mat4_to_quat(), and quat_to_axis_angle().

Referenced by constraintRotLim(), and blender::animrig::visualkey_get_values().

◆ mat4_to_compatible_eulO()

void mat4_to_compatible_eulO ( float eul[3],
const float oldrot[3],
short order,
const float mat[4][4] )

Definition at line 1858 of file math_rotation.c.

References copy_m3_m4(), mat3_normalized_to_compatible_eulO(), and normalize_m3().

Referenced by rotlike_evaluate().

◆ mat4_to_dquat()

◆ mat4_to_eul()

void mat4_to_eul ( float eul[3],
const float mat[4][4] )

Definition at line 1451 of file math_rotation.c.

References copy_m3_m4(), and mat3_to_eul().

Referenced by actcon_get_tarmat(), and bc_decompose().

◆ mat4_to_eulO()

◆ mat4_to_quat()

◆ mul_qt_fl()

◆ mul_qt_qtqt()

◆ mul_qt_v3()

void mul_qt_v3 ( const float q[4],
float r[3] )
Note
Assumes a unit quaternion?

in fact not, but you may want to use a unit quaternion read on...

Shortcut for 'q v q*' when v is actually a quaternion. This removes the need for converting a vector to a quaternion, calculating q's conjugate and converting back to a vector. It also happens to be faster (17+,24* vs * 24+,32*). If q is not a unit quaternion, then v will be both rotated by the same amount as if q was a unit quaternion, and scaled by the square of the length of q.

For people used to python mathutils, its like: def mul_qt_v3(q, v): (q * Quaternion((0.0, v[0], v[1], v[2])) * q.conjugated())[1:]

Note
Multiplying by 3x3 matrix is ~25% faster.

Definition at line 73 of file math_rotation.c.

Referenced by axis_angle_to_gimbal_axis(), bevel_list_smooth(), bm_edgering_pair_interpolate(), boid_body(), calc_curve_deform(), blender::draw::curve_create_edit_curves_nor(), do_guides(), do_kink(), do_physical_effector(), draw_view_axis(), DRW_draw_cursor(), ED_view3d_cursor3d_position_rotation(), ED_view3d_distance_set(), ED_view3d_distance_set_from_location(), explodeMesh(), get_effector_data(), gizmo_ruler_draw(), knifetool_draw_angle(), make_bevel_list_3D_minimum_twist(), mball_select_similar_type(), mball_select_similar_type_get(), modify_mesh(), offset_child(), psys_get_birth_coords(), psys_get_dupli_path_transform(), psys_thread_create_path(), Quaternion_matmul(), recalcData_edit_armature(), rotateBevelPiece(), rule_average_speed(), view3d_boxview_sync_axis(), view3d_orbit_apply_dyn_ofs(), view3d_orbit_apply_dyn_ofs_ortho_correction(), viewrotate_apply_snap(), wm_xr_navigation_reset_exec(), and wm_xr_raycast_update().

◆ mul_v3m3_dq()

◆ normalize_dq()

void normalize_dq ( DualQuat * dq,
float totweight )

◆ normalize_qt()

◆ normalize_qt_qt()

◆ pow_qt_fl_normalized()

void pow_qt_fl_normalized ( float q[4],
float fac )

◆ print_qt()

void print_qt ( const char * str,
const float q[4] )

Definition at line 1044 of file math_rotation.c.

References printf, and str.

◆ quat_apply_track()

void quat_apply_track ( float quat[4],
short axis,
short upflag )

◆ quat_normalized_to_expmap()

void quat_normalized_to_expmap ( float expmap[3],
const float q[4] )

Definition at line 1305 of file math_rotation.c.

References angle(), BLI_ASSERT_UNIT_QUAT, mul_v3_fl(), and quat_to_axis_angle().

Referenced by quat_to_expmap().

◆ quat_split_swing_and_twist()

float quat_split_swing_and_twist ( const float q_in[4],
int axis,
float r_swing[4],
float r_twist[4] )

Decompose a quaternion into a swing rotation (quaternion with the selected axis component locked at zero), followed by a twist rotation around the axis.

Parameters
qinput quaternion.
axistwist axis in [0,1,2]
r_swingif not NULL, receives the swing quaternion.
r_twistif not NULL, receives the twist quaternion.
Returns
twist angle.

Definition at line 565 of file math_rotation.c.

References atan2f, BLI_assert, BLI_ASSERT_UNIT_EPSILON, copy_v4_v4(), cosf, fabsf, mul_qt_qtqt(), negate_v4_v4(), sinf, and zero_v3().

Referenced by BKE_driver_target_matrix_to_rot_channels(), mat3_vec_to_roll(), Quaternion_to_swing_twist(), and TEST().

◆ quat_to_axis_angle()

◆ quat_to_compatible_eul()

void quat_to_compatible_eul ( float eul[3],
const float oldrot[3],
const float quat[4] )

◆ quat_to_compatible_eulO()

void quat_to_compatible_eulO ( float eul[3],
const float oldrot[3],
short order,
const float quat[4] )

◆ quat_to_compatible_quat()

void quat_to_compatible_quat ( float q[4],
const float a[4],
const float old[4] )

Apply the rotation of a to q keeping the values compatible with old. Avoid axis flipping for animated f-curves for eg.

Definition at line 172 of file math_rotation.c.

References BLI_ASSERT_UNIT_QUAT, copy_qt_qt(), eps, len_squared_v4v4(), mul_qt_qtqt(), negate_v4_v4(), normalize_qt_qt(), and rotation_between_quats_to_quat().

Referenced by pose_slide_apply_quat(), and Quaternion_make_compatible().

◆ quat_to_eul()

◆ quat_to_eulO()

void quat_to_eulO ( float e[3],
short order,
const float q[4] )

◆ quat_to_expmap()

void quat_to_expmap ( float expmap[3],
const float q[4] )

Definition at line 1317 of file math_rotation.c.

References normalize_qt_qt(), and quat_normalized_to_expmap().

Referenced by Quaternion_to_exponential_map().

◆ quat_to_mat3()

◆ quat_to_mat4()

◆ rotate_eul()

void rotate_eul ( float beul[3],
char axis,
float angle )

Definition at line 1489 of file math_rotation.c.

References angle(), BLI_assert, eul_to_mat3(), mat3_to_eul(), and mul_m3_m3m3().

◆ rotate_eulO()

void rotate_eulO ( float beul[3],
short order,
char axis,
float angle )

◆ rotation_between_quats_to_quat()

void rotation_between_quats_to_quat ( float q[4],
const float q1[4],
const float q2[4] )

◆ rotation_between_vecs_to_mat3()

◆ rotation_between_vecs_to_quat()

◆ sin_cos_from_fraction()

void sin_cos_from_fraction ( int numerator,
int denominator,
float * r_sin,
float * r_cos )

Utility that performs sinf & cosf intended for plotting a 2D circle, where the values of the coordinates with are exactly symmetrical although this favors even numbers as odd numbers can only be symmetrical on a single axis.

Besides adjustments to precision, this function is the equivalent of:

float phi = (2 * M_PI) * (float)i / (float)denominator;
*r_sin = sinf(phi);
*r_cos = cosf(phi);
#define M_PI
#define sinf(x)
#define cosf(x)
draw_view in_light_buf[] float
Parameters
numeratorAn integer factor in [0..denominator] (inclusive).
denominatorThe fraction denominator (typically the number of segments of the circle).
r_sinThe resulting sine.
r_cosThe resulting cosine.

Definition at line 985 of file math_rotation.c.

References BLI_assert, BLI_assert_unreachable, cosf, ELEM, float, M_PI, sinf, and SWAP.

Referenced by bmo_create_circle_exec(), bmo_create_cone_exec(), bmo_create_uvsphere_exec(), TEST(), TEST(), test_sin_cos_from_fraction_accuracy(), and test_sin_cos_from_fraction_symmetry().

◆ sub_eul_euleul()

void sub_eul_euleul ( float r_eul[3],
float a[3],
float b[3],
short order )

Definition at line 1945 of file math_rotation.c.

References b, eulO_to_quat(), invert_qt_normalized(), mul_qt_qtqt(), and quat_to_eulO().

Referenced by ElementRotation_ex().

◆ sub_qt_qtqt()

void sub_qt_qtqt ( float q[4],
const float a[4],
const float b[4] )

◆ tri_to_quat()

float tri_to_quat ( float q[4],
const float a[3],
const float b[3],
const float c[3] )
Returns
the length of the normal, use to test for degenerate triangles.

Definition at line 976 of file math_rotation.c.

References b, len, normal_tri_v3(), and tri_to_quat_ex().

Referenced by make_bevel_list_3D_tangent(), and ob_parvert3().

◆ tri_to_quat_ex()

void tri_to_quat_ex ( float quat[4],
const float v1[3],
const float v2[3],
const float v3[3],
const float no_orig[3] )

Same as tri_to_quat() but takes pre-computed normal from the triangle used for ngons when we know their normal.

Definition at line 924 of file math_rotation.c.

References angle(), atan2f, copy_v3_v3(), cosf, invert_m3_m3(), mul_m3_v3(), mul_qt_qtqt(), normal_tri_v3(), normalize_v3(), q1, quat_to_mat3(), safe_acosf(), sinf, sub_v3_v3v3(), and v2.

Referenced by get_dupliface_transform_from_coords(), tan_calc_quat_v3(), and tri_to_quat().

◆ unit_axis_angle()

◆ unit_qt()

◆ vec_apply_track()

void vec_apply_track ( float vec[3],
short axis )

Definition at line 2268 of file math_rotation.c.

References BLI_assert, and copy_v3_v3().

Referenced by calc_curve_deform().

◆ vec_to_quat()