2011-03-16 105 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