[英]Computing the side planes of a 3D AABB
我有一個由兩組點(最小/最大)定義的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;
}
我認為我的方程式在某種程度上是錯誤的,但我似乎無法弄清楚。
根據《數學手冊》(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;
Xm < X < XM
相當於
1.X + 0.Y + 0.Z - Xm > 0 and - 1.X + 0.Y + 0.Z + XM > 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.