Вся суть проблемы в одном скриншоте вьюпорта — смотрим:
Не понятно? :) Я поясню.
Итак, друзья, в этой статье я бы хотел поговорить о проблеме, с которой сталкивался, наверное, каждый, кто начинал моделить танковые гусли. Стандартный алгоритм действий: создаем один сегмент гусениц, размножаем модификатором array, пускаем по кривой с помощью модификатора curve и…. видим, что изгиб происходит не только в рамках набора сегментов, размноженных модификатором array, но и в рамках каждого отдельно взятого сегмента.
*для наглядности я буду рассматривать проблему и ее решение на примере примитивной геометрии
**данное решение — одно из многих и относится, пожалуй, к созданию моделей для статики или простой анимации, не для игровых движков; для портфеля - в самый раз :)
Суть проблемы
Давайте проблему воспроизводить.
1. Наш сегмент гуслей (я заложил в нем достаточное количество геометрии, чтобы система смогла в дальнейшем ее погнуть).
2. Добавляем модификатор array, создавая «полноценную» гусеницу — пока все идет хорошо.
3. Создаем кривую и придаем ей форму, по которой мы хотим пустить нашу гусеницу.
4. Добавляем на нашу гуслю модификатор curve и указываем созданную кривую в качестве маршрута, по которому гусеница должна идти (поле curve object).
5. Проблема уже видна, но для порядка давайте повернем гусеницу на 90 градусов — R → X → 90.
И вот, что мы получаем при ближайшем рассмотрении: монолитные сегменты гусениц начинают изгибаться вдоль нашей кривой. Конечно, зачастую этого может быть и не заметно, но, согласитесь, ерунда какая-то.
Решение
Как будем решать нашу проблему? Расскажу об одном простом варианте, который потребует минимальное количество времени при весьма адекватном результате.
1. Убираем с сегмента гусли все модификаторы - им мы найдем применение в другом месте.
2. Создаем плоскость, простую, в один полигон, как и происходит по умолчанию - из нее мы сделаем основу наших гусениц (сегмент я пока спрятал, чтоб было видно главное на данном этапе).
3. Добавляем на плоскость модификатор array — что ж за гусли из одного сегмента?
4. А теперь и модификатор curve, как мы и делали ранее (я подобрал количество сегментов, чтобы гусля замкнулась; если на стыке, при замыкании, плоскости идут внахлест и не получается сделать аккуратный зазор, размер исходной плоскости можно уменьшить/увеличить, чтобы добиться качественного результата).
5. Вращаем плоскость на 90 градусов — та же история, что была у нас в примере с гуслями из готового сегмента выше.
6. Возвращаю обратно спрятанный сегмент.
7. Для сегмента делаю плоскость, которую мы пустили по кривой, родителем (Ctrl+P → object).
8. Выделяю нашу плоскость, иду во вкладку "Настройки объекта", подменю Instancing.
9. Выбираем пункт Faces — теперь к каждой плоскости, созданной модификаторами, присваивается по сегменту наших гуслей…. правда, пока не так, как нам хотелось бы.
Давайте исправлять.
10. Убедитесь, что пивоты плоскости и сегмента гуслей находятся в одном месте.
11. Убедитесь, что углы поворота и скейлы плоскости и сегмента сброшены на 0 (apply scale/rotation); в моем случае, плоскость-то я вращал, поэтому там не все гладко.
12. Обнулил - результат на скриншоте.
13. Сейчас у меня гусеницы вывернуты наружу — достаточно выделить плоскость и повернуть на 180 градусов по оси X (ну, в моем случае, так уж я геометрию строил).
Ну, что, геометрия гуслей больше не гнется. но стыкуется как-то не очень.
14. Давайте я пока отключу для нашей плоскости instancing и модификаторы — таким образом решить проблему будет проще.
15. Сместим сегмент гусли влево, чтобы она равномерно выпирала за пределы плоскости с обеих сторон — выпирающие части как раз и нужны для "вилкообразного" стыка сегментов.
16. Вернем пивот сегмента к 3д курсору (в этом же месте у нас и пивот плоскости находится, кстати) — правый клик, кто не помнит.
17. Возвращаем модификаторы на плоскость и включаем обратно instancing по фейсам.
18. И последнее, что я бы сделал — для плоскости в разделе instancing убрал бы галки с viewport и render, чтобы плоскость не накладывалась поверх сегментов гуслей, а стала бы невидимой.
Наш финальный результат:
У меня все :)
P.S. Для анимации гуслей анимировать нужно будет плоскости, а не сегменты гусениц — сегменты за ними последуют, поверьте :)