如何在中心点旋转这组立方体?

问题描述 投票:0回答:1

我在3D平台上工作,其中有一个大平台和一个由多个立方体组成的角色。

但是,当我尝试旋转角色立方体的Y轴时,它不会在它们的中心点旋转它们。它们围绕平台整体围绕一个巨大的圆圈进行轨道运行。我猜我的glRotatef是错误的顺序,但我似乎无法弄清楚它们应该是什么顺序,使这组立方体只围绕它们的中心点旋转。

我绘制它们的代码是:

for (int i = 0; i < Models.size(); i++){ // theres only one model this has to go through that stores the group of cubes for the character
    glPushMatrix(); // set rotation for the whole group (I would expect...)
    glRotatef(Models.at(i)->ModelRotation.X,1,0,0);
    glRotatef(Models.at(i)->ModelRotation.Y,0,1,0);
    glRotatef(Models.at(i)->ModelRotation.Z,0,0,1);
    for (int j = 0; j < Models.at(i)->Parts.size(); j++) // For each cube in the character,
        Models.at(i)->Parts.at(j)->Render(); // draw the cube
    glPopMatrix();
}

Model是一个结构,它只有一个名为“ModelRotation”的vector3和一个名为“Parts”的法线向量,它存储了该角色的所有立方体。

我在多维数据集类中呈现多维数据集的功能是:

void Render(){
    glPushMatrix();
    glTranslatef(   Position.X,
                    Position.Y,
                    Position.Z
    );
    glColor3f(      Color.R,
                    Color.G,
                    Color.B
    );
    glScalef(       Size.X,
                    Size.Y,
                    Size.Z
    );

    // Render the front quad
    //glBindTexture(GL_TEXTURE_2D, Faces[0]);
    glBegin(GL_QUADS);
        glTexCoord2f(0, 0); glVertex3f(  1.0f, -1.0f, -1.0f );
        glTexCoord2f(1, 0); glVertex3f( -1.0f, -1.0f, -1.0f );
        glTexCoord2f(1, 1); glVertex3f( -1.0f,  1.0f, -1.0f );
        glTexCoord2f(0, 1); glVertex3f(  1.0f,  1.0f, -1.0f );
    glEnd();

    // Render the left quad
    //glBindTexture(GL_TEXTURE_2D, Faces[1]);
    glBegin(GL_QUADS);
        glTexCoord2f(0, 0); glVertex3f(  1.0f, -1.0f,  1.0f );
        glTexCoord2f(1, 0); glVertex3f(  1.0f, -1.0f, -1.0f );
        glTexCoord2f(1, 1); glVertex3f(  1.0f,  1.0f, -1.0f );
        glTexCoord2f(0, 1); glVertex3f(  1.0f,  1.0f,  1.0f );
    glEnd();

    // Render the back quad
    //glBindTexture(GL_TEXTURE_2D, Faces[2]);
    glBegin(GL_QUADS);
        glTexCoord2f(0, 0); glVertex3f( -1.0f, -1.0f,  1.0f );
        glTexCoord2f(1, 0); glVertex3f(  1.0f, -1.0f,  1.0f );
        glTexCoord2f(1, 1); glVertex3f(  1.0f,  1.0f,  1.0f );
        glTexCoord2f(0, 1); glVertex3f( -1.0f,  1.0f,  1.0f );
    glEnd();

    // Render the right quad
    //glBindTexture(GL_TEXTURE_2D, Faces[3]);
    glBegin(GL_QUADS);
        glTexCoord2f(0, 0); glVertex3f( -1.0f, -1.0f, -1.0f );
        glTexCoord2f(1, 0); glVertex3f( -1.0f, -1.0f,  1.0f );
        glTexCoord2f(1, 1); glVertex3f( -1.0f,  1.0f,  1.0f );
        glTexCoord2f(0, 1); glVertex3f( -1.0f,  1.0f, -1.0f );
    glEnd();

    // Render the top quad
    //glBindTexture(GL_TEXTURE_2D, Faces[4]);
    glBegin(GL_QUADS);
        glTexCoord2f(0, 1); glVertex3f( -1.0f,  1.0f, -1.0f );
        glTexCoord2f(0, 0); glVertex3f( -1.0f,  1.0f,  1.0f );
        glTexCoord2f(1, 0); glVertex3f(  1.0f,  1.0f,  1.0f );
        glTexCoord2f(1, 1); glVertex3f(  1.0f,  1.0f, -1.0f );
    glEnd();

    // Render the bottom quad
    //glBindTexture(GL_TEXTURE_2D, Faces[5]);
    glBegin(GL_QUADS);
        glTexCoord2f(0, 0); glVertex3f( -1.0f, -1.0f, -1.0f );
        glTexCoord2f(0, 1); glVertex3f( -1.0f, -1.0f,  1.0f );
        glTexCoord2f(1, 1); glVertex3f(  1.0f, -1.0f,  1.0f );
        glTexCoord2f(1, 0); glVertex3f(  1.0f, -1.0f, -1.0f );
    glEnd();
    glPopMatrix();
};

任何帮助将非常感谢。我猜这只是一个我无法拼凑的错误。如果需要,我会显示更多代码。

c++ opengl coordinate-transformation
1个回答
0
投票

OpenGL应用变换的方式是从PopMatrix()PushMatrix()之间的底部到顶部,这与您实际编码它们的方式相反。

在您的代码中,您调用的顺序如下所示:

Rotatef(); 
Translatef();
Scalef();

它应该是:

Translatef();
Rotatef();
Scalef();

换句话说,你想要总是最后翻译(意思是把它放在你的代码中作为PopMatrix()之后的第一行),除非你有充分的理由(特定的图形效果或场景渲染),所以你首先应用缩放和旋转变换,然后在世界坐标中平移对象。

对于旋转多部分对象(视情况而定),您应该翻译两次,如下所述:Rotating a multipart object

所以你的多维数据集类之外的代码可能是这样的:

for (int i = 0; i < Models.size(); i++){ 
    glPushMatrix(); 
    glTranslatef( 
        Models.at(i)->WorldPosition.X,
        Models.at(i)->WorldPosition.Y,
        Models.at(i)->WorldPosition.Z,
    );
    glRotatef(Models.at(i)->ModelRotation.X,1,0,0);
    glRotatef(Models.at(i)->ModelRotation.Y,0,1,0);
    glRotatef(Models.at(i)->ModelRotation.Z,0,0,1);
    for (int j = 0; j < Models.at(i)->Parts.size(); j++) 
        Models.at(i)->Parts.at(j)->Render(); // draw the cube
    glPopMatrix();
}
© www.soinside.com 2019 - 2024. All rights reserved.