Chuyển đổi hoạt hình xương 2D


8

Tôi đã cố gắng xây dựng một hệ thống hoạt hình xương 2D trong một thời gian và tôi tin rằng tôi đã gần hoàn thành. Hiện tại, tôi có các cấu trúc dữ liệu sau:

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->xBone->ylà tọa độ của điểm cuối của Xương. Điểm bắt đầu được đưa ra bởi (bone->parent->x, bone->parent->y)hoặc (0, 0). Mỗi thực thể trong trò chơi có một MeshMesh->verticesđược sử dụng làm vùng giới hạn cho thực thể. Mesh->tex_coordslà tọa độ kết cấu. Trong chức năng cập nhật của thực thể, vị trí của Boneđược sử dụng để thay đổi tọa độ của Verticesliên kết với nó. Hiện tại những gì tôi có là:

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

Tôi nghĩ rằng tôi có mọi thứ tôi cần, tôi chỉ không biết cách áp dụng các phép biến đổi cho tọa độ lưới cuối cùng. Tôi cần gì ở đây? Hay là cách tiếp cận của tôi hoàn toàn sai?

Câu trả lời:


2

Tôi tin rằng bạn sẽ tìm cách sử dụng ma trận biến đổi ở đây, mặc dù tôi nghĩ rằng bạn cần phải xây dựng chức năng cập nhật của mình để phù hợp với điều này. Hãy tự hỏi bạn cần những biến đổi nào - dịch thuật, xoay vòng?

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

Tôi thấy đôi khi đặt một cái gì đó xuống bằng tiếng Anh đơn giản giúp. Trên đây ví dụ:

Đối với mỗi xương, thực hiện một (biến đổi) nhân với trọng lượng của xương.

Tôi sẽ đặt nhiều hơn vào

  • Chúng ta đang xoay hoặc dịch xương này?
  • Có phải cha mẹ hạn chế
    phong trào này ?

Ma trận thuận tiện cho việc này vì chúng có thể hoạt động theo cấu trúc như thế này ở chỗ bạn có thể tìm ra các ràng buộc từ thông tin của xương cha mẹ và áp dụng nó vào xương con.

  • Thực hiện chuyển đổi dựa trên các câu hỏi trước

Đây có thể là một cách hoàn toàn sai về mọi thứ, nhưng chắc chắn là thực phẩm cho suy nghĩ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.