旋转对象及其'children'

Rotating an object and its 'children'

本文关键字:children 对象 旋转      更新时间:2023-10-16

现在我正在旋转一个对象,让我们称其为'主体',但附着在主体上是几个附件,当我旋转主体时,它们也应该旋转,但是现在他们没有。我不使用父母/子系统。主体具有一系列的附件,并将其绘制在主体绘制功能中。

绘制设备项目后,主体的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();
}

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

由于蒂姆,我注意到我的矩阵也没有传递到其他方面。当我终于理解他在说什么时,这很容易解决,所以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()来完成此工作。