簡體   English   中英

計算3D AABB的側面

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM