0

今、私はオブジェクトを回転させています。それを「mainBody」と呼びましょう。しかし、mainBody にはいくつかのアタッチメントが取り付けられています。私は親子システムを使用していません。本体には添付ファイルの配列があり、mainBody 描画関数でそれらを描画します。

本体からの glPopMatrix() は、装備アイテムが描画された後に実行されます。

過去に pushMatrix(); を使用してこれを行うことができたことは知っています。および popMatrix(); しかし、今はうまくいかないようです。

私は c++、opengl、および glm を使用しています。

ここに私が今持っているものを示すいくつかのコードがあります:

{

    setupStartModelMatrix(); //<---- Has glPushMatrix();
    setupModelviewMatrix();  //<--- has all the gml stuff
    drawMainBody();

    }

    if(mNumberOfEquipementOwned != 0)

    {
        for(int i = 0; i < mNumberOfEquipementOwned; i++)
        {
            //obj is retrieved with a function 
            obj->render();
        }
    }

    setupEndModelMatrix();  // <--- Has glPopMatrix(); 
}

そしてglmコード

void GameObject::setupModelviewMatrix()
{
    glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.f);

    glm::mat4 Model = glm::scale( glm::mat4(1.0f), glm::vec3(1.0f)); 
    glm::mat4 ViewTranslate = glm::translate( glm::mat4(1.0f), glm::vec3(mPosition.x, mPosition.y, mPosition.z)); 
    glm::mat4 ViewRotateX = glm::rotate( ViewTranslate, mRotation.x, glm::vec3(1.0f, 0.0f, 0.0f));
    glm::mat4 ViewRotateY = glm::rotate( ViewRotateX, mRotation.y, glm::vec3(0.0f, 1.0f, 0.0f));
    glm::mat4 View = glm::rotate( ViewRotateY, mRotation.z, glm::vec3(0.0f, 0.0f, 1.0f)); 

    glm::mat4 MVP = View * Model;

    glUniformMatrix4fv( 0, 1, GL_FALSE, glm::value_ptr(MVP)); 

    glLoadMatrixf(glm::value_ptr(MVP));
}

そして描画装置コード

void Gun::render()
{
    glPushMatrix();
    setupModelviewMatrix();
    mMesh->render();
    glPopMatrix();
}
4

2 に答える 2

2

私の推測では、 を呼び出しglPushMatrix()、回転し、本体をglPopMatrix()描画し、 を呼び出して、添付ファイルを描画していると思います。これが当てはまる場合はglPopMatrix()、添付ファイルを描画した後に呼び出しを移動します。

于 2012-10-17T13:45:49.840 に答える
1

Tim のおかげで、私のマトリックスが他のマトリックスにも渡されていないことに気付きました。彼の言っていることがようやく理解できたとき、それは簡単な修正だったので、小道具の 100% が彼に渡されました。

必要な人のためのコードです。

{
    glm::mat4 startingModel(1.0);

    setupStartModelMatrix();
    startingModel = continuedModelvieuwMatrix(startingModel);
    drawMainBody();
    }

    if(mNumberOfEquipementOwned != 0)
    {
        for(int i = 0; i < mNumberOfEquipementOwned; i++)
        {
            //obj is retrieved with a function 
            obj->render(startingModel);
        }
    }

    setupEndModelMatrix();  // <--- Has glPopMatrix(); 
}

そしてglmコード

glm::mat4 GameObject::continuedModelvieuwMatrix(glm::mat4 startingModel)
{
    glm::mat4 Model = glm::scale( glm::mat4(1.0f), glm::vec3(1.0f)); 
    glm::mat4 ViewTranslate = glm::translate( startingModel, glm::vec3(mPosition.x, mPosition.y, mPosition.z)); 
    glm::mat4 ViewRotateX = glm::rotate( ViewTranslate, mRotation.x, glm::vec3(1.0f, 0.0f, 0.0f));
    glm::mat4 ViewRotateY = glm::rotate( ViewRotateX, mRotation.y, glm::vec3(0.0f, 1.0f, 0.0f));
    glm::mat4 View = glm::rotate( ViewRotateY, mRotation.z, glm::vec3(0.0f, 0.0f, 1.0f)); 

    glm::mat4 MVP = View * Model;

    glUniformMatrix4fv( 0, 1, GL_FALSE, glm::value_ptr(MVP)); 

    glLoadMatrixf(glm::value_ptr(MVP));

    return MVP;
}

void GameObject::setupStartModelMatrix()
{
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

そして描画装置コード

void Gun::render(glm::mat4 startingModel)
{
    glm::math4 tempModel;
    tempModel = continuedModelvieuwMatrix(startingModel);
    mMesh->render();
}

そしてそれはそれについてです。オブジェクトの構築のために別の方法で自分で修正する必要があったため、このコードが機能するかどうかは100%わかりませんが、少なくとも同じ問題を抱えている人にとっては良いスタートが切れるはずです。

また、これを機能させるために glPopMatrix() または glPushMatrix() は必要ありません。

于 2012-10-17T21:18:43.940 に答える