Алгоритм для получения закругленных краев и углов в трехмерной сетке - PullRequest
3 голосов
/ 14 августа 2010

Начиная с трехмерной сетки, как бы вы округлили края и углы между полигонами этой сетки?


Не желая препятствовать другим подходам, вот как я сейчас подхожу к проблеме:

Учитывая сетку для правильного многогранника, я могу придать краям сетки округлый вид, масштабируя каждый многоугольник вдоль его плоскости и соединяя края, используя сегменты цилиндров так, чтобы каждый цилиндр касался каждого многоугольника, где он встречается с этим многоугольником. 1006 *

Вот пример с кубом:

Cube

Вот куб после масштабирования его полигонов:

Куб после масштабирования полигонов

Вот куб после соединения ребер полигонов с помощью цилиндров:

Куб с закругленными краями

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

Ответы [ 4 ]

2 голосов
/ 16 августа 2010

Я отправляю это как ответ, потому что я не могу помещать изображения в комментарии.

Точка соприкосновения

Вот изображение двух братьев, кемпинга:

точка пригоршни http://img831.imageshack.us/img831/7398/tent.png

Они разместили свои простые палатки рядом друг с другом в середине крутого уолла (это одно плохое место для палаток, но это не главное), поэтому один конец каждой палаткиуказывает вверх.В точке, где встречаются четыре квадрата, у вас есть точка сателлита.Два края в верхней части каждой палатки могут быть закруглены как обычно, так и два нижних края.Но в точке сателлита у вас разная кривизна в обоих направлениях, и поэтому невозможно использовать сферу.Это исключает решение Сванте.

Самопересечение

На следующем рисунке показаны некоторые 3D-полигоны, если смотреть сбоку.Это какая-то острая вещь с отверстием, просверленным в нем с другой стороны.Левое изображение показывает это раньше, сразу после скругления.

альтернативный текст http://img802.imageshack.us/img802/8628/selfintersection.png.

Масса, которая удаляется с острого края, содержит конец отверстия.

Есть что-то еще, чтобы увидеть здесь.Стороны отверстий могут быть очень большими полигонами (допустим, это не отверстие, а щель).Тем не менее, вы получаете только небольшие радиусы в верхней части.Вы не можете просто масштабировать свои многоугольники, вы должны учитывать соседний многоугольник.

Выпуклость

Вы говорите, что только удаляете массу, это толькоистина, если ваша геометрия выпуклая.Посмотрите на изображение, которое вы разместили.Но теперь предположим, что зритель находится внутри тома.Радиусы отворачиваются от вас и, следовательно, прибавляют массу.

NURBS

Я сам не специалист по Nurbs.Но ограничения будут выглядеть примерно так: углы патча nurbs должны находиться в том же положении, что и углы уменьшенных полигонов.Нормальные векторы поверхности нурба по углам должны быть равны нормали многоугольника.Этого должно быть достаточно, чтобы гарантировать, что край нурба будет прямой линией, следующей за краем многоугольника.Нормалы также гарантируют, что на границе между полигоном и патчем nurbs не будет видимых ребер.

Я бы сам сделал математику.NURBS - это просто многоугольники.У вас будут некоторые неизвестные коэффициенты и ваши ограничения.Это дает вам систему уравнений (часто линейную), которую вы можете решить.

1 голос
/ 15 августа 2010

Экстраполируя ваш подход к краю цилиндра, углы должны быть сферами, соответственно. сегменты сферы, имеющие такой же радиус, как и встречающиеся там цилиндры, и центр на пересечении осей цилиндров.

1 голос
/ 15 августа 2010

Есть ли верхняя граница для числа граней, которые встречаются в этом углу?

Возможно, вы могли бы использовать концепции из CAGD, особенно могут представлять интерес неоднородные R-сплайны (NURBS)для вас.

Ваш текущий подход - склеивание некоторых фиксированных геометрических примитивов может быть слишком негибким, чтобы решить проблему.NURBS требует некоторой математической работы, чтобы привыкнуть к ней, но может быть более подходящей для ваших нужд.

0 голосов
/ 28 декабря 2016

Здесь у нас есть один заголовок C ++ для генерации триангулированных скругленных трехмерных блоков.Код написан на C ++, но его также легко перенести на другие языки кодирования.Кроме того, его легко модифицировать для других примитивов, таких как квады.

https://github.com/nepluno/RoundCornerBox

...