我在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();
};
任何帮助将非常感谢。我猜这只是一个我无法拼凑的错误。如果需要,我会显示更多代码。
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();
}