沿射线对轴对齐的网格边界框进行排序,其中保证每个 AABB 与射线相交

Sort axis aligned bounding boxes of meshes along a ray where each AABB is guaranteed to intersect the ray

如何保证每个 AABB 都与射线相交,我如何沿着射线对轴对齐的边界框进行排序?

我尝试对质心进行排序,但效果不佳。那么还有其他选择吗?

您应该按从 ray_startray_direction 方向的垂直距离排序。这可以使用简单的 dot 乘积来计算。

  1. 如果AABB不相交可以按

    排序
    dot(BBOX_center-ray_start,ray_direction)
    
  2. 如果AABB相交

    那么你可以使用 BBOX 的所有点而不是中心点,并选择点结果最小的点进行排序所以排序方式:

    min(
       dot(BBOX_p0-ray_start,ray_direction),
       dot(BBOX_p1-ray_start,ray_direction),
       dot(BBOX_p2-ray_start,ray_direction),
       dot(BBOX_p3-ray_start,ray_direction),
       dot(BBOX_p4-ray_start,ray_direction),
       dot(BBOX_p5-ray_start,ray_direction),
       dot(BBOX_p6-ray_start,ray_direction),
       dot(BBOX_p7-ray_start,ray_direction),
       )
    

    但是将AABB BBOX按顺序排列并不意味着物体会以相同的顺序被击中!此外,如果您想要最后一次命中,则按第一个“命中”排序,然后按 max 排序 ...

    您可以保留两个 (min,max) 顺序并使用 O(n^2) 测试两种顺序之间的重叠差异,因为大多数顺序应该相同只是相交的 BBOX 可能具有不同的局部order 其中 n 是局部相交的 BBOX 的数量,这可能比 BBOX 的总数小得多 ...