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?

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.