光线和绑定框之间的距离

问题描述 投票:2回答:1

我已经研究了很多,并找到了以下代码:

  • 从一个点到一个Bound Box的距离
  • 两个绑定框之间的距离
  • 在一个绑定框中的光线的交叉点

但我正在寻找的是:

  • 光线到绑定框的距离

考虑带轴对齐的绑定框(AABB)。有谁知道我在哪里可以找到关于这个主题的信息?

提前致谢。

distance box closest
1个回答
2
投票

我花了好几个小时,但我终于明白了。这个想法是你弄清楚边界框上哪个点最接近光线,然后计算从该点到光线的距离。它还可以计算光线(t)上的重心坐标,但如果它与边界框相交,它将在其内部的某个任意点。

float rayAABBdist ( vec2 p, vec2 v, float tt, float ll, float bb, float rr )
{
float tx1 = ( ll - p.x ) / v.x;
float tx2 = ( rr - p.x ) / v.x;
float ty1 = ( tt - p.y ) / v.y;
float ty2 = ( bb - p.y ) / v.y;
float p1 = max ( 0.0, max ( min ( tx1, tx2 ), min ( ty1, ty2 ) ) );
float p2 = max ( 0.0, min ( max ( tx1, tx2 ), max ( ty1, ty2 ) ) );
float x = max ( min ( ( p.x + v.x * p1 + p.x + v.x * p2 ) / 2, rr ), ll );
float y = max ( min ( ( p.y + v.y * p1 + p.y + v.y * p2 ) / 2, bb ), tt );
float t = max ( 0.0, ( ( x - p.x ) * v.x + ( y - p.y ) * v.y ) / ( v.x * v.x + v.y * v.y ) );
x = p.x + v.x * t - x;
y = p.y + v.y * t - y;
return x * x + y * y;
}

处理线段的变体是相同的,除了它还将系数钳位到顶部的1.0。它不是最优化的解决方案,但它确实有效。它非常昂贵,因此根据您的应用程序,您可能只使用普通的光线投影。我尝试了一些不同的方法,但它们都在边缘情况下都失败了。

两年看起来很晚但如果有人会在网上搜索这个问题,他们会找到这个解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.