Створення моделі для udk в maya

Добрий день.
Я хотів би розповісти вам невеликий базовий урок про створення моделей для Unreal Engine 3.

Одиниці виміру
Працюйте завжди в сантиметрах, так простіше жити, серйозно :)

Бюджет і оптимізація
Давайте подивимося на наступну ілюстрацію:

На верхньому малюнку все ребра моделі жорсткі, на нижньому - м'які.
Чому така різниця в кількості вертексов?
Тому що жорсткі ребра додають вертексов. Один хард едж +2 вертекса. Вобще вони додають навіть не вертекси а поля для запису додаткової інформації.

Тепер подивимося таку ілюстрацію:

Тут в обох випадках все ребра м'які, а ювішкі зшиті.
Але, на першій по краю ми бачимо 8 вертексов, а на другий - 4. Ось вам і різниця 16-12.
Розрізання на UV теж додає вертексов. Одне розрізане на UV ребро - +2 вертекса.
Плюс ще не варто забувати про другий UV канал на лайтмапу, при неакуратному виконанні він теж потягне зайвих байт. А якщо модель більша? Скільки додаткової зайвої інформації запишеться в файл?
До речі ви не побачите ці зміни в * .ase файлі, вони проявляються лише після імпорту в движок. Власники вихідного коду можливо захочуть ознайомиться з FStaticMeshRenderData :: Build і USkeletalMesh :: CreateSkinningStreams для більш детального ознайомлення з проблемою.

На цьому настройка сцени ще не закінчена. Давайте уявимо що ми в підсумку хочемо отримати.
Це буде такий собі пропс, з лодом, колізією, лайтмапой, і повним набором текстур (diffuse, normal, specular).
Відкриваємо Hypershade і створюємо в ньому простий Phong, називаємо його як небудь, я назвав Material. У вкладці 2DTextures знаходимо і додаємо до матеріалу 4 Ноди файлів:

Обзивав їх відповідно - Diffuse, Normal, Specular і Lightmap.
(Якщо у вашої моделі будуть ще й елементи з альфа-каналом, то можливо варто додати ноду OpacityMask)

У вас вийде така конструкція:

Все, заготівля готова, зберігається :) Раджу вам зберегти цю сцену в якийсь окремий файл як початкову для роботи над такими об'єктами.

Створюємо наш простий об'єкт.

Так як об'єкт геніальний і самодостатній за своєю суттю, його абсолютно не потрібно переробляти.
Можливо ви навіть намалюєте на нього текстури і призначите в відповідні Ноди в матеріалі.
Але ж ми хотіли ще лод, колізію і лайтмапу!


Якщо ви знаєте і розумієте що таке LOD, я думаю у вас не виникне проблем з його створенням.
У анріле є тільки один момент який потрібно враховувати - за замовчуванням, відстані перемикань лодов виставлені таким чином що перший не встигає зникнути до появи другого. Звідси можна спостерігати ефект стробленія. Намагайтеся щоб полігони лодов не перебували в одних площинах. Зрушуйте їх трохи, або масштабуйте самі моделі.

Створити колізію ми можемо з цього ж кубика. Дублюємо його, обзивали UCX_01, і ховаємо в який-небудь шар PhysL.

Для більш складних об'єктів правила створення колізій не набагато складніше:
1 Іменування UCX_ *, де * - нумерація або ім'я англійськими літерами.
2 Всі елементи колізії повинні бути замкнутими (без дірок) і опуклими (convex) поверхнями.
3 Не можна об'єднувати елементи колізії в один меш, вони просто повинні бути виділені в момент експорту заважав, якщо ви робите ExportSelection, або ж просто бути присутнім в сцені якщо ви експорт її повністю.
4 Не можна щоб елементи перетиналися, вони можуть тільки примикати.
5 Природно намагайтеся уникати складної колізії.
6 На елементи колізії повинен бути призначений матеріал самого заважав, або один з його матеріалів.
7 І одна від мене - ніколи не робіть елементам колізії негативний Скейл. Ніякої FreezeTransform вас не врятує. Елемент завжди буде зіпсований після імпорту в движок.

Зараз ми з вами опинилися на другому UV каналі, де і буде розташовуватися лайтмапа. І як бачите там немає текстури.

З точки зору описаних вище оптимізацій за кількістю вертексов ця лайтмапа оптимальна, але є неприйнятною.
Чому так.
Наприклад ми розраховуємо використовувати на цьому об'єкті лайтмапу розміром 32х32.
Я користуюся піксельмапамі власного виробництва. Ну можу і поділитися.

Решта не складно. Зробіть відображення текстури без фільтрації і включіть СНАП до пікселів.
Переразложіте ювішку максимально заповнюючи простір.
Я зробив так:

Тепер проробляємо цю операцію і з LOD'ом також.

Чому не можна по-іншому? Навіщо обов'язково чітко по піксельмапе?
Тому що лайтмапа прожигается за цими пикселям.
Якщо у вас шелли ювішек НЕ будуть лежати чітко по пикселам, і відстань між ними буде менше 2х пікселів, або вони перетнуться, ви будете постійно отримувати незрозумілі проблеми з освітленням.
Які то світлі або темні смуги і плями там де їх бути не повинно. Спочатку вам захочеться вирішити проблему збільшенням розміру лайтмапи в самому двигуні, поставити не 32 а 128 наприклад.
Так, це вихід, але коли ви дійдете до сцен розміром в кілька тисяч об'єктів, де вам не буде вистачати зайвих 5 мегабайт щоб що то перестало постійно міпмапіться, насамперед ви згадаєте про лайтмапи.

Дякуємо за увагу.

Окреме спасибі Олександру Макаренко за додаткову інформацію.

Схожі статті