沿射线对轴对齐的网格边界框进行排序,其中保证每个 AABB 与射线相交
Sort axis aligned bounding boxes of meshes along a ray where each AABB is guaranteed to intersect the ray
如何保证每个 AABB 都与射线相交,我如何沿着射线对轴对齐的边界框进行排序?
我尝试对质心进行排序,但效果不佳。那么还有其他选择吗?
您应该按从 ray_start
到 ray_direction
方向的垂直距离排序。这可以使用简单的 dot
乘积来计算。
如果AABB不相交可以按
排序
dot(BBOX_center-ray_start,ray_direction)
如果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 的总数小得多 ...
如何保证每个 AABB 都与射线相交,我如何沿着射线对轴对齐的边界框进行排序?
我尝试对质心进行排序,但效果不佳。那么还有其他选择吗?
您应该按从 ray_start
到 ray_direction
方向的垂直距离排序。这可以使用简单的 dot
乘积来计算。
如果AABB不相交可以按
排序dot(BBOX_center-ray_start,ray_direction)
如果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 的总数小得多 ...