Статья будет полезна тем, кто работает с процедурной генерацией. Тем, кто создаёт окружение исключительно в редакторе, данная статья особенно не поможет.
С помощью таких зданий можно создать неплохой городской пейзаж.
UPD: Статья актуальна для пользователей UDK, в UE4 чаще используются другие способы для работы с процедурным контентом.
Оглавление
Создаём заготовку под дом
Создаём для этого коробку в 3Ds Max, удаляем нижнюю грань и назначаем модели три материала (одинаковые материалы противоположным стенам). Размеры могут быть любыми, но ширина и длина должны быть равны друг другу.
После того, как убедились, что текстуры растянуты на полную грань, отправляем модель в UDK.
Готовим текстуру для здания
На этом этапе нам нужно создать или найти подходящую текстуру для стены здания. Текстура должна хорошо тайлиться. Идеально подойдёт участок стены с окном.
Создаём тайлящийся материал
Для того, чтобы наша текстура повторялась нужное число раз по горизонтали и вертикали, нужно умножить её UV-координаты на двумерный вектор. Сохраняем. Создаём копию материала, в которой текстуру стены заменяем текстурой крыши.
Создаём два Material Instance Constant для наших материалов, включаем наши TileU и TileV. Применяем Instance Constant материала стен боковым граням нашей модели, Instance Constant материала крыши – верхней грани.
Пишем код
Теперь нам надо создать класс нашего здания и дать ему нужные методы для масштабирования.
Я надеюсь, с первой частью проблем у вас не возникло.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
var MaterialInstanceConstant MatIC_Front, MatIC_Side, MatIC_Top; var MaterialInstanceConstant MatInst_Wall, MatInst_Roof; simulated function PostBeginPlay() { MatIC_Front = new(None) Class'MaterialInstanceConstant'; MatIC_Front.SetParent(MatInst_Wall); MatIC_Side = new(None) Class'MaterialInstanceConstant'; MatIC_Side.SetParent(MatInst_Wall); MatIC_Top = new(None) Class'MaterialInstanceConstant'; MatIC_Top.SetParent(MatInst_Roof); StaticMeshComponent.SetMaterial(0, MatIC_Front); StaticMeshComponent.SetMaterial(1, MatIC_Side); StaticMeshComponent.SetMaterial(2, MatIC_Top); } function SetScale(float scX, float scY, float scZ) { local vector locScale; MatIC_Front.SetScalarParameterValue('TileU', scY); MatIC_Front.SetScalarParameterValue('TileV', scZ); MatIC_Side.SetScalarParameterValue('TileU', scX); MatIC_Side.SetScalarParameterValue('TileV', scZ); MatIC_Top.SetScalarParameterValue('TileU', scX); MatIC_Top.SetScalarParameterValue('TileV', scY); locScale.X = scX; locScale.Y = scY; locScale.Z = scZ; SetDrawScale3D(locScale); } defaultproperties { MatInst_Wall = MaterialInstanceConstant'Houses.LODs.LODSideMaterial_INST' MatInst_Roof = MaterialInstanceConstant'Houses.LODs.LODTopMaterial_INST' } |
Функция SetScale позволяет растянуть здание на любую длину, ширину и высоту.
Подберите параметры под свою модель.
Leave a Reply
You must be logged in to post a comment.