Ищу метод / алгоритм для равномерного сэмплирования поверхности 3D-моделей на C ++. Я нашел методы для однородной выборки единичной сферы, такие как это и this, но мне нужно что-то, что также работало бы для более сложные 3D-модели, которые также могут быть вогнутыми. заранее спасибо
единообразный отбор 3D-модели
Ответы (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();
}
person
hansmaad
schedule
16.03.2011
привет, хансмаад, спасибо за ответ. это интересный подход, поэтому я протестирую его и опубликую любые комментарии. еще раз спасибо
- person theosem; 16.03.2011
Привет, цемер, это решение я написал на прошлой неделе. Я счастлив, что кто-то другой может это проверить :) Результаты выглядят хорошо, а производительность мне подходит. Пожалуйста, скажите мне, если вы нашли ошибки или лучшие методы.
- person hansmaad; 16.03.2011