Skip to content

Commit 1c6b316

Browse files
authored
Fix bugs in ray hfield impl (#967)
1 parent f0baf70 commit 1c6b316

File tree

1 file changed

+27
-11
lines changed

1 file changed

+27
-11
lines changed

mujoco_warp/_src/ray.py

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,7 @@ def _ray_hfield(
479479
# compute size and pos of base box
480480
base_scale = size[3] * 0.5
481481
base_size = wp.vec3(size[0], size[1], base_scale)
482-
base_pos = pos + mat_col * base_scale
482+
base_pos = pos - mat_col * base_scale
483483

484484
# compute size and pos of top box
485485
top_scale = size[2] * 0.5
@@ -492,7 +492,7 @@ def _ray_hfield(
492492
# check top box: done if no intersection
493493
top_intersect, all, normal_top = _ray_box(top_pos, mat, top_size, pnt, vec)
494494

495-
if top_intersect >= 0:
495+
if top_intersect < 0.0:
496496
return x, normal_base
497497

498498
# map to local frame
@@ -510,8 +510,8 @@ def _ray_hfield(
510510
b1 = b0 + lvec * -safe_div(wp.dot(lvec, b0), wp.dot(lvec, lvec))
511511
b1 = wp.normalize(b1)
512512

513-
b2 = wp.cross(b1, lvec)
514-
b2 = wp.normalize(b2)
513+
b0 = wp.cross(b1, lvec)
514+
b0 = wp.normalize(b0)
515515

516516
# find ray segment intersecting top box
517517
seg = wp.vec2(0.0, top_intersect)
@@ -523,8 +523,14 @@ def _ray_hfield(
523523
# project segment endpoints in horizontal plane, discretize
524524
dx = safe_div(2.0 * size[0], float(ncol - 1))
525525
dy = safe_div(2.0 * size[1], float(nrow - 1))
526-
SX = wp.vec2(safe_div(lpnt[0] * seg[0] * lvec[0] + size[0], dx), safe_div(lpnt[0] * seg[1] * lvec[0] + size[0], dx))
527-
SY = wp.vec2(safe_div(lpnt[1] + seg[0] * lvec[1] + size[1], dy), safe_div(lpnt[1] + seg[1] * lvec[1] + size[1], dy))
526+
SX = wp.vec2(
527+
safe_div(lpnt[0] + seg[0] * lvec[0] + size[0], dx),
528+
safe_div(lpnt[0] + seg[1] * lvec[0] + size[0], dx),
529+
)
530+
SY = wp.vec2(
531+
safe_div(lpnt[1] + seg[0] * lvec[1] + size[1], dy),
532+
safe_div(lpnt[1] + seg[1] * lvec[1] + size[1], dy),
533+
)
528534

529535
# compute ranges, with +1 padding
530536
cmin = wp.max(0, int(wp.floor(wp.min(SX[0], SX[1])) - 1.0))
@@ -540,12 +546,22 @@ def _ray_hfield(
540546
for r in range(rmin, rmax):
541547
for c in range(cmin, cmax):
542548
# first triangle
543-
v0 = wp.vec3(dx * float(c) - size[0], dy * float(r) - size[1], hfield_data[adr + r * ncol + c] * size[2])
549+
v0 = wp.vec3(
550+
dx * float(c) - size[0],
551+
dy * float(r) - size[1],
552+
hfield_data[adr + r * ncol + c] * size[2],
553+
)
544554
v1 = wp.vec3(
545-
dx * float(c + 1) - size[0], dy * float(r + 1) - size[1], hfield_data[adr + (r + 1) * ncol + (c + 1)] * size[2]
555+
dx * float(c + 1) - size[0],
556+
dy * float(r) - size[1],
557+
hfield_data[adr + r * ncol + (c + 1)] * size[2],
558+
)
559+
v2 = wp.vec3(
560+
dx * float(c + 1) - size[0],
561+
dy * float(r + 1) - size[1],
562+
hfield_data[adr + (r + 1) * ncol + (c + 1)] * size[2],
546563
)
547-
v2 = wp.vec3(dx * float(c + 1) - size[0], dy * float(r) - size[1], hfield_data[adr + r * ncol + (c + 1)] * size[2])
548-
sol, normal_tri = _ray_triangle(v0, v1, v2, pnt, vec, b0, b1)
564+
sol, normal_tri = _ray_triangle(v0, v1, v2, lpnt, lvec, b0, b1)
549565
if sol >= 0.0 and (x < 0.0 or sol < x):
550566
x = sol
551567
normal_local = normal_tri
@@ -556,7 +572,7 @@ def _ray_hfield(
556572
dx * float(c + 1) - size[0], dy * float(r + 1) - size[1], hfield_data[adr + (r + 1) * ncol + (c + 1)] * size[2]
557573
)
558574
v2 = wp.vec3(dx * float(c) - size[0], dy * float(r + 1) - size[1], hfield_data[adr + (r + 1) * ncol + c] * size[2])
559-
sol, normal_tri = _ray_triangle(v0, v1, v2, pnt, vec, b0, b1)
575+
sol, normal_tri = _ray_triangle(v0, v1, v2, lpnt, lvec, b0, b1)
560576
if sol >= 0.0 and (x < 0.0 or sol < x):
561577
x = sol
562578
normal_local = normal_tri

0 commit comments

Comments
 (0)