Художниците на игри рядко моделират по един обект в отделен .blend файл. Комплект от сандъци, бъчви, камъни и стени живее в една сцена, един до друг, а енджинът иска всеки елемент като отделен файл, с начало там, където го очаква, с чисто име и с правилния мащаб. Експортерите на Blender записват по един файл на клик. При четиридесет обекта това са четиридесет клика, четиридесет възможности да забравите „Selected only“ и четиридесет файла, всеки от които може да стои на три метра от собственото си начало. В тази статия показваме какво трябва на добрия експорт по обект, даваме кратък скрипт, който можете да ползвате още днес, и описваме какво очаква всеки енджин.
#GLB или FBX?
Изберете формата, който енджинът ви чете най-добре, а не този, който сте ползвали последния път:
- Godot 4 внася glTF 2.0 (.glb или .gltf) директно и документацията му препоръчва именно glTF. FBX също работи, чрез вградения вносител ufbx от Godot 4.3 нататък.
- Unity внася FBX без допълнителни стъпки. За glTF е нужен пакетът glTFast на Unity.
- Unreal Engine 5 внася и FBX, и glTF.
- Уеб енджините като three.js и Babylon.js зареждат glTF, а за уеб обикновено се избира GLB, защото е един компактен файл.
GLB е двоичната форма на glTF: геометрия, материали и текстури в един файл. Ако енджинът ви го чете добре, това е по-удобният файл за пренасяне.
#Подгответе сцената преди експорта
Повечето проблеми от типа „моделът изглежда грешно в енджина“ се решават в Blender преди експорта:
- Приложете ротацията и мащаба (Ctrl+A, Rotation and Scale). Обект с мащаб 0,01 или завъртян на 90 градуса в Blender пристига със същата трансформация в енджина и всеки колайдер и скрипт трябва да живее с нея. Отрицателният мащаб освен това обръща нормалите.
- Решете къде отива началото на всеки обект. За предмети, които стоят на пода, обикновено е долният център; за модулни стени е ъгъл от решетката. Каквото и да изберете, бъдете последователни в целия комплект.
- Пазете 1 единица в Blender = 1 метър. Godot и Unity също работят в метри. За FBX към Unity опцията на експортера „Apply Scalings: FBX All“ избягва познатия мащаб 100 на основния обект.
- Именувайте за енджина. Чисти, уникални имена без интервали и точки стават имена на файлове. Автоматичните окончания „.001“ на Blender нямат място в игрови проект.
- Ползвайте LOD окончания, които енджинът разпознава. Unity създава LOD Group автоматично, когато FBX файлът съдържа мрежи с имена
Rock_LOD0,Rock_LOD1и т.н. Godot сам генерира LOD нива при внасяне, затова за Godot често експортирате само първото ниво.
#Кратък скрипт: по един GLB и един FBX за всеки избран обект
Запазете .blend файла, изберете мрежите, отворете работното пространство Scripting и пуснете кода. Той записва файловете в папка export до .blend файла, премества всеки обект в нулата на света само за неговия експорт, така че началото му да стане начало на файла, и връща всеки обект на мястото му. Пуснахме го в Blender 5.2.2; ползва само вградените експортери на Blender.
import bpy, os
out = bpy.path.abspath("//export")
os.makedirs(out, exist_ok=True)
objects = [o for o in bpy.context.selected_objects if o.type == 'MESH']
for obj in objects:
bpy.ops.object.select_all(action='DESELECT')
obj.select_set(True)
bpy.context.view_layer.objects.active = obj
saved = obj.location.copy()
obj.location = (0.0, 0.0, 0.0) # origin at world zero
name = bpy.path.clean_name(obj.name)
bpy.ops.export_scene.gltf(
filepath=os.path.join(out, name + ".glb"),
export_format='GLB', use_selection=True, export_apply=True)
bpy.ops.export_scene.fbx(
filepath=os.path.join(out, name + ".fbx"),
use_selection=True, apply_scale_options='FBX_SCALE_ALL')
obj.location = saved
for obj in objects:
obj.select_set(True)
Знайте ограниченията му, преди да разчитате на него. Работи с обекти без родител; позицията на дъщерен обект е спрямо родителя, затова нулирането ѝ не го поставя в нулата на света. Записва по един файл на обект, не на колекция. Не разпознава LOD нива, не проверява дали два обекта получават едно и също почистено име и записва файловете, без да казва какво е записал. За няколко предмета това е достатъчно. В истински процес за модели точно тези пропуски изяждат времето.
#Какво още трябва на експорта в реален проект
Когато екипът експортира един и същ комплект всяка седмица, започват да имат значение няколко неща:
- Експорт по колекция, така че сграда от шест обекта да стане един файл.
- Шаблони за имена, например
{collection}/{name}_{lod}, така че папките и имената да следват правилата на проекта без ръчна редакция. - Работа с LOD нива: всяко ниво в отделен файл, всички нива на модела в един файл или само първото ниво, според енджина.
- Пробно пускане, което показва какво ще бъде записано, с броя триъгълници, преди нещо да стигне до диска.
- Отчет след всяко пускане, така че скрипт за билд или колега да вижда какво се е променило.
- Пресети, записани в .blend файла, така че настройките за експорт да пътуват с проекта.
- Непроменена сцена: експортът не бива да оставя приложени модификатори, преместени начала или преименувани обекти.
#Shipwell: същата идея, довършена
Този списък е спецификацията на Shipwell, разширение за Blender, което направихме за собствените си игрови модели. То експортира всеки обект или всяка колекция от сцената в отделен GLB, glTF, FBX или OBJ файл, именува файловете по шаблон и създава папките, разпознава LOD окончания като _LOD0 и .lod2 с избор между файл на ниво, файл на модел или само първото ниво, и може да постави началото на всеки експорт в нулата на света, в отместването на колекцията (instance offset) или в долния център на габарита. Може да приложи трансформациите и модификаторите и да триангулира. Пробното пускане показва планираните файлове с броя триъгълници, а всяко истинско пускане записва JSON и CSV отчет до файловете. Самите файлове се записват от вградените експортери на Blender от временни копия, така че сцената остава каквато е била.
Shipwell е предназначен за статични модели като предмети, модулни комплекти и елементи от околната среда: йерархиите се изравняват, а арматури, анимация, светлини и камери не се експортират. Неговите 31 автоматични теста експортират тестова сцена и в четирите формата, внасят всеки файл обратно и сравняват броя триъгълници, трансформациите, началата и имената в Blender 5.2.2. Shipwell е обявен като „Очаквайте скоро“; на страницата на продукта има панела и истински отчет от експорт.
#Често задавани въпроси
Защо моделът ми е завъртян на 90 градуса в енджина?
Blender ползва оста Z за нагоре, а glTF и повечето енджини ползват Y. Експортерите преобразуват осите, но обект, който в Blender още носи неприложена ротация, я запазва и в енджина. Приложете ротацията и мащаба преди експорта.
Защо моят FBX е 100 пъти по-голям или по-малък в Unity?
FBX пази мащаб на единиците, а Unity и Blender го четат различно. Експорт с „Apply Scalings: FBX All“, както в скрипта по-горе, обикновено дава основен обект с мащаб 1.
Трябва ли да триангулирам преди експорта?
Енджините и без това триангулират при внасяне. Ако го направите в Blender, вие решавате как се разделят четириъгълниците и многоъгълниците, което е важно при деформиращи се или много нискополигонални модели, а броят триъгълници, който виждате, е същият като този, който енджинът рисува.
Може ли скриптът да експортира колекции вместо обекти?
Не и в този вид. Трябва да изберете заедно обектите на всяка колекция и да нулирате отместването на колекцията вместо позицията на всеки обект. Точно тук специализираният инструмент започва да се отплаща.
Коментари
Коментари
Напишете първия коментар.
Оставете коментар