Read this manual in English

Animacja modeli 3D

Animacja szkieletowa trójwymiarowych modeli jest podobna do animacji typu Spine, z tym, że działa również w trójwymiarze. Animacja szkieletowa modeli 3D wykorzystuje “kości” (ang. bones) modelu do deformacji wierzchołków (ang. vertices) w modelu. Model 3D nie jest jednak podzielony na osobne części związane ze sobą w łańcuch kinematyczny, a w zamian tego, ruch “kości” deformuje siatkę wierzchołków reprezentującą obiekt 3D, a Ty masz kontrolę nad tym, w jaki sposób kości wpływają na taką deformację.

Szczegóły dotyczące importowania danych 3D do komponentu typu “Model” dla animacji znajdziesz tutaj: Instrukcja Modeli 3D.

Blender animation{.inline srcset=”images/animation/blender_animation@2x.png 2x”} Wiggle loop

Odtwarzanie animacji

Modele są animowane za pomocą funkcji model.play_anim():

function init(self)
    -- Rozpocznij animację "wiggle" w tę i z powrotem komponentu #model
    model.play_anim("#model", "wiggle", go.PLAYBACK_LOOP_PINGPONG)
end

W chwili obecnej Defold obsługuje tylko tzw. animacje wypieczone (baked animations). Animacje muszą zawierać macierze dla każdej animowanej kości na każdej klatce kluczowej, a nie pozycje, rotacje i skale jako osobne klucze.

Animacje są także interpolowane liniowo. Jeśli chcesz użyć bardziej zaawansowanej interpolacji krzywych, animacje muszą zostać wypieczone (prebaked) z poziomu eksportera.

Klipy animacji w Collada nie są obsługiwane. Aby użyć wielu animacji na jednym modelu, wyeksportuj je jako osobne pliki .dae, a następnie zgromadź te pliki w pliku .animationset w Defold.

Hierarchia kości

Kości (ang. bones) w szkielecie modelu są reprezentowane wewnętrznie jako obiekty gry (game objects).

Możesz uzyskać identyfikator (id) instancji obiektu gry kości w czasie rzeczywistym. Funkcja model.get_go() zwraca identyfikator obiektu gry dla określonej kości.

-- Weź środek kości 002 obiektu gry modelu wiggler
local bone_go = model.get_go("#wiggler", "Bone_002")

-- Zrób coś z obiektem gry

Animacja kursora

Oprócz korzystania z model.play_anim() do animacji modelu, komponenty typu Model udostępniają specjalną właściwość “kursor” (ang. cursor), którą można manipulować za pomocą go.animate() (więcej na temat animacji właściwości)). Przykład:

-- Ustaw animację komponentu #model ale jeszcze nie rozpoczynaj
model.play_anim("#model", "wiggle", go.PLAYBACK_NONE)
-- Ustaw kursor animacji na początku (0)
go.set("#model", "cursor", 0)
-- Animuj wartość kursora animacji między 0 i 1 w tę i z powrotem
go.animate("#model", "cursor", go.PLAYBACK_LOOP_PINGPONG, 1, go.EASING_INOUTQUAD, 3)

Funkcje po zakończeniu animacji

Animacje modelu (model.play_anim()) obsługują opcjonalną funkcję zwrotną Lua jako ostatni argument. Funkcja ta zostanie wywołana po zakończeniu animacji. Funkcja nigdy nie jest wywoływana dla animacji w pętli, więc takich, których tryby odtwarzania zaczynają się od: PLAYBACK_LOOP_*, ani w przypadku ręcznego anulowania animacji za pomocą go.cancel_animations(). Funkcję zwrotną można wykorzystać do wyzwalania zdarzeń po zakończeniu animacji (np. procesu zadania obrażeń po skończonej animacji ataku) lub do połączenia różnych animacji w serie, jedna za drugą. Przykłady:

local function wiggle_done(self, message_id, message, sender)
    -- Animacja skończona
end

function init(self)
    model.play_anim("#model", "wiggle", go.PLAYBACK_ONCE_FORWARD, nil, wiggle_done)
end

Tryby odtwarzania

Animacje można odtwarzać raz lub w pętli. Sposób odtwarzania animacji jest określany przez tryb odtwarzania (ang. Playback mode):

  • go.PLAYBACK_NONE
  • go.PLAYBACK_ONCE_FORWARD
  • go.PLAYBACK_ONCE_BACKWARD
  • go.PLAYBACK_ONCE_PINGPONG
  • go.PLAYBACK_LOOP_FORWARD
  • go.PLAYBACK_LOOP_BACKWARD
  • go.PLAYBACK_LOOP_PINGPONG