forked from bartvdbraak/blender
math: Add functions to decompose transformation matrices
mat4_decompose() is similar to mat4_to_loc_rot_size() but returns rotation as quaternion. mat4_to_loc_quat() just returns location and rotation without size.
This commit is contained in:
parent
281e094e16
commit
e83e3b0cf7
@ -173,6 +173,8 @@ void rotate_m4(float mat[4][4], const char axis, const float angle);
|
|||||||
|
|
||||||
void mat3_to_rot_size(float rot[3][3], float size[3], float mat3[3][3]);
|
void mat3_to_rot_size(float rot[3][3], float size[3], float mat3[3][3]);
|
||||||
void mat4_to_loc_rot_size(float loc[3], float rot[3][3], float size[3], float wmat[4][4]);
|
void mat4_to_loc_rot_size(float loc[3], float rot[3][3], float size[3], float wmat[4][4]);
|
||||||
|
void mat4_to_loc_quat(float loc[3], float quat[4], float wmat[4][4]);
|
||||||
|
void mat4_decompose(float loc[3], float quat[4], float size[3], float wmat[4][4]);
|
||||||
|
|
||||||
void loc_eul_size_to_mat4(float R[4][4],
|
void loc_eul_size_to_mat4(float R[4][4],
|
||||||
const float loc[3], const float eul[3], const float size[3]);
|
const float loc[3], const float eul[3], const float size[3]);
|
||||||
|
@ -1212,6 +1212,33 @@ void mat4_to_loc_rot_size(float loc[3], float rot[3][3], float size[3], float wm
|
|||||||
copy_v3_v3(loc, wmat[3]);
|
copy_v3_v3(loc, wmat[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void mat4_to_loc_quat(float loc[3], float quat[4], float wmat[4][4])
|
||||||
|
{
|
||||||
|
float mat3[3][3];
|
||||||
|
float mat3_n[3][3]; /* normalized mat3 */
|
||||||
|
|
||||||
|
copy_m3_m4(mat3, wmat);
|
||||||
|
normalize_m3_m3(mat3_n, mat3);
|
||||||
|
|
||||||
|
/* so scale doesn't interfere with rotation [#24291] */
|
||||||
|
/* note: this is a workaround for negative matrix not working for rotation conversion, FIXME */
|
||||||
|
if (is_negative_m3(mat3)) {
|
||||||
|
negate_v3(mat3_n[0]);
|
||||||
|
negate_v3(mat3_n[1]);
|
||||||
|
negate_v3(mat3_n[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
mat3_to_quat(quat, mat3_n);
|
||||||
|
copy_v3_v3(loc, wmat[3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void mat4_decompose(float loc[3], float quat[4], float size[3], float wmat[4][4])
|
||||||
|
{
|
||||||
|
float rot[3][3];
|
||||||
|
mat4_to_loc_rot_size(loc, rot, size, wmat);
|
||||||
|
mat3_to_quat(quat, rot);
|
||||||
|
}
|
||||||
|
|
||||||
void scale_m3_fl(float m[3][3], float scale)
|
void scale_m3_fl(float m[3][3], float scale)
|
||||||
{
|
{
|
||||||
m[0][0] = m[1][1] = m[2][2] = scale;
|
m[0][0] = m[1][1] = m[2][2] = scale;
|
||||||
|
Loading…
Reference in New Issue
Block a user