【问题标题】:uniform sampling of a 3D model3D 模型的统一采样
【发布时间】:2011-03-16 10:01:15
【问题描述】:

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

【问题讨论】:

    标签: c++ 3d computational-geometry


    【解决方案1】:

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

    【讨论】:

    • 嗨,hansmaad,感谢您的回答。这是一种有趣的方法,因此我将对其进行测试并发布任何 cmets。再次感谢
    • 嗨,tsemer,我上周写了这个解决方案。我很高兴其他人可以对其进行测试:) 结果看起来很好,性能对我来说还可以。如果您发现错误或更好的技术,请告诉我。
    猜你喜欢
    • 2013-06-15
    • 2012-11-14
    • 1970-01-01
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    相关资源
    最近更新 更多