我有一个3D AABB,它是由每分钟两组点定义的。
我想定义组成AABB的6架飞机,这样AABB内的任何一点都将有一个正的符号距离。
我的平面定义是由一个法线(x,y,z)和一个常数D组成,它对应于Ax + By +Cz +D= 0形式的平面方程。
struct myplane {
double nx,ny,nz;
double D;
};注: nx、ny和nz是标准化的。
The AABB struct is as follows:
struct myAABB {
point3d min;
point3d max;
};我目前正在定义AABB边的实例如下:
myplane p0 = myplane{-1.0f, 0.0f, 0.0f,aabb.max.x);
myplane p1 = myplane{ 0.0f,-1.0f, 0.0f,aabb.max.y);
myplane p2 = myplane{ 0.0f, 0.0f,-1.0f,aabb.max.z);
myplane p3 = myplane{+1.0f, 0.0f, 0.0f,aabb.min.x);
myplane p4 = myplane{ 0.0f,+1.0f, 0.0f,aabb.min.y);
myplane p5 = myplane{ 0.0f, 0.0f,+1.0f,aabb.min.z);在这种情况下,aabb是:min(-1,-1,-1) max(1,1)
问题是,AABB中的点返回p0、p1和p2飞机的正距离,而对于p3、p4和p5飞机则不是这样,因为它们返回的负距离似乎表明这些点在另一边。
例如,原点(0,0,0)应为每个平面返回1的正距离,而对于平面p3、p4和p5则不返回。
正在使用的符号距离计算是:
double distance(myplane& p, const point3d& v)
{
// p.normal dot v + D
return (p.nx * v.x) + (p.ny * v.y) + (p.nz * v.z) + p.D;
}我认为我的方程式在某种程度上是错误的,但我似乎无法弄清楚。
发布于 2017-10-08 09:32:26
根据“数学手册”(Korn,Korn)第2.3章,点到平面的符号距离是
Delta = (Normal. dot. v + D) / (-Sign(D) * NormalLength)但你不考虑D符号。只需修改功能:
dt = (p.nx * v.x) + (p.ny * v.y) + (p.nz * v.z) + p.D;
return (p.D < 0) ? dt: -dt;发布于 2017-10-08 12:31:00
Xm < X < XM等于
1.X + 0.Y + 0.Z - Xm > 0 and - 1.X + 0.Y + 0.Z + XM > 0https://stackoverflow.com/questions/46628807
复制相似问题