3D 模型的均匀采样

发布于 2024-10-22 21:20:55 字数 325 浏览 3 评论 0原文

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

I seek for a method/algorithm for uniform sampling of the surface of 3D models in C++.
I have found methods for uniform sampling of unit sphere such as
this and this but I need something that would work also for more complex 3D models that may also be concave.
thanks in advance

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

风吹过旳痕迹 2024-10-29 21:20:55

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

What I do: My model consists of many different primitives (triangles, quads, disks, cylinder...). For each primitive I can implement a random picking method (e.g. http://mathworld.wolfram.com/TrianglePointPicking.html). Each primitve can compute its surface Area. The higher the area of the primitive the higher its probability to generate a random point. In my model I build a cumulative list like this

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));
}

When I generate a random point on the model I first choose a random primitive and then a random point on this primitive.

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();    
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文