[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
Lockal S
lockalsash at gmail.com
Sat Jan 28 10:31:00 CET 2012
Sorry for double posting, I'm not sure if the previous mail got to the list.
Old behavior:
Matrix(((0, 0, 10), (0, 20, 0), (0, 0, 0))).is_orthogonal returned
true, but this matrix is not orthogonal
Matrix(((0, 0, 1, 42), (0, 1, 0, 0x42), (0, 0, 0, 100500), (-42, 42,
0xDEAD, 0))).is_orthogonal also returned true (but this matrix is not
orthogonal)
So as you can see m3 version completely ignored the main diagonal and
m4 version also ignored 4-th column and 4-th row. Now it works as it
described in Wikipedia and Wolfram MathWorld.
At this moment orthogonality check is being used only one time in
blender (in draw_manipulator_rotate), and this one case seems to be a
real orthogonality check.
Also it should not be a big problem with this "1", because floatval -
intval => floatval - (float)intval in C.
- Sv. Lockal
2012/1/26 Campbell Barton <ideasman42 at gmail.com>:
> 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
More information about the Bf-committers
mailing list