109 lines
6.7 KiB
Markdown
109 lines
6.7 KiB
Markdown
# Ś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:
|
||
|
||
```python
|
||
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](animation_catalog.md).
|
||
|
||
`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](animations.md).
|
||
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`.
|
||
|
||
```python
|
||
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.
|