mj_multiRay: Reset elevation angle if crossing the coordinate singularity.

PiperOrigin-RevId: 529341397
Change-Id: I0ca6ed5b97bcc585b0f426d6fb8a6b4cf9367a2b
This commit is contained in:
Alessio Quaglino
2023-05-04 01:49:41 -07:00
committed by Copybara-Service
parent 3d82d2a40f
commit 7e49d935ba
2 changed files with 9 additions and 3 deletions
+7 -1
View File
@@ -56,7 +56,11 @@ static mjtNum longitude(const mjtNum vec[3]) {
// map to elevation angle in spherical coordinates
static mjtNum latitude(const mjtNum vec[3]) {
return mju_atan2(mju_sqrt(vec[0]*vec[0] + vec[1]*vec[1]), vec[2]);
if (vec[2]>0) {
return mju_atan2(mju_sqrt(vec[0]*vec[0] + vec[1]*vec[1]), vec[2]);
} else {
return mju_atan2(mju_sqrt(vec[0]*vec[0] + vec[1]*vec[1]), vec[2]) - mjPI;
}
}
@@ -919,7 +923,9 @@ void mju_multiRayPrepare(const mjModel* m, const mjData* d, const mjtNum pnt[3],
if (AABB[2]-AABB[0] > mjPI) {
AABB[0] = -mjPI;
AABB[1] = -mjPI/2;
AABB[2] = mjPI;
AABB[3] = mjPI/2;
}
if (AABB[3]-AABB[1] > mjPI) { // SHOULD NOT OCCUR
+2 -2
View File
@@ -234,9 +234,9 @@ TEST_F(RayTest, EdgeCases) {
m->geom_aabb[3] = m->geom_aabb[4] = m->geom_aabb[5] = 0;
mju_multiRayPrepare(m, d, pnt4, NULL, NULL, 1, -1, geom_ba, NULL);
EXPECT_FLOAT_EQ(geom_ba[0], 0);
EXPECT_FLOAT_EQ(geom_ba[1], mjPI/2);
EXPECT_FLOAT_EQ(geom_ba[1], -mjPI/2);
EXPECT_FLOAT_EQ(geom_ba[2], 0);
EXPECT_FLOAT_EQ(geom_ba[3], mjPI/2);
EXPECT_FLOAT_EQ(geom_ba[3], -mjPI/2);
mjtNum vec4[] = {1, 0, 0};
mj_multiRay(m, d, pnt4, vec4, NULL, 1, -1, &rgeomid, &dist, 1);
EXPECT_FLOAT_EQ(dist, 0.9);