Menu

#39 Fix for sphere,ccylinder and box collisions

Needs_Feedback
closed
Bug Fix (53)
5
2012-09-14
2005-11-14
No

There's a problem where spheres and ccylinders may be
able to push through boxes, because there's a division
by a denormal number somewhere in the pipe. I submitted
a patch for this problem over a year ago, but it was
rejected because I had coded the specific floating
point constants for denormals, instead of using some
other supposedly better method (the specifics of which
were never actually submitted to the list).


cvs -z9 diff -u -wb (in directory C:\code\ode)
? msvc71
? ode/include/ode/config.h
cvs server: Diffing .
cvs server: Diffing CVSROOT
cvs server: Diffing ode
cvs server: Diffing ode/OPCODE
cvs server: Diffing ode/OPCODE/Ice
cvs server: Diffing ode/VC6
cvs server: Diffing ode/VC6/Samples
cvs server: Diffing ode/VC6/_configs
cvs server: Diffing ode/config
cvs server: Diffing ode/contrib
cvs server: Diffing ode/contrib/BreakableJoints
cvs server: Diffing ode/contrib/BreakableJoints/diff
cvs server: Diffing ode/contrib/DotNetManaged
cvs server: Diffing ode/contrib/DotNetManaged/Release
cvs server: Diffing ode/contrib/GeomTransformGroup
cvs server: Diffing ode/contrib/Mac_CFMCarbon
cvs server: Diffing ode/contrib/Mac_CFMCarbon/mac_source
cvs server: Diffing
ode/contrib/Mac_CFMCarbon/mac_source/drawstuff
cvs server: Diffing
ode/contrib/Mac_CFMCarbon/mac_source/drawstuff/src
cvs server: Diffing
ode/contrib/Mac_CFMCarbon/mac_source/include
cvs server: Diffing
ode/contrib/Mac_CFMCarbon/mac_source/include/GL
cvs server: Diffing
ode/contrib/Mac_CFMCarbon/mac_source/include/ode
cvs server: Diffing
ode/contrib/Mac_CFMCarbon/mac_source/ode
cvs server: Diffing
ode/contrib/Mac_CFMCarbon/mac_source/ode/test
cvs server: Diffing ode/contrib/TerrainAndCone
cvs server: Diffing ode/contrib/dCylinder
cvs server: Diffing ode/contrib/dRay
cvs server: Diffing ode/contrib/dRay/Include
cvs server: Diffing ode/contrib/dRay/Test
cvs server: Diffing ode/contrib/msvc7
cvs server: Diffing ode/contrib/msvc7/ode_default
cvs server: Diffing
ode/contrib/msvc7/ode_iterative_tricollide
cvs server: Diffing ode/contrib/msvc7/ode_triangle_collider
cvs server: Diffing ode/drawstuff
cvs server: Diffing ode/drawstuff/dstest
cvs server: Diffing ode/drawstuff/src
cvs server: Diffing ode/drawstuff/textures
cvs server: Diffing ode/include
cvs server: Diffing ode/include/drawstuff
cvs server: Diffing ode/include/ode
Index: ode/include/ode/memory.h
===================================================================
RCS file: /cvsroot/opende/ode/include/ode/memory.h,v
retrieving revision 1.7
diff -u -w -b -r1.7 memory.h
--- ode/include/ode/memory.h 19 Apr 2004 21:48:48 -0000 1.7
+++ ode/include/ode/memory.h 26 Apr 2004 16:24:34 -0000
@@ -52,6 +52,12 @@
void * dRealloc (void ptr, size_t oldsize, size_t
newsize);
void dFree (void
ptr, size_t size);

