【发布时间】: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;
}
【问题讨论】:
标签: math coordinates