光线与cube(AABB)相交-python
原理
假设cube方向与坐标轴方向平行。
首先计算光线与各个轴的交点的k
取每个轴中k最大和最小的k。
再在最大的三个轴k中取最小的k 为 far,在最小的三个轴k中取最大k为near
如果 far > near。则相交。
def intersect_cube_gpu(bounds, ray_o, ray_d):
"""bounds[2,3],ray_o[N,3],ray_d[N,3]"""
"""calculate intersections with 3d bounding box"""
#norm_d = np.linalg.norm(ray_d, axis=-1, keepdims=True)
norm_d = torch.norm(ray_d, dim=-1, keepdim=True)
tmin = (bounds[:1] - ray_o) / ray_d # N,3
tmax = (bounds[1:2] - ray_o) / ray_d # N,3
t1 = torch.minimum(tmin, tmax) # N,3 #求两个纬度相同的tensor在对应位置的最值
t2 = torch.maximum(tmin, tmax) # N,3
near = torch.max(t1, axis=-1)[0]
far = torch.min(t2, axis=-1)[0]
mask_at_box = torch.gt(far, near)
near[mask_at_box] = near[mask_at_box] / norm_d[mask_at_box, 0]
far[mask_at_box] = far[mask_at_box] / norm_d[mask_at_box, 0]
near[~mask_at_box] = 0
far[~mask_at_box] = 0
https://gist.github.com/DomNomNom/46bb1ce47f68d255fd5d
https://github.com/zju3dv/neuralbody/blob/master/lib/utils/if_nerf/if_nerf_data_utils.py
2638

被折叠的 条评论
为什么被折叠?



