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->x
y Bone->y
son 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->vertices
se usa como el área límite para la entidad. Mesh->tex_coords
son coordenadas de textura En la función de actualización de la entidad, la posición de la Bone
se utiliza para cambiar las coordenadas de la Vertices
que 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?
fuente