Trasformazioni di animazione scheletrica 2D


8

Ho cercato di costruire un sistema di animazione scheletrica 2D per un po 'e credo di essere abbastanza vicino alla fine. Attualmente, ho le seguenti strutture di dati:

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->ysono le coordinate del punto finale dell'osso. Il punto di partenza è dato da (bone->parent->x, bone->parent->y)o (0, 0). Ogni entità nel gioco ha una Mesh, e Mesh->verticesviene utilizzata come area di delimitazione per l'entità. Mesh->tex_coordssono coordinate di trama. Nella funzione di aggiornamento dell'entità, la posizione di Boneviene utilizzata per modificare le coordinate di Verticesciò che è associato ad essa. Attualmente quello che ho è:

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

Penso di avere tutto ciò di cui ho bisogno, semplicemente non so come applicare le trasformazioni alle coordinate di mesh finali. Di quali trasformazioni ho bisogno qui? O il mio approccio è completamente sbagliato?

Risposte:


2

Credo che dovresti cercare di utilizzare le matrici di trasformazione qui, anche se penso che tu debba elaborare la tua funzione di aggiornamento per adattarti a questo. Chiediti quali trasformazioni ti servono: traduzione, rotazione?

        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 volte trovo che aiutare a scrivere qualcosa in inglese semplice. Quanto sopra per esempio:

Per ogni osso, eseguire una (trasformazione) moltiplicata per i pesi dell'osso.

Vorrei aggiungere di più

  • Stiamo ruotando o traducendo questo osso?
  • Il genitore limita questo
    movimento?

Le matrici sono utili per questo perché possono lavorare su una struttura come questa in quanto è possibile calcolare il vincolo dalle informazioni sull'osso genitore e applicarlo all'osso bambino.

  • Esegui la trasformazione in base a domande precedenti

Questo può essere un modo completamente sbagliato di cose, ma sicuramente spunti di riflessione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.