从点到有限平面的距离

时间:2017-01-24 16:45:48

标签: math coordinates

我试图找到有限平面上的最近点,即由3d空间中的3个点定义,边缘垂直且彼此平行。第四点(p)是我试图计算距离的地方。

目前,我正在将这一观点投射到“无限”的上面。由3个点的法线定义的平面,并测试投影点是否在有限平面的范围内。如果不是,我计算每个上的最近点并选择最小值。如果它在平面的范围内,我只使用由方程确定的距离来平面。

目前我的计算结果是测试投影点在飞机的范围内。

为了测试其他地方正在进行的正确计算,我还测试了飞机每个边缘的最近点到所讨论的点。我有一个使用无限的'变量,我用来测试无限平面'和距离已经恰当地计算出来(看起来也很好)。

目前正在使用blinkscript编写,其位置数据已渲染为图像以供测试。

我附上了一张图片,显示了飞机边界应该是的线条。阴影区域是当前计算的平面边界。

是否有更好/更准确或更合适的方式(在这些条件下)来测试到有限平面的距离,因为我无法弄清楚我对这些方程做错了什么。

/*
 a, b, c:  points on a plane
 p: point to calculate distance from plane
*/
  float distanceFromPlane(float3 a, float3 b, float3 c,  float3 p)  {

    float3 ba = b - a;
    float3 ca = c - a;

    // distance from infinite plane
    float3 N = cross(ba, ca);
    float3 n = normalize(N);
    float3 v = a - p;

    float dist = fabs(dot(v, n));

    // if bounded plane
    if (!useInfinite) {
      // closest coplanar point to plane
      float3 pl_cp = p - (dist * n);

      float3 pa = a - pl_cp;

      float l = dot(a, ba);
      float m = dot(pa, ba);
      float o = dot(b, ba);

      float q = dot(a, ca);
      float r = dot(pa, ca);
      float s = dot(c, ca);


      //test if coplanar point is in bounds
      if (!(
          (l <= m && m <= o) && (q <= r && r <= s)
         ))  {

          /* draw lines to test shaded area is in bounds */

          // distance to closest edge
          float3 d = c + b - a; // 4th corner of rect

          // closest point on each edge
          float labp = length(p - closestPoint(a, b, p));
          float lacp = length(p - closestPoint(a, c, p));
          float lbdp = length(p - closestPoint(b, d, p));
          float lcdp = length(p - closestPoint(c, d, p));

          // find minimum closest edge point
          dist = min(labp, lacp);
          dist = min(dist, lbdp);
          dist = min(dist, lcdp);
      }
    }
  dist -= expand;
  if (dist < 0.001f) dist = 0.001f;

  return dist;
}

render showing distance calculations and incorrect summation of bounded planes - the drawn box of lines is the correct location

1 个答案:

答案 0 :(得分:0)

这些标量产品:l = dot(a, ba), o, q, s是什么意思?

据我了解,abc是具有直角a的三角形,您想确定pl_cp是否位于矩形abcd内。

pl_cp的计算是正确的。然后,您可以将pa向量表示为基础向量baca

的线性组合

修改
我使用pa = pl_cp - a使其与baca

保持一致
pa = u * ba + v * ca

u = dot(pa, ba) / dot(ba, ba)
v = dot(pa, ca) / dot(ca, ca)

如果uv值位于0..1范围内,则点pl_cp位于矩形内。

如果您确实需要最近的边缘,可能会使用uv值(比较距离,乘以ba, ca个长度)