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

最佳答案

我的工作:我的模型由许多不同的图元组成(三角形,四边形,磁盘,圆柱体...)。对于每个原语,我可以实现随机选择方法(例如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();
}

09-10 04:06
查看更多