Към съдържанието
PN Scripts

Игри

Пакетен експорт на сцени от Blender към GLB и FBX за игрови енджини

  • PN Scripts
  • 7 мин четене

Художниците на игри рядко моделират по един обект в отделен .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 преди експорта:

  1. Приложете ротацията и мащаба (Ctrl+A, Rotation and Scale). Обект с мащаб 0,01 или завъртян на 90 градуса в Blender пристига със същата трансформация в енджина и всеки колайдер и скрипт трябва да живее с нея. Отрицателният мащаб освен това обръща нормалите.
  2. Решете къде отива началото на всеки обект. За предмети, които стоят на пода, обикновено е долният център; за модулни стени е ъгъл от решетката. Каквото и да изберете, бъдете последователни в целия комплект.
  3. Пазете 1 единица в Blender = 1 метър. Godot и Unity също работят в метри. За FBX към Unity опцията на експортера „Apply Scalings: FBX All“ избягва познатия мащаб 100 на основния обект.
  4. Именувайте за енджина. Чисти, уникални имена без интервали и точки стават имена на файлове. Автоматичните окончания „.001“ на Blender нямат място в игрови проект.
  5. Ползвайте 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, вие решавате как се разделят четириъгълниците и многоъгълниците, което е важно при деформиращи се или много нискополигонални модели, а броят триъгълници, който виждате, е същият като този, който енджинът рисува.

Може ли скриптът да експортира колекции вместо обекти?

Не и в този вид. Трябва да изберете заедно обектите на всяка колекция и да нулирате отместването на колекцията вместо позицията на всеки обект. Точно тук специализираният инструмент започва да се отплаща.

#Източници

Коментари

Коментари

Напишете първия коментар.

Оставете коментар

Следваща стъпка

pnscripts.com/bg/contact

Пишете на екипа

Попитайте за статия или ни разкажете за проект, който искате да изградим. Отговаряме до един работен ден.

Пишете ни

Семейството PN Scripts

Другите сайтове на PN Scripts

Хостингът, игрите и блогът имат свои сайтове, поддържани от същата компания.

  • pnscripts.com

    PN Scripts

    Софтуерно инженерство

    Уеб и мобилни приложения, API и игри по поръчка, плюс нашите продукти и плъгини с отворен код.

  • games.pnscripts.com

    Игри

    Игри и игрови сървъри

    Домът на игрите на PN Scripts: безплатни браузърни игри, които се играят веднага, а игровите сървъри предстоят.

  • hosting.pnscripts.com

    Хостинг

    Хостинг и инфраструктура

    Споделен хостинг, KVM VPS, самостоятелни сървъри и домейни от същата компания, която изработва проекта ви.

  • blog.pnscripts.com

    Блог

    Статии и бележки

    Практични статии за разработка на софтуер, хостинг, отворен код и игри, писани от хората, които ги създават.

    Вие сте тук