2011-03-16 62 views
2

我在C++中寻找3D模型表面均匀采样的方法/算法。 我发现了单位球体均匀采样的方法,如 thisthis,但我需要的东西也适用于也可能是凹面的更复杂的3D模型。 在此先感谢3D模型的均匀采样

回答

2

我该怎么做:我的模型包含许多不同的基元(三角形,四边形,圆盘,圆柱体......)。对于每个基元,我可以实现随机选取方法(例如http://mathworld.wolfram.com/TrianglePointPicking.html)。每个primitve可以计算它的表面积。原始区域越高,生成随机点的概率就越高。在我的模型我建立的累积列表这样

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();  
} 
+0

嗨hansmaad,谢谢你的回答。这是一个有趣的方法,所以我会测试它并发表任何评论。再次感谢 – theosem 2011-03-16 13:29:34

+0

嗨tsemer,我上周写了这个解决方案。我很高兴其他人可以测试它:)结果__look__良好,表现对我来说是好的。请告诉我,如果你发现错误或更好的技术。 – hansmaad 2011-03-16 15:17:21