Рис. 1. ID боковых полигонов назначен 1
Рис. 2. ID торцевых полигонов назначен 2
2) Предварительно проверить локальную ориентацию моделей назначив модификатор UVW Map c типом мэппинга Cylindrical. Если Gizmo модификатора ложится корректно как на Рис. 3. то все в порядке. В принципе при стандартных вариантах моделирования бревен (из примитива Cylinder либо Circle + Extrude) модель будет иметь правильную ориентацию. Если вы все-таки умудрились получить иную ориентацию gizmo модификатора, то следует "поставить бревно вертикально" и применить Reset XForm из закладки Utilities.
Рис. 3. Корректная ориентация Gizmo модификатора UVW Map
Затем из подготовленных моделей выстраиваем по чертежам сечения дома, и собираем его воедино. С вашего позволения мы продолжим рассматривать статью на примере только 1 стены (Рис. 4), поскольку ни дизайнер ни заказчик не будут рады, что их проект фигурирует где-либо.
Рис. 4. Пример стены.
Поиск текстур так же достаточно утомительная процедура. Где взять текстуру развертки бревна?.. Обычная текстура дерева не подойдет - будет выглядеть не убедительно. Однако тут достаточно немного подумать и о эврика! Откуда берется такой материал как фанера? Правильно! Его спиливают с поверхности бревна! Поэтому вперед в гугл, ищем текстуру фанеры. Первые же результаты по тэгам "new plywood" часто ссылаются на старенький ресурс cgtextures com. Достаточно зарегистрироваться и вы получите доступ на скачивание фото высокого разрешения. Готовые текстуры не нужны, лучше сделать самому. Итак из всего многообразия я выбрал 3 фото, приглянувшиеся мне по фактуре. Рис. 5-7.
Рис. 5 Более спокойная и равномерная фактура.
Рис. 6. Легкая фактура с узорами.
Рис. 7. Фактура с интересными узорами.
После обработки в PS и сведения во одно изображение вышла неплохая текстура (Рис. 8), которую предстоит нарезать для уже упомянутого плагина Multitexture. Она намерено имеет такую вертикальную ориентацию, для дальнейшей беспроблемной проекции на бревна.
Рис 8. Основная текстура для Diffuse.
Далее в PS я использую инструмент "Раскройка" для вырезки "плашек". Рис. 9.
Рис. 9.
Чтобы автоматически сохранить все нарезки следует использовать команду Файл -> Сохранить для Web и устройств. Настройки опущу, посокольку они тут не существенны, просто выберите качество получше, и нажмите сохранить. В итоге в указанном месте PS создаст подкаталог images и разместит туда все файлы с пронумерованными именами(Рис. 10). Очень удобная вещь на мой взгляд.
Рис. 10. Нарезанные изображения.
Для более хорошего эффекта каждое второе изображение следует перевернуть на 180 градусов или отразить по вертикали. Подредактировав исходную большую текстуру под каналы Reflect Glossiness и Bump сохраняем таким же образом отдельные плашки по тому же пути. В данном посте мы этот шаг пропустим.
С текстурами для срезов бревен(торцов) тоже стоит заморочиться. Можно разумеется скачать с нашего любимого ресурса (3ddd) готовые, но лично мне они не совсем подошли. Хотелось чего-то по-мягче. В итоге пришлось выкраивать с плохого референса. Аналогично соединяем все в одно (Рис. 11) для цветокоррекции и нарезаем на отдельные изображения.
Рис. 11. Срезы бревен.
Собственно все готово для кульминации. Создаем в сцене со срубом Multi/Sub-Object материал с 2-мя ID. Для ID 1 создаем простой матераиал(VrayMtl, CoronaMtl, ...) с картой Multitexture на канале Diffuse для которой указываем основные текстуры, для ID 2 аналогично, но выбираем торцевые текстуры. Рис. 12. Не забываем что в настройках MultiTexture следует выбирать не Material ID по умолчанию а Object.
Рис. 12. Структура материала.(только Diffuse)
Назначаем на наши бревна - Рис. 13. Результат предсказуемо плох.
Рис. 13. Плохой или отсутствующий мэппинг.
И вот тут нам на помощь приходит max script. Те кто с ним не знаком не стоит расстраивать и закрывать статью. Кода совсем чуть-чуть и он очень прозрачный. Гуру скриптов могут покритиковать)..
Необходимо преобразовать все бревна в Editable Poly и убрать из сцены все кроме них. Первая операция по логике состоит в назначении всем объектам модификатора UVW Map с цилиндрической проекцией. Запускаем команду Run Script из главноего меню MAXScript. В появившееся окно MAXScript вводим код ниже. Т.к. я работал с бревном d = 280мм то скрипт будет выглядеть так:
/* AddModifier script */
m = uvwmap()
m.maptype = 1
m.cap = on
m.length = 280
m.width = 280
m.height = 2695
for obj in $* do
addmodifier obj (copy m)
Значение 2695 подобрано из расчета: 280*pi = k * 653 (длина короткой стороны текстуры в px). Вычислив k умножаем на 2000 (длинную строну текстуры в px) ~ 2695. Расчеты привел к тому что вы же будете использовать свои текстуры, поэтому это пригодится. Выполняем скрипт командой Ctrl + E. (или Tools->Evaluate All) В результате выполнения скрипта всем бревнам назначится отдельно свой модификатор UVW Map, и наши бревна приобретут вид как на Рис. 14.
Рис. 14. Бревна с цилиндрическим мэппингом.
Мультитекстура во вьюпортах отображает 1 текстуру. Пробуем отрендерить. Плагин честно раскидал все 6 текстур, НО на лицо очень много повторяющихся элементов (Рис. 15).
Рис. 15. Повторяющиеся элементы.
Да, можно увеличивать кол-во текстур, но это не наш метод! Лучшая идея это погонять Gizmo у модификаторов!! Смещать случайным образом по горизонтали и поворачивать вокруг бревна. В данном случае скрипт будет выглядеть так:
/* Randomize script */
for i = 1 to $* .count do
(
obj = $*[i]
mdfr = obj.modifiers[1]
mdfr.gizmo.pos = [0, 0, (random -2700 2700)]
mdfr.gizmo.rotation = (quat 0 0 (random -0.99 0.99) 1)
ConvertTo obj Editable_Poly
)
Последняя команда перевода объекта в Editable Poly добавлена не случайно. Чуть позже опишу зачем*. Выполняем скрипт и вуаля!! Ни одного повторяющегося бревна! Рис. 16.
Рис. 16. Нет повторяющихся бревен.
Скрипт можно прогонять несколько раз пока результат не устроит. Казалось бы можно открывать шампанское, но нет. На торцах со спилами в круглых вырезах поплыл мэппинг (Рис. 17). Потому что тут боковая проекция цилиндричекой раскладки доминирует над верхом и низом. Придется назначать на торцевые полгоны свой планарный мэппинг.
Рис. 17. Кривой мэпинг в выпилах.
Но тут лень уже было шерстить справку по MaxScript и тут пригодился встроенный MacroRecoder. Следует запустить MAXScript Listener и Macro Recoder из главного меню MAXScript и вы увидите как все что вы делаете записывается в макрос. Этим результатом я и воспользовался. Соответственно получилась третья часть скрипта:
/* Planar mapping */
for obj in $* do
(
select obj
subobjectLevel = 4
modPanel.setCurrentObject $.baseObject
$.EditablePoly.selectByMaterial 2
modPanel.addModToSelection (Uvwmap ()) ui:on
macros.run "Modifier Stack" "Convert_to_Poly"
)
Такие макросы имитирующие действия пользователя конечно выполняются дольше, но если кто-то улучшит - все будут признательны. *Т.к. тут исплользуется subLevel = 4(полигоны) то для этого скрипта все бревна заранее должны быть переведены в Editable Poly в предыдущем макросе. В результате перебора всех объектов получится то что надо. Рис. 18.
Рис. 18. Правильный мэппинг на торцах.
Рис. 19. Рендер.
Теперь можно собрать все части скрипта в 1 и прогонять его для выстроенного сруба. Отмечу еще раз что в сцене ничего кроме бревен быть не должно. Поскольку сруб вероятнее всего является первым, что вы будете делать из проекта дома, то думаю эта ремарка не критична.
Это пока все, чем хотел поделиться. Буду рад если кому-то пригодится.