Render.ru

Острые углы в NURBS кривых в два клика...

#1
Добрый день !

Мне хотелось бы поделится элегантным способом создания острых углов в NURBS кривых буквально в два клика, найденного в файле Beizer.3dm FTP архива McNeel. Тема не нова, но возможно кому-то пригодится `:)

Перед созданием NURBS кривой включается Persistent Snap to EndPoint, создаётся криволинейный участок необходимой формы, затем после создания последней из его точек щёлкаем правой кнопкой мыши для завершения текущей команды (1 Click) и повторным RightClick в области последней точки инициируем новую кривую, начальная точка которой благодаря Snap to EndPoint совпадает с конечной точкой предыдущей кривой (2 Click).

В итоге мы получаем острый угол между двумя сегментами NURBS кривых, которые после Join образуют кривую, состоящую из нескольких сегментов, угол между которыми можно дополнительно настроить при помощи EndBulge.
IMHO таким образом не притрагиваясь к другим кнопкам можно только мышой создавать достаточно сложные кривые, а использовав HandleBar editor (команда HBar) на созданном начерно контуре можно при помощи привычных тангентов настроить кривизну сплайнов почти как при работе с традиционными Beizer сплайнами.

Минусом является тот факт, что создаваемые кривые на самом деле состоят из нескольких сегментов и соответственно преобразуются в PolySurface. Однако традиционный способ концентрации числа вершин, равных порядку кривой (обычно 3) в точке излома так же даёт Polysurface так как Rhino предпочитает разбивать резкие изменения кривизны в отличии от того же MAX`а. Если необходимо обеспечить непрерывность создаваемой кривой то можно просто, как говорится в документации к Rhino - расположить на равном расстояни три точки образовав прямой угол, что приведёт к созданию планого перехода, подобного Fillet, который может быть очень маленького размера и восприниматься как прямой угол. Но на мой взгляд первый способ как-то эргономичнее `:)) К тому же просто удалив Join вершины можно вновь соиеденить сегменты в единую кривую, подобно тому как это делает MatchCrv, так что добавив две дополнительные вершины по сторонам от удаляемой Join можно опять же получить подобие Fillet, ценой некоторых искажений исходной формы.

Файл Beizer.3dm доступен в разделе `Rhino` ftp McNeel - папка Misc.

С Уважением DP.
 
#2
Добрый день !

В добавление к вышесказанному способу соединения нескольких сегментов NURBS кривых. Для этогй же цели можно выполнить ReBuild кривых объединённых при помощи Join и если кривые не имели острых углов - после объединения их форма может изменится не так существенно (поробуйте применить Rebuild к прямоугольнику `: )), хотя на мой взгляд всё таки проще удалить одну CV в месте Join`а.

С Уважением DP.
 
#3
Спасибо. Интересно было почитать.
Я обычно пользуюсь более убогим способом для создания закруглений:
>Fillet->Join all->удаляю вершины на стыках сегмента.

2 DP^ А как вы скругляете стыки поверхностей?Fillet, blend, или merge?

Если кто мимо проходит, напишите пожалуйста как использовать Variable Fillet для поверхностей.
 
#4
Только этот файл (bezer.3ds) в папке models на фтп МакНила.
Спасибо.
 
#5
Добрый день !

2 Антон, в плане инструментария, используемого для скругления поверхностей всё зависит от поставленной задачи, иначе говоря степени непрерывности между соиединяющей поверхностью с соиединяемыми.

Допустим мы имеем две плоскости, расположенные под углом 90` для их соиединения можно использовать Fillet с опциями Extend и Trim. В таком случае поверхности будут условно пролонгированны до места пересечения и затем обрезаны по границе создаваемого Fillet. Результатом будет поверхность С1(Тангенциального) уровня непрерывности, что говорит о том, что тангенты для каждой из соиединяемых поверхностей будут совпадать с соиединяющей, иначе говоря мы получим аналог скошенной грани Fillet на объеках в MAX иногда этого бывает достаточно, особенно при моделировании неорганических форм с преобладанием плоских поверхностей, когда данная техника используется для их сглаживания или соиединения. Минусом данного способа является на мой взгляд - невозможность объединения без потери формы результирующих объектов в единое целое и соответственно возможностью появления щелей между поверхностями при визуализации, что правда можно решить настройками тесселяции в свойствах сцены (RMB по Render).

Другая ситуация IMHO когда нам необходимо получить плавный переход между поверхностями сложной формы, возможно с перспективой объединения результата в единую поверхность, как в случае с моделированием органических форм. В таком случае можно использовать Blend, создающий соиединяющую поверхность с С2 уровнем непрерывности, что означает, что кривизна всех трёх поверхностей, (соиединяющей и двух соиединяемых) в результате не будет иметь резких скачкообразных соиединений.

