6.7 KiB
Ściąga — ue_workshop
Import: from ue_workshop import Scene, Sequence, Renderer, camera, lighting, materials, assets, blender, render
REIMPORT=False w plikach ćwiczeń używa istniejących assetów UE; brakujące są importowane.
REIMPORT=True ponownie importuje modele i klipy, także po edycji .blend.
Własny skrypt: scene.skeletal_model(..., reimport=True) lub scene.model(..., reimport=True).
Nie ma automatycznego wykrywania zmian źródeł.
Enumy i długości bez uruchamiania UE:
from ue_workshop.animations import FighterAnimations
clip = FighterAnimations.GREAT_SWORD_ATTACK
clip.seconds
clip.frames(shot.fps, speed=1.0)
shot.animation(character, clip, start=48) # jeden przebieg; end obliczony z długości
Jawne end nadal pozwala zapętlić klip. scene.skeletal_model(path, name="Ninja")
automatycznie wygeneruje NinjaAnimations po pierwszym imporcie w UE, także dla
własnych plików studentów. Katalog offline i jego odświeżanie.
shot.animation(character, clip, start=57, keep_end_position=True) zapisuje poziomy
ruch z klipu jako klucze Transform; końcowy klucz utrzymuje pozycję po ataku.
Źródłowy klip pozostaje bez zmian. Opcja dotyczy ruchu kości głównej.
shot.position(character, frame=80) odczytuje pozycję aktora z krzywych sekwencji.
shot.move(character, start=80, end=120, offset=(0, 50, 0)) dodaje klucze ruchu
o 50 cm względem pozycji w klatce 80, także po keep_end_position.
move zastępuje klucze pozycji w tym odcinku i odpowiednio przesuwa późniejsze.
shot.animation(character, clip, reverse=True, keep_end_position=True, start=80, end=120)
odtwarza kroki i przeniesiony ruch do tyłu. Odległość można nadpisać przez shot.move.
shot.animation(character, CreatureAnimations.MUTANT_DYING, start=150, keep_end_pose=True)
odtwarza śmierć raz i zachowuje końcową pozę na dalszą część sekwencji.
camera.create(..., fov=60) ustawia poziomy kąt widzenia w stopniach: większy FOV
daje szerszy kadr. Zakres: 0 < fov < 180. Domyślne 43.6 odpowiada obiektywowi
45 mm na sensorze o szerokości 36 mm.
| Operacja | Przykład |
|---|---|
| Własna mapa | scene = Scene("MyShot") |
| Kolor PBR (wartości liniowe 0–1) | mat = materials.color("Red", (0.8, 0.02, 0.01), roughness=0.4) |
| Prosta postać | actor = scene.character(material=mat, head_scale=1.3) |
| Bryła | scene.primitive("Sphere", name="Ball", location=(0, 100, 50), material=mat) |
| Import statycznego modelu | mesh = assets.import_model("C:/models/model.glb", name="MyModel") |
| Eksport + import Blendera | mesh = blender.import_character("C:/models/character.blend") |
| Model na scenie | actor = scene.mesh(mesh, name="Hero") |
| Import z dopasowaniem rozmiaru i pivotu | actor = scene.model("source_assets/models/hero.glb", name="Hero", height=200) |
| Korekta osi modelu przed dopasowaniem | actor = scene.model("hero.fbx", rotation=(0, 0, 90)) |
| Światła studyjne | lights = lighting.studio(scene) |
| Pojedyncze światło | lighting.area(scene, location=(200, -200, 350), intensity=10000, color=(1, 0.5, 0.2)) |
| Żarówka | lamp = lighting.point(scene, location=(0, 0, 250), intensity=10000, color=(1, 0.5, 0.2)) |
| Reflektor | spot = lighting.spot(scene, location=(200, -200, 400), target=(0, 0, 100), angle=30) |
| Słońce (liczy się tylko kierunek) | sun = lighting.sun(scene, location=(300, -300, 500), target=(0, 0, 0), intensity=500) |
| Kamera | cam = camera.create(scene, location=(450, -550, 300), target=(0, 0, 100), fov=43.6) |
| Zmiana kierunku | camera.look_at(cam, (0, 0, 150)) |
| Sekwencja | shot = Sequence(scene, fps=24, frames=48) |
| Aktywna kamera | shot.camera(cam) |
| Klucz pozycji | shot.transform_key(actor, 0, location=(0, 0, 0)) |
| Klucz rotacji | shot.transform_key(actor, 47, rotation=(0, 0, 360)) |
| Klucz skali | shot.transform_key(actor, 24, scale=(1.2, 1.2, 1.2), interpolation="auto") |
| Klucz koloru światła | shot.light_key(spot, 0, color=(1, 0, 0)) |
| Klucz jasności światła | shot.light_key(spot, 47, intensity=40000, interpolation="auto") |
| Zapis + otwarcie Sequencera | shot.save() |
| Własny renderer | renderer = Renderer(width=1920, height=1080, samples=8, warmup=32, mp4=True) |
| Preset z własnymi wartościami | renderer = Renderer.from_preset("final", samples=8) |
| Render z własnymi ustawieniami | renderer.render(shot) |
| Podgląd tym samym rendererem | renderer.render(shot, single_frame=24) |
| PNG + MP4 | render.start(shot, preset="preview") |
| Tylko PNG | render.start(shot, mp4=False) |
| Jedna klatka | render.start(shot, single_frame=24) |
UE: centymetry, Z w górę. Rotacja w kluczach: roll, pitch, yaw, stopnie.
Klatki: 0..frames-1, koniec zakresu wyłączny. Interpolacja: linear, auto, constant.
Cały obrót: klucze 0 i 360, nie 0 i 0. Kamera i modele to oryginalne obiekty UE:
możesz wywoływać ich metody, np. actor.set_actor_label("MyHero").
shot.asset to oryginalny LevelSequence, shot.bind(actor) zwraca binding UE.
W my_shot.py: MODEL="fighter" lub MODEL="creature" wybiera postać ze szkieletem.
Nazwy klipów pochodzą z plików, np. great_sword_walk i mutant_swiping.
scene.skeletal_model(...) samo znajduje wszystkie FBX obok modelu — bez animations.
Dostępne jest 51 animacji fighter i 12 animacji creature; pełny katalog.
Własny FBX lub .blend
z Armature: MODEL="file", SKELETAL=True, MODEL_FILE=....
ANIMATION_FILE=None odtwarza animację z pliku modelu; można wskazać osobny FBX
z animacją dla tego samego szkieletu. Dla statycznego modelu ustaw SKELETAL=False.
character = scene.skeletal_model("source_assets/character/my_character.fbx", name="Hero")
shot.animation(character) # tylko gdy postac ma jedna dostepna animacje
# Gdy jest ich wiecej: shot.animation(character, "nazwa_pliku_animacji")
# Albo nazwane klipy: scene.skeletal_model(..., animations={"walk": walk_fbx, "idle": idle_fbx})
# shot.animation(character, "walk", start=0, end=48, speed=1.0)
# shot.animation(character, "idle", start=48, end=120)
# Plynne przejscie: pierwszy klip 0..60, drugi 48..120:
# shot.animation(character, "walk", start=0, end=60)
# shot.animation(character, "idle", start=48, end=120) # automatyczny blend 12 klatek
Krótsza animacja zapętla się w swojej sekcji. transform_key porusza całym aktorem
równolegle z animacją kości. Do własnych tras wybieraj klipy In Place.
Blender: kolekcja Character, siatki przypisane do jednego Armature, aktywna akcja
i zakres klatek sceny. Zapisz plik przed ponownym uruchomieniem skryptu w UE.
Przy pojedynczym podglądzie nie uruchamiaj dodatkowo pełnego renderu: jednocześnie może pracować tylko jeden renderer warsztatowy.