计算3D AABB的侧平面

时间:2017-10-08 08:00:09

标签: c++ math 3d geometry

我有一个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,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;
}

我认为我的方程在某种程度上是错误的,但我似乎无法弄明白。

2 个答案:

答案 0 :(得分:0)

根据“数学手册”(Korn,Korn)第2.3章,从点到平面的符号距离是

#define N sizeof(T)
char buf[N];
T obj; //obj initialized to its original value
std::memcpy(buf, &obj, N);// between these two calls to std::memcpy,obj might be modified
std::memcpy(&obj, buf, N); // at this point, each subobject of obj of scalar type holds its original value

但你不会考虑D号。只需修改功能:

 Delta = (Normal. dot. v + D) / (-Sign(D) * NormalLength)

答案 1 :(得分:0)

Xm < X < XM

相当于

1.X + 0.Y + 0.Z - Xm > 0 and - 1.X + 0.Y + 0.Z + XM > 0