Transformações de animação esquelética 2D

8

Eu tenho tentado construir um sistema de animação esquelética 2D por um tempo, e acredito que estou quase terminando. Atualmente, tenho as seguintes estruturas de dados:

struct Bone {
    Bone *parent;
    int child_count;
    Bone **children;
    double x, y;
};

struct Vertex {
    double x, y;
    int bone_count;
    Bone **bones;
    double *weights;
};

struct Mesh {
    int vertex_count;
    Vertex **vertices;
    Vertex **tex_coords;
}

Bone->xe Bone->ysão as coordenadas do ponto final do osso. O ponto de partida é dado por (bone->parent->x, bone->parent->y)ou (0, 0). Cada entidade no jogo tem uma Meshe Mesh->verticesé usada como a área delimitadora da entidade. Mesh->tex_coordssão coordenadas de textura. Na função de atualização da entidade, a posição da Boneé usada para alterar as coordenadas das Verticesque estão vinculadas a ela. Atualmente o que tenho é:

void Mesh_update(Mesh *mesh) {
    int i, j;
    double sx, sy;

    for (i = 0; i < vertex_count; i++) {
        if (mesh->vertices[i]->bone_count == 0) {
            continue;
        }

        sx, sy = 0;
        for (j = 0; j < mesh->vertices[i]->bone_count; j++) {
            sx += (/* ??? */) * mesh->vertices[i]->weights[j];
            sy += (/* ??? */) * mesh->vertices[i]->weights[j];
        }

        mesh->vertices[i]->x = sx;
        mesh->vertices[i]->y = sy;
    }
}

Acho que tenho tudo o que preciso, simplesmente não sei como aplicar as transformações nas coordenadas finais da malha. Que transformações eu preciso aqui? Ou minha abordagem está completamente errada?

Brad Zeis
fonte

Respostas:

2

Acredito que você gostaria de usar matrizes de transformação aqui, embora eu ache que precise elaborar sua função de atualização para acomodar isso. Pergunte a si mesmo de que transformações você precisa - tradução, rotação?

        sx, sy = 0;
    for (j = 0; j < mesh->vertices[i]->bone_count; j++) {
        sx += (/* ??? */) * mesh->vertices[i]->weights[j];
        sy += (/* ??? */) * mesh->vertices[i]->weights[j];

Às vezes, acho que colocar algo em inglês simples ajuda. O acima para, por exemplo:

Para cada osso, execute uma (transformação) multiplicada pelos pesos do osso.

Eu colocaria mais

  • Estamos girando ou traduzindo esse osso?
  • Os pais restringem esse
    movimento?

As matrizes são úteis para isso, porque elas podem funcionar a partir de uma estrutura como essa, pois você pode calcular a restrição a partir das informações do osso pai e aplicá-la ao osso filho.

  • Realize a transformação com base nas perguntas anteriores

Esta pode ser uma maneira completamente errada sobre as coisas, mas certamente é uma boa ideia.

Douglas Rae
fonte