0

私は最近、C++ OpenGL でアニメーションをレンダリングできるモデルをインポートするための「Assimp」というライブラリがあることを知りました。今、テクスチャ モデルをロードして描画するために何をしなければならないかを理解しようとしています。 ...

1) Blender からアニメーションをエクスポートするには、どの形式が推奨されますか?

2) モデルを描画する基本的なメッシュ クラスが既にあります。アニメーションをサポートするには、何を変更する必要がありますか?

私のデータ構造:

struct ObjectData {
    vector <glm::vec3> vertices, normals, colors;
    vector <glm::vec2> texCoords;
    vector <GLuint> vIndices, uIndices, nIndices;
    vector <Material*> materials;
    glm::vec3 size, center;
};

私のメッシュ VBO と描画:

void Mesh::draw() {
    if (initialized) {
        shader->enable(true);

        if (texture != NULL) {
            texture->enable(true);
        }

        //Tell OpenGL which array to use
        glBindVertexArray(arrayObject);

        glDrawElements(renderMode, object->vIndices.size(), GL_UNSIGNED_INT, 0);

        glBindVertexArray(NULL);
        shader->enable(false);

        if (texture != NULL) {
            texture->enable(false);
        }
    }
}

void Mesh::updateVBO() {
    if (!initialized) {
        glGenVertexArrays(1, &arrayObject);
    }

    //Tell OpenGL which vertex array to use from now
    glBindVertexArray(arrayObject);

    if (!initialized) {
        glGenBuffers(VBO_COUNT, buffers);
        initialized = true;
    }

    //Set buffer data
    glBindBuffer(GL_ARRAY_BUFFER, buffers[VBO_VERTEX]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec3) * object->vertices.size(), &object->vertices.front(), GL_STATIC_DRAW);

    //Set shader attribute data
    glEnableVertexAttribArray(VBO_VERTEX);
    glVertexAttribPointer(VBO_VERTEX, 3, GL_FLOAT, GL_FALSE, NULL, NULL);

    if (object->colors.size()) {
        //Set buffer data
        glBindBuffer(GL_ARRAY_BUFFER, buffers[VBO_COLOR]);
        glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec3) * object->colors.size(), &object->colors.front(), GL_STATIC_DRAW);

        //Set shader attribute data
        glEnableVertexAttribArray(VBO_COLOR);
        glVertexAttribPointer(VBO_COLOR, 3, GL_FLOAT, GL_FALSE, NULL, NULL);
    }

    if (object->texCoords.size()) {
        //Set buffer data
        glBindBuffer(GL_ARRAY_BUFFER, buffers[VBO_TEXCORD]);
        glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec2) * object->texCoords.size(), &object->texCoords.front(), GL_STATIC_DRAW);

        //Set shader attribute data
        glEnableVertexAttribArray(VBO_TEXCORD);
        glVertexAttribPointer(VBO_TEXCORD, 2, GL_FLOAT, GL_FALSE, NULL, NULL);
    }

    if (object->normals.size()) {
        //Set buffer data
        glBindBuffer(GL_ARRAY_BUFFER, buffers[VBO_NORMAL]);
        glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec3) * object->normals.size(), &object->normals.front(), GL_STATIC_DRAW);

        //Set shader attribute data
        glEnableVertexAttribArray(VBO_NORMAL);
        glVertexAttribPointer(VBO_NORMAL, 3, GL_FLOAT, GL_FALSE, NULL, NULL);
    }

    //Set buffer data
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[VBO_INDEX]);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint) * object->vIndices.size(), &object->vIndices.front(), GL_STATIC_DRAW);

    //Unbind vertex array
    glBindVertexArray(NULL);
}
4

1 に答える 1

5

「オープン アセット インポート ライブラリ」にはモデル ビューアーがあり、サポートされているすべての形式 (アニメーションを含む) でモデルをプレビューできます。アニメーションをさまざまな形式にエクスポートし、それらのいずれかが間違った結果 (レンダリング アーティファクト) をもたらすかどうかを確認し、独自の awnser を終了することをお勧めします。個人的には、3ds Max を使用しましたが、Collada (.dae) が最も成功しました。

アニメーション自体をサポートするには (推定骨格): キー フレーム間のアニメーション データ (aiNodeAnim) を補間します。補間されたアニメーション データからボーン マトリックスを計算する必要があります (位置/回転などからマトリックスを作成します)。「頂点」(aiMesh/aiBone) をそれらに影響を与えるボーン マトリックスで変換することにより、「アニメーション化された」頂点を計算します。すべての「アニメーション化された頂点」に重みを付けて合計します。新しい頂点をレンダリングします。そして、これはアニメーションの基本的な概要です。

主題をより深く理解できるチュートリアルや本があります。たとえば、ogldev のチュートリアル 38Jason Gregory の Game Engine Architechtureには専用のアニメーションの章があります。assimpsモデルビューアのソースコードをご覧いただけます。

于 2014-04-23T06:16:37.323 に答える