Однако если применить Blend в первой ситуации, то соиединяющая поверхность пытаясь избежать резких изменений кривизны может выгнутся складкой, что вряд ли желательно. На мой взгляд так можно представить основные способы соиединения поверхностей, однако в каждой из категорий существует ряд альтернативных способов, скажем поверхность С1 получить создав поверхность как BiRail, используя в качестве направляющих рёбра поверхностей, а С2 путём создания перепендикулярных к рёбрам поверхностей Blend кривых (опция P), на основаниикоторых можно построить CurveNetwork. В ообщем за это я и люблю Rhino `: ) решение любой, чисто технической на первый взгляд задачи порождает творческие решения. Порой чувствуешь себя как ребёнок перед коробкой с супер-пупер конструктором из 1000 деталей `: )

Интересно так же, что помимо C0, C1 и C2 существуют и высшие уровни непрерывности, обеспечивающие плавную или даже с постоянную величину изменения кривизны, эти вещи интересно описаны в разделе, посвящённому средствам анализа кривых и поверхностей документации Rhino, и позволяют естественным обазом осознать все ограничения NURBS и получать от работы удовольствие. На Dlight.ru есть, кстати, очень интересная статья, посвящённая гармонии в формах, что на мой взгляд согласуется с описанными выше принципами, и позволяет понять откуда пришли все ограничения NURBS и как их можно использовать.

То, что касается созданию Fillet с переменным радиусом, то это очень хорошо описано в Rhino L2 training guide вместе с примером создания Fillet между тремя взаимоперпендикулярными поверхностями, как например рёбра куба. (Если кому-то будет нужно см. ссылку ниже)

С Уважением DP.
 
#6
Добрый день !

Ну и напоследок есть ещё один способ эксплуатации данной находки. `:)
При построении прямолинейных поверхностей вместо Fillet можно просто создавать арку требуемого размера, при помощи кривой из трёх CV, расположенных под прямым углом друг к другу и находящихся на равном расстоянии друг от друга. Отдельный сегмет созданный подобным образом эквивалентен импользованию Fillet, но по моему удобнее. Кроме того, используя комбинацию двух нажатий RMB (см. http://www.render.ru/forum/read.php?f=12&i=1853&t=1853) можно, используя инструмент CV Curve и не обращаясь к тулбару делать практически всё, поскольку порядок создаваемой кривой, а соответственно и её вид будет определяться количеством точек расположенных между нажатиями RMB. Так при создании кривой c D.3 сегмент состоящий всего из двух точек будет иметь D.1 и являтся аналогом Polyline; сегмент из трёх точек, как описанно выше эквивалентен Fillet - D.2; а кривые с большим числом точек работают как обычный инструмент CV Curve.

В итоге при помощи одного инструмента можно создавать как прямолинейгые так и сложные сегменты вместе составляющие требуемый контур. Мне лично удобнее использовать подобный способ чем переключаться между несколькими инструментами или групировать CV как описано в L1 Training guide, а поскольку совокупность кривых независимо от их взаимоотношения (G1-G2) пред построением поверхности, как оказалось, анализируется на предмет возможности построения полноценной NURBS поверхности взамен PolySurface - результатом подобного "дробного" построения вне зависимости от числа сегментов может стать одна или несколько слитных NURBS кривых в зависимости от наличия острых, (не Fillet) углов.

Такое вот наблюдение, мне подобный способ кажется удобным и естественным, возможно пригодится кому либо ещё `:)

С Уважением DP.
 
#7
Добрый день !

Ну и напоследок есть ещё один способ эксплуатации данной находки. `:)
При построении прямолинейных поверхностей вместо Fillet можно просто создавать арку требуемого размера, при помощи кривой из трёх CV, расположенных под прямым углом друг к другу и находящихся на равном расстоянии друг от друга. Отдельный сегмет созданный подобным образом эквивалентен импользованию Fillet, но по моему удобнее. Кроме того, используя комбинацию двух нажатий RMB (см. http://www.render.ru/forum/read.php?f=12&i=1853&t=1853) можно, используя инструмент CV Curve и не обращаясь к тулбару делать практически всё, поскольку порядок создаваемой кривой, а соответственно и её вид будет определяться количеством точек расположенных между нажатиями RMB. Так при создании кривой c D.3 сегмент состоящий всего из двух точек будет иметь D.1 и являтся аналогом Polyline; сегмент из трёх точек, как описанно выше эквивалентен Fillet - D.2; а кривые с большим числом точек работают как обычный инструмент CV Curve.

В итоге при помощи одного инструмента можно создавать как прямолинейгые так и сложные сегменты вместе составляющие требуемый контур. Мне лично удобнее использовать подобный способ чем переключаться между несколькими инструментами или групировать CV как описано в L1 Training guide, а поскольку совокупность кривых независимо от их взаимоотношения (G1-G2) пред построением поверхности, как оказалось, анализируется на предмет возможности построения полноценной NURBS поверхности взамен PolySurface - результатом подобного "дробного" построения вне зависимости от числа сегментов может стать одна или несколько слитных NURBS кривых в зависимости от наличия острых, (не Fillet) углов.

Такое вот наблюдение, мне подобный способ кажется удобным и естественным, возможно пригодится кому либо ещё `:)

С Уважением DP.
 
Сверху