[Bf-blender-cvs] [7e5db850dc9] blender-v3.3-release: New math function to add small bias to zero axis

Antonio Vazquez noreply at git.blender.org
Mon Oct 17 16:31:17 CEST 2022


Commit: 7e5db850dc9d835ee85d85ae3126b0fa10dddcf8
Author: Antonio Vazquez
Date:   Wed Oct 5 22:10:53 2022 +0200
Branches: blender-v3.3-release
https://developer.blender.org/rB7e5db850dc9d835ee85d85ae3126b0fa10dddcf8

New math function to add small bias to zero axis

In some situations the zero axis can produce problems and need to add a small bias.

This function adds a small bias using the orthogonal result of the others valid axis.

Reviewed By: fclem

Differential Revision: https://developer.blender.org/D16158
6d

===================================================================

M	source/blender/blenlib/BLI_math_matrix.h
M	source/blender/blenlib/intern/math_matrix.c

===================================================================

diff --git a/source/blender/blenlib/BLI_math_matrix.h b/source/blender/blenlib/BLI_math_matrix.h
index c2dafbe3a1a..a622f6a2f55 100644
--- a/source/blender/blenlib/BLI_math_matrix.h
+++ b/source/blender/blenlib/BLI_math_matrix.h
@@ -367,6 +367,8 @@ void pseudoinverse_m4_m4(float Ainv[4][4], const float A[4][4], float epsilon);
 void pseudoinverse_m3_m3(float Ainv[3][3], const float A[3][3], float epsilon);
 
 bool has_zero_axis_m4(const float matrix[4][4]);
+/** Fix any zero scale axis adding a small bias orthogonal to the other valid axis. */
+void zero_axis_bias_m4(float mat[4][4]);
 
 void invert_m4_m4_safe(float Ainv[4][4], const float A[4][4]);
 
diff --git a/source/blender/blenlib/intern/math_matrix.c b/source/blender/blenlib/intern/math_matrix.c
index fcd017b3082..7b7082e5c0a 100644
--- a/source/blender/blenlib/intern/math_matrix.c
+++ b/source/blender/blenlib/intern/math_matrix.c
@@ -3122,6 +3122,34 @@ bool has_zero_axis_m4(const float matrix[4][4])
          len_squared_v3(matrix[2]) < FLT_EPSILON;
 }
 
+void zero_axis_bias_m4(float mat[4][4])
+{
+  const bool axis_x_degenerate = len_squared_v3(mat[0]) < FLT_EPSILON;
+  const bool axis_y_degenerate = len_squared_v3(mat[1]) < FLT_EPSILON;
+  const bool axis_z_degenerate = len_squared_v3(mat[2]) < FLT_EPSILON;
+
+  /* X Axis. */
+  if (axis_x_degenerate && !axis_y_degenerate && !axis_z_degenerate) {
+    cross_v3_v3v3(mat[0], mat[1], mat[2]);
+    mul_v3_fl(mat[0], FLT_EPSILON);
+    return;
+  }
+
+  /* Y Axis. */
+  if (!axis_x_degenerate && axis_y_degenerate && !axis_z_degenerate) {
+    cross_v3_v3v3(mat[1], mat[2], mat[0]);
+    mul_v3_fl(mat[1], FLT_EPSILON);
+    return;
+  }
+
+  /* Z Axis. */
+  if (!axis_x_degenerate && !axis_y_degenerate && axis_z_degenerate) {
+    cross_v3_v3v3(mat[2], mat[0], mat[1]);
+    mul_v3_fl(mat[2], FLT_EPSILON);
+    return;
+  }
+}
+
 void invert_m4_m4_safe(float Ainv[4][4], const float A[4][4])
 {
   if (!invert_m4_m4(Ainv, A)) {



More information about the Bf-blender-cvs mailing list