【问题标题】:distance from point to finite plane点到有限平面的距离
【发布时间】:2017-01-24 16:45:48
【问题描述】:

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

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

目前我的计算已关闭,以测试投影点是否在平面范围内。

为了测试是否在其他地方进行了正确的计算,我还在测试平面的每个边缘到相关点的最近点。我有一个“useInfinite”变量,我用它来测试“无限平面”和距离是否已正确计算(看起来也很好)。

目前正在用 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

【问题讨论】:

    标签: math coordinates


    【解决方案1】:

    这些标量积: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 长度)

    【讨论】:

    • 谢谢你,我今天早上试试这个。我从几个地方获得了您提到的公式 - 这是一个例子。 math.stackexchange.com/questions/1472049/…
    • 澄清一下——就像你上面的例子一样,pa 依赖于 u 和 v,而 u 和 v 依赖于 pa .. 你的意思是 u = dot(pl_cp, ba) / dot(ba,巴); v = 点(pl_cp,ca)/点(ca,ca); pa = u * ba + v * ca;
    • 哎呀,我的意思是 u = dot(pl_cp - a, ba) / dot(ba, ba); v = dot(pl_cp - a, ca) / dot(ca, ca); pa = u * ba + v * ca;
    • 调整我上面写的原始代码产生的结果与原始帖子中的代码相同。
    • 如果有帮助的话,我在上图中使用的 3 个点是 A(50, -101, -655), B(116, -101 -593) 和 C(-100 , -101, -303),所有纯白色区域都应该在距离
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-12
    相关资源
    最近更新 更多