Transformasi Animasi Kerangka 2D

8

Saya telah mencoba untuk membangun sistem animasi kerangka 2D untuk sementara waktu, dan saya percaya bahwa saya sudah hampir selesai. Saat ini, saya memiliki struktur data berikut:

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->xdan Bone->ymerupakan koordinat titik akhir Tulang. Titik awal diberikan oleh (bone->parent->x, bone->parent->y)atau (0, 0). Setiap entitas dalam permainan memiliki Mesh, dan Mesh->verticesdigunakan sebagai area pembatas untuk entitas. Mesh->tex_coordsadalah koordinat tekstur. Dalam fungsi pembaruan entitas, posisi Bonedigunakan untuk mengubah koordinat Verticesyang terikat padanya. Saat ini yang saya miliki adalah:

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

Saya pikir saya memiliki semua yang saya butuhkan, saya hanya tidak tahu bagaimana menerapkan transformasi ke koordinat mesh akhir. Tranformasi apa yang saya butuhkan di sini? Atau apakah pendekatan saya benar-benar salah?

Brad Zeis
sumber

Jawaban:

2

Saya percaya Anda akan mencari untuk menggunakan matriks transformasi di sini, meskipun saya pikir Anda perlu menguraikan fungsi pembaruan Anda untuk mengakomodasi ini. Tanyakan pada diri sendiri transformasi apa yang Anda butuhkan - terjemahan, rotasi?

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

Saya menemukan kadang-kadang meletakkan sesuatu dalam bahasa Inggris membantu. Di atas untuk misalnya:

Untuk setiap tulang, lakukan (transformasi) dikalikan dengan bobot tulang.

Saya akan memasukkan lebih banyak

  • Apakah kita memutar atau menerjemahkan tulang ini?
  • Apakah orang tua membatasi
    gerakan ini ?

Matriks berguna untuk ini karena mereka dapat bekerja dari struktur seperti ini di mana Anda dapat mengatasi kendala dari informasi tulang induk dan menerapkannya pada tulang anak.

  • Lakukan transformasi berdasarkan pertanyaan sebelumnya

Ini mungkin cara yang benar-benar salah tentang banyak hal, tetapi tentu saja makanan untuk dipikirkan.

Douglas Rae
sumber