首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >三维AABB边面的计算

三维AABB边面的计算
EN

Stack Overflow用户
提问于 2017-10-08 08:00:08
回答 2查看 210关注 0票数 0

我有一个3D AABB,它是由每分钟两组点定义的。

我想定义组成AABB的6架飞机,这样AABB内的任何一点都将有一个正的符号距离。

我的平面定义是由一个法线(x,y,z)和一个常数D组成,它对应于Ax + By +Cz +D= 0形式的平面方程。

代码语言:javascript
复制
struct myplane {
   double nx,ny,nz;
   double D;
};

注: nx、ny和nz是标准化的。

代码语言:javascript
复制
The AABB struct is as follows:

struct myAABB {
   point3d min;
   point3d max;
};

我目前正在定义AABB边的实例如下:

代码语言:javascript
复制
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则不返回。

正在使用的符号距离计算是:

代码语言:javascript
复制
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;
}

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-08 09:32:26

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

代码语言:javascript
复制
 Delta = (Normal. dot. v + D) / (-Sign(D) * NormalLength)

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

代码语言:javascript
复制
   dt =  (p.nx * v.x) + (p.ny * v.y)  + (p.nz * v.z)  + p.D;
   return (p.D < 0) ? dt: -dt;
票数 0
EN

Stack Overflow用户

发布于 2017-10-08 12:31:00

代码语言:javascript
复制
Xm < X < XM

等于

代码语言:javascript
复制
1.X + 0.Y + 0.Z - Xm > 0 and - 1.X + 0.Y + 0.Z + XM > 0
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46628807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档