@@ -1466,15 +1466,20 @@ void mju_multiRayPrepare(const mjModel* m, const mjData* d, const mjtNum pnt[3],
14661466 AABB [3 ] = mju_max (AABB [3 ], elevation );
14671467 }
14681468
1469+ // azimuth crosses discontinuity, fall back to no angular culling
14691470 if (AABB [2 ]- AABB [0 ] > mjPI ) {
14701471 AABB [0 ] = - mjPI ;
14711472 AABB [1 ] = 0 ;
14721473 AABB [2 ] = mjPI ;
14731474 AABB [3 ] = mjPI ;
14741475 }
14751476
1476- if (AABB [3 ]- AABB [1 ] > mjPI ) { // SHOULD NOT OCCUR
1477- mjERROR ("discontinuity in azimuth angle" );
1477+ // elevation overflow, fall back to no angular culling
1478+ if (AABB [3 ]- AABB [1 ] > mjPI ) {
1479+ AABB [0 ] = - mjPI ;
1480+ AABB [1 ] = 0 ;
1481+ AABB [2 ] = mjPI ;
1482+ AABB [3 ] = mjPI ;
14781483 }
14791484
14801485 mju_copy (geom_ba + 4 * g , AABB , 4 );
@@ -1488,11 +1493,6 @@ static mjtNum mju_singleRay(const mjModel* m, mjData* d, const mjtNum pnt[3], co
14881493 int * ray_eliminate , mjtNum * geom_ba , int geomid [1 ]) {
14891494 mjtNum dist , newdist ;
14901495
1491- // check vector length
1492- if (mju_norm3 (vec ) < mjMINVAL ) {
1493- mjERROR ("vector length is too small" );
1494- }
1495-
14961496 // clear result
14971497 dist = -1 ;
14981498 * geomid = -1 ;
@@ -1558,7 +1558,7 @@ static mjtNum mju_singleRay(const mjModel* m, mjData* d, const mjtNum pnt[3], co
15581558
15591559
15601560// performs multiple ray intersections with the precomputed bv and flags
1561- void mj_multiRay (const mjModel * m , mjData * d , const mjtNum pnt [3 ], const mjtNum vec [ 3 ] ,
1561+ void mj_multiRay (const mjModel * m , mjData * d , const mjtNum pnt [3 ], const mjtNum * vec ,
15621562 const mjtByte * geomgroup , mjtByte flg_static , int bodyexclude ,
15631563 int * geomid , mjtNum * dist , int nray , mjtNum cutoff ) {
15641564 mj_markStack (d );
@@ -1573,7 +1573,11 @@ void mj_multiRay(const mjModel* m, mjData* d, const mjtNum pnt[3], const mjtNum
15731573
15741574 // loop over rays
15751575 for (int i = 0 ; i < nray ; i ++ ) {
1576- dist [i ] = mju_singleRay (m , d , pnt , vec + 3 * i , geom_eliminate , geom_ba , geomid + i );
1576+ if (mju_dot3 (vec + 3 * i , vec + 3 * i ) < mjMINVAL ) {
1577+ dist [i ] = -1 ;
1578+ } else {
1579+ dist [i ] = mju_singleRay (m , d , pnt , vec + 3 * i , geom_eliminate , geom_ba , geomid + i );
1580+ }
15771581 }
15781582
15791583 mj_freeStack (d );
0 commit comments