Autor Wątek: Animacja szkieletowa - od zera  (Przeczytany 3722 razy)

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Lipiec 10, 2010, 01:55:13
Pose::Compile odpalam raz czy co klatkę? Bo czegoś nie rozumiem. Nawet jeśli będę miał gotowe spięte macierze A to nie mogę ich tak po prostu wrzucić do shadera. Muszę znaleźć macierz pośrednią między SpiętaAPose1 a SpiętaAPose2 i dopiero wtedy wrzucać to do shadera. Mógłbyś doprecyzować czy Pose to są po prostu klatki kluczowe animacji u ciebie?
Pose w tym wydaniu to jest dowolna klatka. Trzymasz w tym klatki kluczowe, interpolujesz (Pose::Lerp(Pose &a,Pose &b,float factor)), a jak już wyznaczysz aktualną pozycję, to robisz na niej compile. Robisz to dla każdego obiektu raz na klatkę, ale trzymasz, żeby móc reusować ten wynik w różnych przebiegach (shadowmapy, itp). Samych macierzy nie interpolujesz nigdy, bo wyjdą głupoty. :)

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Avaj

  • Użytkownik

# Lipiec 10, 2010, 12:04:19
Dobra, jakoś się udało ^^
    void update(float deltaTime)
    {
        timer += deltaTime*0.005;
        if (timer>1.00) timer = 1.00;

        Pose& p1 = keyframes[0].pose;
        Pose& p2 = keyframes[1].pose;

        mat4 boneTransform;
        quat currentRotation;
        vec3 currentPos;
        for (int bone=0;bone<header.bones;bone++)
        {
            currentPos = currentPos + mat3_cast(currentRotation)* mix(p1.translations[bone], p2.translations[bone], timer);
            currentRotation = cross(currentRotation, mix(p1.rotations[bone], p2.rotations[bone], timer));

            mat4 boneTransform = mat4_cast(currentRotation);
            boneTransform[3][0] = currentPos.x;
            boneTransform[3][1] = currentPos.y;
            boneTransform[3][2] = currentPos.z;

            boneMatrices[bone] = boneTransform * bones[bone].B;
        }
    }

zjechałem do n mnożeń. Teraz mogę się za skinning brać :P