2Dスケルタルアニメーションの変換


8

しばらくの間、2Dスケルトンアニメーションシステムを構築しようとしていましたが、仕上げにかなり近づいていると思います。現在、私は以下のデータ構造を持っています:

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そしてBone->y骨の終点の座標です。開始点は(bone->parent->x, bone->parent->y)またはによって指定され(0, 0)ます。ゲームの各エンティティにはがありMeshMesh->verticesエンティティの境界領域として使用されます。Mesh->tex_coordsテクスチャ座標です。エンティティの更新関数では、の位置をBone使用しVerticesて、それにバインドされているの座標を変更します。現在私が持っているのは:

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

必要なものはすべて揃っていると思いますが、最終的なメッシュ座標に変換を適用する方法がわかりません。ここで必要な変換は何ですか?それとも私のアプローチは完全に間違っていますか?

回答:


2

ここでは変換行列の使用を検討していると思いますが、これに対応するために更新関数について詳しく説明する必要があると思います。必要な変換-変換、回転などを自問してみてください。

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

私は時々平易な英語で何かを下に置くことが役立つのを見つけます 上記の例:

各ボーンについて、ボーンのウェイトを掛けた(変換)を実行します。

私はもっ​​と入れます

  • この骨を回転させたり、平行移動させたりしていますか?
  • 親はこの
    動きを制限していますか?

マトリックスは、親ボーンの情報からコンストレイントを計算し、それを子ボーンに適用できるという点で、このような構造で機能するので便利です。

  • 以前の質問に基づいて変換を実行する

これは物事については完全に間違った方法かもしれませんが、確かに思考の糧です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.