[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [43733] trunk/blender/source/blender/ blenlib/intern/math_matrix.c: Fix orthogonality check for mat3 and mat4
Andrew Hale
trumanblending at gmail.com
Fri Jan 27 03:45:01 CET 2012
Hi Campbell,
This fix adds the condition that the columns be unit length which is a
requirement of orthogonal matrices [1].
>From Python you can check this with the code here [2]. This matrix is not
orthogonal, even though its columns are. For another example of a matrix
which has orthogonal columns but the matrix is not orthogonal, see here [3].
If the intention of the function is to check for true matrix orthogonality
then this change is consistent.
Cheers,
Andrew
PS That 1 in the final "if" should be 1.0f shouldn't it?
[1] http://mathworld.wolfram.com/OrthogonalMatrix.html
[2] http://www.pasteall.org/28577/python
[3] http://en.wikipedia.org/wiki/Orthogonal_matrix#Properties
On Fri, Jan 27, 2012 at 4:23 AM, Campbell Barton <ideasman42 at gmail.com>wrote:
> Can you give an example as to what case this fixes?
>
> On Fri, Jan 27, 2012 at 4:11 AM, Sv. Lockal <lockalsash at gmail.com> wrote:
> > Revision: 43733
> >
> http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=43733
> > Author: lockal
> > Date: 2012-01-26 17:11:43 +0000 (Thu, 26 Jan 2012)
> > Log Message:
> > -----------
> > Fix orthogonality check for mat3 and mat4
> >
> > Modified Paths:
> > --------------
> > trunk/blender/source/blender/blenlib/intern/math_matrix.c
> >
> > Modified: trunk/blender/source/blender/blenlib/intern/math_matrix.c
> > ===================================================================
> > --- trunk/blender/source/blender/blenlib/intern/math_matrix.c 2012-01-26
> 17:03:30 UTC (rev 43732)
> > +++ trunk/blender/source/blender/blenlib/intern/math_matrix.c 2012-01-26
> 17:11:43 UTC (rev 43733)
> > @@ -778,32 +778,38 @@
> > mul_v3_fl(mat[2], size[2]);
> > }
> >
> > -int is_orthogonal_m3(float mat[][3])
> > +int is_orthogonal_m3(float m[][3])
> > {
> > - if (fabsf(dot_v3v3(mat[0], mat[1])) > 1.5f * FLT_EPSILON)
> > - return 0;
> > + int i, j;
> >
> > - if (fabsf(dot_v3v3(mat[1], mat[2])) > 1.5f * FLT_EPSILON)
> > - return 0;
> > + for (i = 0; i < 3; i++) {
> > + for (j = 0; j < i; j++) {
> > + if (fabsf(dot_v3v3(m[i], m[j])) > 1.5f * FLT_EPSILON)
> > + return 0;
> > + }
> >
> > - if (fabsf(dot_v3v3(mat[0], mat[2])) > 1.5f * FLT_EPSILON)
> > - return 0;
> > -
> > - return 1;
> > + if (fabsf(dot_v3v3(m[i], m[i]) - 1) > 1.5f * FLT_EPSILON)
> > + return 0;
> > + }
> > +
> > + return 1;
> > }
> >
> > -int is_orthogonal_m4(float mat[][4])
> > +int is_orthogonal_m4(float m[][4])
> > {
> > - if (fabsf(dot_v3v3(mat[0], mat[1])) > 1.5f * FLT_EPSILON)
> > - return 0;
> > + int i, j;
> >
> > - if (fabsf(dot_v3v3(mat[1], mat[2])) > 1.5f * FLT_EPSILON)
> > - return 0;
> > + for (i = 0; i < 4; i++) {
> > + for (j = 0; j < i; j++) {
> > + if (fabsf(dot_vn_vn(m[i], m[j], 4)) > 1.5f * FLT_EPSILON)
> > + return 0;
> > + }
> >
> > - if (fabsf(dot_v3v3(mat[0], mat[2])) > 1.5f * FLT_EPSILON)
> > - return 0;
> > -
> > - return 1;
> > + if (fabsf(dot_vn_vn(m[i], m[i], 4) - 1) > 1.5f * FLT_EPSILON)
> > + return 0;
> > + }
> > +
> > + return 1;
> > }
> >
> > void normalize_m3(float mat[][3])
> >
> > _______________________________________________
> > Bf-blender-cvs mailing list
> > Bf-blender-cvs at blender.org
> > http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>
>
>
> --
> - Campbell
> _______________________________________________
> Bf-committers mailing list
> Bf-committers at blender.org
> http://lists.blender.org/mailman/listinfo/bf-committers
>
More information about the Bf-committers
mailing list