Does anyone know of a fast way to tell if a matrix has non-uniform scaling?
Detect non-uniform scaling in matrix
#2 Members - Reputation: 363
Posted 12 January 2013 - 11:46 AM
You can probably get the length of the basis vectors of the matrix (for example the length of the first, second and third row). This gives you the x, y and z scale. If they are not equal to each other there is non-uniform scaling.
Not sure if this is the best/safest or fastest method though, but it is definitely faster than doing full polar/spectral decomposition.
Edited by Buckshag, 12 January 2013 - 11:48 AM.
#4 Members - Reputation: 348
Posted 13 January 2013 - 04:30 AM
Thanks for the answer. This is the formula I came up with finally:
// note: this is opengl type matrix
bool Matrix::IsUnformScaling() const
{
const float THRESHOLD = 0.01f;
float xLen = m[0]*m[0] + m[1]*m[1] + m[2]*m[2];
float yLen = m[4]*m[4] + m[5]*m[5] + m[6]*m[6];
float zLen = m[8]*m[8] + m[9]*m[9] + m[10]*m[10];
return fabsf(xLen - yLen) < xLen*THRESHOLD && fabsf(xLen - zLen) < xLen*THRESHOLD;
}
I tested it and it seems to work ;)
#5 Members - Reputation: 5849
Posted 13 January 2013 - 01:01 PM
EDIT: More explicitly,
m[0] = 0.8; m[1] = 0.6; m[2] = 0.0; m[4] = 0.6; m[5] = 0.8; m[6] = 0.0; m[8] = 0.0; m[9] = 0.0; m[10] = 1.0;
Edited by Álvaro, 13 January 2013 - 01:07 PM.
#6 Members - Reputation: 348
Posted 13 January 2013 - 02:24 PM
I can construct a matrix that has non-uniform scaling in it and passes your test, though...
EDIT: More explicitly,m[0] = 0.8; m[1] = 0.6; m[2] = 0.0; m[4] = 0.6; m[5] = 0.8; m[6] = 0.0; m[8] = 0.0; m[9] = 0.0; m[10] = 1.0;
Ok, my bad.
do you have a solution perchance?
#7 Members - Reputation: 5849
Posted 13 January 2013 - 07:57 PM
bool are_orthogonal(Vector3 v, Vector3 w) {
static float const tolerance = 1e-6;
float dp = dot_product(v,w);
return dp * dp < dot_product(v,v) * dot_product(w,w) * tolerance;
}
EDIT: To be complete, you should also verify that the transformation preserves orientation (its determinant is positive).
Edited by Álvaro, 13 January 2013 - 07:58 PM.






