@@ -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