Строим лоскут Кунса

/ Просмотров: 249

Введение

Лоскуты Кунса известны в области геометрического моделирования с конца 60-х годов прошлого века [Coons, S. 1967. Surfaces for computer-aided design of space forms]. В 1983-м году Уильям Гордон дал общий математический аппарат для построения параметрических лоскутов, проходящих через заданную сетку кривых [Gordon, W. 1983. An Operator Calculus for Surface and Volume Modeling. IEEE Computer Graphics and Applications 3, 7, 18–22]. Метод Гордона, обобщающий метод Кунса, основан на понятии линейного оператора P, представляющего собой некоторую схему интерполяции. Комбинируя три линейных оператора, обладающих различными свойствами в смысле точности приближения, Гордон получает схему «трансфинитной интерполяции».

Контур из четырех кривых, имеющих попарные общие точки. Если пары кривых заданы на общем базисе, то на них можно построить лоскут Кунса.

Идея метода Гордона состоит в конструировании нового оператора интерполяции путем комбинирования трех операторов P1, P2 и P12. Каждый такой оператор, взятый в отдельности, обладает некоторым интерполяционным свойством относительно исходной сети кривых. Если же составить сумму операторов, то полученная схема интерполирует всю сеть полностью.

PS = P1S + P2S - P12S.

В англоязычной литературе эта комбинация называется булевой суммой ("Boolean sum"). Здесь оператор P1 интерполирует кривые S(0,v) и S(1,v); оператор P2 интерполирует противоположные кривые S(u,0) и S(u,1); оператор P12 интерполирует только угловые точки. Таким образом, поверхности P1S и P2S являются линейчатыми, а поверхность P12S есть «косая плоскость», вычитание которой компенсирует невязки интерполянтов P1S и P2S.

Лоскут Кунса, отрисованный путем сэмплирования точек поверхности. Для его отрисовки стандартными средствами среды прототипирования требуется конвертация в NURBS.

Технически, реализация поверхности Кунса ничего не стоит. Точную формулу, описывающую лоскут Кунса по опорным кривым можно найти, например, в монографии Н.Н. Голованова «Геометрическое моделирование». Однако есть нюанс. Лоскут Кунса не является стандартным типом поверхности и для его передачи, скажем, посредством формата STEP, потребуется осуществить преобразование в более универсальный вид, такой как NURBS (B-поверхность).

Преобразование в B-поверхность

Способ преобразования лоскута Кунса в B-поверхность хорошо известен [Lin, F. and Hewitt, W.T. 1994. Expressing Coons-Gordon surfaces as NURBS. Computer-Aided Design 26, 2, 145–155]. Идея алгоритма состоит в том, чтобы построить булеву сумму, компонентами P1S, P2S и P12S которой являются B-поверхности, определенные на едином базисе. Строго говоря, речь идет вовсе не о «преобразовании» одной формы в другую, но о построении с нуля такой B-поверхности, которая в точности совпадает с лоскутом Кунса как геометрическое место точек. Основные этапы этого процесса следующие:

  1. Протянуть поверхность P1S скиннингом через пару опорных кривых S(0,v) и S(1,v).

  2. P1S.

  3. Протянуть поверхность P2S скиннингом через пару опорных кривых S(u,0) и S(u,1).

  4. P2S.

  5. Построить «косую плоскость» P12S на угловых точках.

  6. P12S.

  7. Привести поверхности P1S, P2S и P12S к единому базису путем добавления недостающих узлов, повышения степени и транспонирования (если необходимо) криволинейных координат.

  8. Построить новую B-поверхность путем сложения координат контрольных точек поверхностей P1S, P2S и вычитания координат контрольных точек P12S.
Лоскут Кунса в виде B-поверхности.

Некоторые эксперименты

Подход, изложенный выше, был опробован на четырех скрещивающихся кривых Безье четвертого порядка (т.е. степени 3). В результате получилась поверхность Кунса в виде бикубического лоскута Безье с общим количеством контрольных точек равным 16-ти (см. команду "test-coons1" в программе Анализ Положения).

Контрольные точки построенного лоскута Кунса.

Для сравнения мы взяли инструмент GeomFill_ConstrainedFilling библиотеки OpenCascade. Данный инструмент предназначен для затягивания поверхностью заданных граничных кривых. Был опробован следующий код:

bool Fill4Contour(const std::vector<Handle(Geom_BSplineCurve)>& curves,
                  Handle(Geom_BSplineSurface)&                  result)
{
  if ( curves.size() != 4 )
    return false;
  
  Handle(GeomFill_SimpleBound) b1 = new GeomFill_SimpleBound(new GeomAdaptor_HCurve(curves[0]), 1e-3, 1e-2);
  Handle(GeomFill_SimpleBound) b2 = new GeomFill_SimpleBound(new GeomAdaptor_HCurve(curves[1]), 1e-3, 1e-2);
  Handle(GeomFill_SimpleBound) b3 = new GeomFill_SimpleBound(new GeomAdaptor_HCurve(curves[2]), 1e-3, 1e-2);
  Handle(GeomFill_SimpleBound) b4 = new GeomFill_SimpleBound(new GeomAdaptor_HCurve(curves[3]), 1e-3, 1e-2);
  
  GeomFill_ConstrainedFilling filling(3, 100);
  filling.Init(b1, b2, b3, b4);
  //
  result = filling.Surface();
  return true;
}

В конструктор класса GeomFill_ConstrainedFilling подается максимальная степень базисной функции и некоторое ограничение на количество сегментов сплайна, которое мы, не особо задумываясь, выставили равным 100. В результате получилась такая поверхность:

Поверхность, построенная инструментом GeomFill_ConstrainedFilling на том же наборе кривых, что и лоскут Кунса, представленный выше.

Результирующая поверхность уже не является поверхностью Безье (она имеет внутренние узлы) и содержит 768 контрольных точек. Кроме того, данная поверхность не является и поверхностью Кунса, в чем можно убедиться путем ее визуального сравнения с «идеальным» просэмплированным облаком.

Отличие поверхности, построенной инструментом GeomFill_ConstrainedFilling от поверхности Кунса.

В случае, если ограничить количество сегментов в GeomFill_ConstrainedFilling единицей, то в результате, действительно получается поверхность Безье (то есть сплайн из ровно одного сегмента).

Поверхность Безье, построенная инструментом GeomFill_ConstrainedFilling при количестве сегментов равном 1.

Однако такая поверхность вовсе не является лоскутом Кунса и не интерполирует граничные кривые.

Нарушение границ.

Заключение

Моделирование свободной формы, оно же — скульптурное моделирование или моделирование органических фигур, требует специального геометрического аппарата. Такой аппарат дают, например, поверхности подразделения (subdivision surfaces), модные и патентованные T-сплайны, а также старый добрый NURBS. Поверхность Кунса — это своеобразная точка старта для моделирования сплайнами. Ее замечательное свойство состоит в том, что данная поверхность проходит через свои опорные кривые без какой-либо алгоритмической погрешности. С другой стороны, лоскут Кунса — это лишь малая часть того геометрического арсенала, который необходим для проектирования свободной формы. В будущем мы планируем поговорить об этих вещах подробнее.