Cyl vs Capsule can cause arithmetic exceptions.

Issue #72 invalid
Bram Stolk created an issue

I run with FP exceptions enabled, which catches an issue with cyl versus capsule, using libccd.

Stacktrace:

#0 0x00000000004c9f27 in ccdVec3PointTriDist2 (P=0x270e7924 <__ccd_vec3_origin>, x0=0x7fffffffd4ac, B=0x7fffffffd4d0, C=0x7fffffffd4f4, witness=0x7fffffffd660) at vec3.c:171
#1 0x00000000004cb638 in findPenetr (obj1=0x7fffffffd6e0, obj2=0x7fffffffd740, ccd=0x7fffffffd620, portal=0x7fffffffd488, depth=0x7fffffffd61c, pdir=0x7fffffffd660, pos=0x7fffffffd66c) at mpr.c:350
#2 ccdMPRPenetration (obj1=obj1@entry=0x7fffffffd6e0, obj2=obj2@entry=0x7fffffffd740, ccd=ccd@entry=0x7fffffffd620, depth=depth@entry=0x7fffffffd61c, dir=dir@entry=0x7fffffffd660, pos=pos@entry=0x7fffffffd66c) at mpr.c:152
#3 0x000000000049a24d in ccdCollide (o1=o1@entry=0x7fff7f6efe80, o2=o2@entry=0x3e75d7f0, flags=flags@entry=100, contact=contact@entry=0x3f28190 <contacts+64>, obj1=obj1@entry=0x7fffffffd6e0,
supp1=supp1@entry=0x498cb0 <ccdSupportCap(void const*, ccd_vec3_t const*, ccd_vec3_t*)>, obj2=0x7fffffffd740, supp2=0x498fb0 <ccdSupportCyl(void const*, ccd_vec3_t const*, ccd_vec3_t*)>, skip=<optimized out>,
cen2=0x498ef0 <ccdCenter(void const*, ccd_vec3_t*)>, cen1=0x498ef0 <ccdCenter(void const*, ccd_vec3_t*)>) at collision_libccd.cpp:339
#4 0x000000000049a663 in ccdCollide (skip=<optimized out>, cen2=0x498ef0 <ccdCenter(void const*, ccd_vec3_t*)>, supp2=0x498fb0 <ccdSupportCyl(void const*, ccd_vec3_t const*, ccd_vec3_t*)>, obj2=0x7fffffffd740,
cen1=0x498ef0 <ccdCenter(void const*, ccd_vec3_t*)>, supp1=0x498cb0 <ccdSupportCap(void const*, ccd_vec3_t const*, ccd_vec3_t*)>, obj1=0x7fffffffd6e0, contact=0x3f28190 <contacts+64>, flags=100, o2=0x3e75d7f0,
o1=0x7fff7f6efe80) at collision_libccd.cpp:319
#5 dCollideCapsuleCylinder (o1=0x7fff7f6efe80, o2=0x3e75d7f0, flags=100, contact=0x3f28190 <contacts+64>, skip=<optimized out>) at collision_libccd.cpp:388
#6 0x000000000046736d in dCollide (o1=0x3e75d7f0, o2=0x7fff7f6efe80, flags=<optimized out>, contact=0x3f28190 <contacts+64>, skip=144) at collision_kernel.cpp:319
#7 0x0000000000416da0 in nearCallback (data=<optimized out>, o0=0x3e75d7f0, o1=0x7fff7f6efe80) at src/wld.cpp:529
#8 0x000000000046ae45 in collideAABBs (callback=0x416b80 <nearCallback(void*, dxGeom*, dxGeom*)>, data=0x0, g2=0x7fff7f6efe80, g1=0x3e75d7f0) at collision_space_internal.h:77
#9 dxSimpleSpace::collide2 (this=0x3e75ac90, data=0x0, geom=0x7fff7f6efe80, callback=0x416b80 <nearCallback(void*, dxGeom*, dxGeom*)>) at collision_space.cpp:280
#10 0x000000000046c042 in dSpaceCollide2 (g1=0x3e75ac90, g2=0x7fff7f6efe80, data=0x0, callback=0x416b80 <nearCallback(void*, dxGeom*, dxGeom*)>) at collision_space.cpp:847
#11 0x000000000046ac75 in collideAABBs (callback=0x416b80 <nearCallback(void*, dxGeom*, dxGeom*)>, data=0x0, g2=0x7fff7f6efe80, g1=<optimized out>) at collision_space_internal.h:77
#12 dxSimpleSpace::collide (this=0x273e2850, data=0x0, callback=0x416b80 <nearCallback(void*, dxGeom*, dxGeom*)>) at collision_space.cpp:258
#13 0x0000000000416a3d in wld_update (dt=0.00833333377, camlock=<optimized out>, newframe=false) at src/wld.cpp:604
#14 0x00000000004119da in ctrl_update (dt=0.00833333377, newframe=false) at src/ctrl.cpp:1000
#15 0x0000000000408d85 in draw_frame (elapsed=0.0170000009) at src/sdlmain.cpp:45
#16 main (argc=<optimized out>, argv=<optimized out>) at src/sdlmain.cpp:578

Examining the data, shows that penetration dir has an invalid value, where the x-component is far too large.

In ccdMPRPenetration() I see the values:

(gdb) print *depth
$32 = 4.59163468e-41
(gdb) print *dir
$33 = {v = {3.17677703e+38, 4.59163468e-41, 0.240081549}}
(gdb) print *pos
$34 = {v = {0, 0.240081549, 0}}
(gdb)

When this happened, cyl and capsule hit each other’s sides, (not at caps) and were roughly, but not quite parallel.

Comments (1)

  1. Log in to comment