三维模型的均匀采样

时间:2011-03-16 10:01:15

标签: c++ 3d computational-geometry

我寻求一种方法/算法,用于在C ++中对3D模型的表面进行均匀采样。 我找到了单位球体均匀采样的方法,如 thisthis但我需要的东西也适用于更复杂的3D模型,也可能是凹形的。 提前谢谢

1 个答案:

答案 0 :(得分:2)

我的所作所为:我的模型由许多不同的基元组成(三角形,四边形,圆盘,圆柱......)。对于每个原语,我可以实现随机选择方法(例如http://mathworld.wolfram.com/TrianglePointPicking.html)。每个原始人都可以计算其表面积。原语的面积越大,生成随机点的概率越高。在我的模型中,我构建了一个像这样的累积列表

class Model{
  // ...
  vector<pair<double, Primitive*> > primitives_;
}

void Model::AddPrimitive(Primitive* p)
{
  double area = p->Area();
  if (!primitves_.empty())
    area += primitives_.back().first;
  primitives_.push_back(make_pair(area, p));
}

当我在模型上生成随机点时,我首先选择一个随机基元,然后在该基元上选择一个随机点。

Point Model::RandomPoint()
{
  double maxArea = primitives_.back().first;
  double rnd = maxArea * Uniform01();  // random in [0; maxArea] 
  Iterator it = std::lower_bound(
        primitives_.begin(), primitives_.end(), rnd, FirstLess()); 
  return it->second->RandomPoint();    
}