+/ when alloc debugging is turned on, this indicates
that the given block of
+ * alloc()ed memory should not be reported as "still
in use" when the program
+ * exits.
+
/
+void dAllocDontReport (void *ptr);
+
#ifdef __cplusplus
}
#endif
cvs server: Diffing ode/lib
cvs server: Diffing ode/ode
cvs server: Diffing ode/ode/doc
cvs server: Diffing ode/ode/doc/pix
cvs server: Diffing ode/ode/src
Index: ode/ode/src/collision_transform.cpp
===================================================================
RCS file:
/cvsroot/opende/ode/ode/src/collision_transform.cpp,v
retrieving revision 1.3
diff -u -w -b -r1.3 collision_transform.cpp
--- ode/ode/src/collision_transform.cpp 11 Jul 2003
21:35:34 -0000 1.3
+++ ode/ode/src/collision_transform.cpp 26 Apr 2004
16:24:34 -0000
@@ -102,7 +102,6 @@

// utility function for dCollideTransform() : compute
final pos and R
// for the encapsulated geom object
-
void dxGeomTransform::computeFinalTx()
{
dMULTIPLY0_331 (final_pos,R,obj->pos);
Index: ode/ode/src/collision_util.cpp
===================================================================
RCS file: /cvsroot/opende/ode/ode/src/collision_util.cpp,v
retrieving revision 1.3
diff -u -w -b -r1.3 collision_util.cpp
--- ode/ode/src/collision_util.cpp 14 Nov 2003
20:11:18 -0000 1.3
+++ ode/ode/src/collision_util.cpp 26 Apr 2004 16:24:34
-0000
@@ -294,7 +294,22 @@

// find the region and tanchor values for p1
for (i=0; i<3; i++) {
- if (v[i] > 0) {
+ // Denormals are a problem, because we divide by
v[i], and then
+ // multiply that by 0. Alas, infinity times 0 is
infinity (!)
+ // We also use v2[i], which is v[i] squared.
Here's how the epsilons
+ // are chosen:
+ // float epsilon = 1.175494e-038 (smallest
non-denormal number)
+ // double epsilon = 2.225074e-308 (smallest
non-denormal number)
+ // For single precision, choose an epsilon such
that v[i] squared is
+ // not a denormal; this is for performance.
+ // For double precision, choose an epsilon such
that v[i] is not a
+ // denormal; this is for correctness.
+#if defined( dSINGLE )
+ if (v[i] > dReal(1e-19))
+#else
+ if (v[i] > dReal(1e-307))
+#endif
+ {
if (s[i] < -h[i]) {
region[i] = -1;
tanchor[i] = (-h[i]-s[i])/v[i];
cvs server: Diffing ode/ode/test
Index: ode/ode/test/test_trimesh.cpp
===================================================================
RCS file: /cvsroot/opende/ode/ode/test/test_trimesh.cpp,v
retrieving revision 1.4
diff -u -w -b -r1.4 test_trimesh.cpp
--- ode/ode/test/test_trimesh.cpp 22 Apr 2004
20:38:51 -0000 1.4
+++ ode/ode/test/test_trimesh.cpp 26 Apr 2004 16:24:34
-0000
@@ -312,6 +312,22 @@
else if (cmd == 'r') {
random_pos ^= 1;
}
+ else if (cmd == 'u') {
+ if( selected < num && selected >= 0 ) {
+ for( int g = 0; g < 3; ++g ) {
+ if( obj[selected].geom[g] ) {
+ dGeomDestroy( obj[selected].geom[g] );
+ }
+ }
+ dBodyDestroy( obj[selected].body );
+ memcpy( &obj[selected], &obj[selected+1],
(num-selected-1)*sizeof(obj[0]) );
+ --num;
+ memset( &obj[num], 0, sizeof(obj[num]) );
+ if( selected == num ) {
+ selected = 0;
+ }
+ }
+ }
}

cvs server: Diffing ode/tools

** CVS exited normally with code 1 **

Discussion

  • Jason Perkins

    Jason Perkins - 2005-11-15

    Logged In: YES
    user_id=1683

    From: Rodrigo Hernandez
    Date: Nov 14, 2005 5:02 PM

    Use the ODE defined constant dEpsilon for epsilon,
    otherwise, you'll be
    introducing inconsistencies in the code.

     
  • Bram Stolk

    Bram Stolk - 2006-12-25

    Logged In: YES
    user_id=14028
    Originator: NO

    This has been fixed.
    See mailing list
    http://q12.org/pipermail/ode/2006-October/020618.html

     

Log in to post a comment.