我有一个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;
}
我认为我的方程在某种程度上是错误的,但我似乎无法弄明白。
答案 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