единообразный отбор 3D-модели

Ищу метод / алгоритм для равномерного сэмплирования поверхности 3D-моделей на C ++. Я нашел методы для однородной выборки единичной сферы, такие как это и this, но мне нужно что-то, что также работало бы для более сложные 3D-модели, которые также могут быть вогнутыми. заранее спасибо


person theosem    schedule 16.03.2011    source источник


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