我有一些3D平面信息。当所有平面连接在一起时,它将形成3D凸包。
这里是输入示例。
每个3D平面均由该平面上的一个点及其法线表示。
所有法线指向内部:-
- (-1,0,0) with normal = (1,0,0)
- ( 1,0,0) with normal = (-1,0,0)
- (0,-1,0) with normal = (0,1,0)
- (0,1,0) with normal = (0,-1,0)
- (0,0,-1) with normal = (0,0,1)
- (0,0,1) with normal = (0,0,-1)
- (0.142,-7.18,10.12) with normal = (0.001,0.31,-0.95)
- note: some planars can be redundant (contribute nothing) e.g. the last one
问题:如何从中计算AABB?
上例中的解决方案是((-1,-1,-1),(1,1,1))
。
(起初,我要重心,但我意识到that is a Hard problem。
AABB对我来说应该足够好。 )
我的较差解决方案是使用Constructive solid geometry查找所有船体顶点,然后对其进行MIN&MAX,但性能太差了。
实际上,我想在两个凸包重叠时找到3D包的中心点。
此信息对于物理引擎中更准确的碰撞响应很有用。
答案 0 :(得分:1)
这是线性规划的经典问题。给定一组线性不等式(在您的情况下以平面表示,例如ax + by + cz + d> = 0)和一个线性函数(例如f(x,y ,z)= x),找到一个在满足所有不等式的同时最小化函数的点AABB是针对函数x,-x,y,-y,z和-z的6个此类问题的解决方案。 >
有多种方法可以解决此问题,其中最著名的是单纯形算法,还有许多现成的库(包括一些利用GPU的库)。