旋转物体及其“儿童”

时间:2012-10-17 13:42:25

标签: c++ opengl glm-math

现在我正在旋转一个物体,我们称它为'mainBody',但附加到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();
}

2 个答案:

答案 0 :(得分:2)

我的猜测是你正在呼叫glPushMatrix(),旋转,绘制主体,调用glPopMatrix(),然后绘制附件。如果是这样,请在绘制附件后将glPopMatrix()调用移至。

答案 1 :(得分:1)

因为蒂姆,我注意到我的矩阵也没有通过其他人。当我终于明白他说的是一个简单的解决方案,所以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();
}

就是这样。 我不是百分之百确定这段代码是否有效,因为我必须以不同的方式为自己修复它,因为我的对象构造,但这对于任何有同样问题的人来说至少应该是一个良好的开端。

此外,还不需要glPopMatrix()或glPushMatrix()来完成这项工作。