Render.ru

Сглаживание объектов

Paul_Winex

Знаток
Рейтинг
20
#1
У меня такой вот вопрос:
Есть объект, он как бы гладкий, сплошной без лишних или вообще каких-либо углов. Нужно что бы он разделился на несколько частей, и собрался вновь. Задача в плане анимации довольно простая. Но кк бы мне избежать этих границ, что появляются на стыках частей? Части собираются не равномерно, потом простая подмена объекта другим цельным не пойдет. Как достичь сглаживания двух частей, что бы это можно было заанимировать, и собранный объект был гладкий?
 

Вложения

Paul_Winex

Знаток
Рейтинг
20
#2
Ну что ж, недождавшись ответа я отвечаю сам. Это не значит что я знал раньше, просто поразмыслив над темой пришел к выводу. И так, в чём, собственно, заключалась проблема? В том что полигоны не имели сглаживаня друг с другом, находясь на стыке объектов. Даже являясь одним объектом или имея одну группу сглаживания, они были разными. Так в чем же проблема? Обратимся к самом системе сглаживания. Как происходит оно в 3D графике? Допустим есть 2 полигона, если схематически их отобразить, то получится нечно, похожее на рисунок 1. Тут же добавлен источник света. Каким образом происходит затенение объекта и почему образуются резкие и плавные переходы? Не вдаваясь в подробности геометрии давайте разсуждать на уровне 2D. Для начала за основу берется так называемая "нормаль" или "нормалия", которая является перпендикуляром, проведенным из центра полигона (N) и расщитывается угол падения света относительно этого элемента. Рисунок 2. От результата расчета, а именно от угла падения света, зависит степерь освещенности конкретного полигона. И мы имеем полигоны разной плотности освещения. А что если им поставить одну группу сглаживания? В этом случае полученный результат имеет вид как бы растяжки света. От одного параметра освещенности к другому. Как бы получается такая ситуация: чем конкретная точка на полигоне ближе к другому полигону, тем больше нормаль этой точки приближается к центральной нормали соседнего полигона. Рисунок 3. В данном случае расчет освещения как бы происходит не для целой плоскости полигона, а для каждой его точки или точней пикселя на картинке. Поэтому и кажется что всё гладко даже при не очень плотной сетке. (Если кто не согласен или видит грубые ошибки в моем описании, то скажу, что я так понимаю и не притендую на истину. Это достаточно понятный способ описания системы освещения)
Теперь к нашей проблеме. Почему 2 соседних разедененных полигона не связаные общим сглаженым светом? Ответ прост - они вовсе не соседние! И сглаживаются лишь соедененные полигоны. А как же тогда нам быть, если надо их сгладить? И тут, как оказалось, не сложная задача, хотя проблемы еще есть, но о них позже. И так, чтобы сгладить два отсоедененных но стоящих вплотную полигонов, а точней сделать иллюзию гладкости, нужно уровнять их нормали. А точней - сделать это полигоны лежащими в одной плоскости. Давайте я лучше нарисую чтобы было понятно. Рисунок 4. Вот в общем то и всё, полигоны лежат в одной плоскости и даже при том что они будут разными объектами, они будут казаться сглаженными. Но тут возникает проблема со структурой сетки, а так же необходима какая-то техника. Для начала расскажу как такое сделать. Обычно необходимо резать вдоль ребра. Чтобы без особых проблем разрезать по прямой, делаем следующее: выделяем ряд ребер и делаем им chemfer (фаску), в результате мы получаем новый ряд полигонов. Они, соответственно и будут разрезаться оставаясь в одной плоскости. Если сейчас выделить поперечные ребра и соеденить их одним ребром при помоще компнды Connect (соеденить), то прежне ребро вернется на место. Но оно будет как бы глубже чем раньше. И тут вот вознникает первый облом. Это изменение геометрии. К тому же, в ровномерной сетке появляется ряд полигонов меньшых по размеру. В довольно гладкой поверхности это будет заметно. Но не так резко как если бы сглаживания вовсе небыло. Итак, из рисунка 5 мы должны получить рисунок 6. После чего можно разделять объект на 2 части но вновь созданному ребру. Хочу заметить, что команда Extrude для ребра с нулевой высотой тут не поможет, так как нулевая высота оставит ребро на месте не опуская и не выравнивая полигоны. Так же можно сделать Chemfer достаточно большой, что бы полигоны остались одинаковыми, потом просто склеив совпадающие точки.
На органических объектах это будет довольно заметно, если вы делаете трансформера-киборга. Но вот для механики можно и поднастроиться, и будет нормально. И еще одна ложка дёгтя в мою теорию :). Довольно сложно будет сделать такую систему если разеденение идет не по прямой а по каким-то кривым направлениям. Так что нужно либо смириться и рабртать, либо искать другой способ сглаживания.
Всё, теперь буду стараться залить картинки, о которых говорил.
 

ArseniXC

Мастер
Рейтинг
545
#7
Paul_Winex, впервые вижу такой развернутый ответ на свой же вопрос, респект! Эх.. если бы все пользователи форума с такой серьезностью относились к поставленным вопросам. =)

p.s. Удалил два последних сообщения чтоб не затемняли отличную тему. =)
 
#9
хм...поздно отвечаю, ну да ладно. У меня до прочтения данного способа такая мысль первой пришла в голову: тупо сделать карту нормалей. Думаю, решает проблемы при любых швах.
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#11
Если тема все еще актуальна создай в тему в разделе скриптов. Есть идеи как обмануть SG.
 

Paul_Winex

Знаток
Рейтинг
20
#12
Если ты в курсе где создавать, почему сам не сделал? Скрипты это интересно, но можно же и тут это сделать. Хотя не мне решать. В общем сделай тему и сюда ссылу, там и пообщаемся.
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#13
Кому это нужно мне или тебе ?
Здесь не выкладываю по двум причинам:
a) Для этого существует специализированный раздел.
б) Потом легче искать.
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#14
Впринципе все очень легко делается даже без скрипта.
 

Вложения

Paul_Winex

Знаток
Рейтинг
20
#15
Да я ж в том смысле что если знаешь где, то сделай, а то я еще куда-нить не туда залезу. А по картинке я лично ниче не понял, если можно, расскажи что изображено!
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#16
Волков бояться в лес не ходить.
Да легче глянуть лови сцену.
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#18
=) Все просто, секрет в модификаторе Edit Normals который позволяет работать с вертексными нормалями (как в приличных пакетах=), с помощью него мы фризим оригинальные нормали объекта.

PS
Если не сочтеш затруд всеже сделать тему разделе скриптов, то выложу пару скриптов для автоматизации разбивки на фрагменты.
 
Сверху