我试图找到有限平面上的最近点,即由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;
}
答案 0 :(得分:0)
这些标量产品:l = dot(a, ba), o, q, s
是什么意思?
据我了解,abc
是具有直角a
的三角形,您想确定pl_cp
是否位于矩形abcd
内。
pl_cp
的计算是正确的。然后,您可以将pa
向量表示为基础向量ba
和ca
修改强>
我使用pa = pl_cp - a
使其与ba
和ca
pa = u * ba + v * ca
u = dot(pa, ba) / dot(ba, ba)
v = dot(pa, ca) / dot(ca, ca)
如果u
和v
值位于0..1
范围内,则点pl_cp
位于矩形内。
如果您确实需要最近的边缘,可能会使用u
和v
值(比较距离,乘以ba, ca
个长度)