Transformaciones de animación esquelética 2D

8

He estado tratando de construir un sistema de animación esquelética 2D durante un tiempo, y creo que estoy bastante cerca de terminar. Actualmente, tengo las siguientes estructuras de datos:

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->xy Bone->yson las coordenadas del punto final del hueso. El punto de partida viene dado por (bone->parent->x, bone->parent->y)o (0, 0). Cada entidad en el juego tiene un Mesh, y Mesh->verticesse usa como el área límite para la entidad. Mesh->tex_coordsson coordenadas de textura En la función de actualización de la entidad, la posición de la Bonese utiliza para cambiar las coordenadas de la Verticesque está vinculada a ella. Actualmente lo que tengo es:

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;
    }
}

Creo que tengo todo lo que necesito, simplemente no sé cómo aplicar las transformaciones a las coordenadas de malla finales. ¿Qué transformaciones necesito aquí? ¿O mi enfoque está completamente equivocado?

Brad Zeis
fuente

Respuestas:

2

Creo que estaría buscando usar matrices de transformación aquí, aunque creo que necesita elaborar su función de actualización para adaptarse a esto. Pregúntese qué transformaciones necesita: ¿traducción, rotación?

        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];

A veces encuentro que poner algo en inglés simple ayuda. Lo anterior para, por ejemplo:

Para cada hueso, realice una (transformación) multiplicada por los pesos del hueso.

Pondría más en

  • ¿Estamos girando o traduciendo este hueso?
  • ¿El padre restringe este
    movimiento?

Las matrices son útiles para esto porque pueden funcionar a partir de una estructura como esta, ya que puede resolver la restricción a partir de la información del hueso primario y aplicarla al hueso secundario.

  • Realizar transformaciones basadas en preguntas anteriores

Esto puede ser una forma completamente incorrecta de las cosas, pero ciertamente es un tema para pensar.

Douglas Rae
fuente