C++ 为什么绘制的模型未在屏幕中居中

C++ 为什么绘制的模型未在屏幕中居中,c++,opengl,translate-animation,C++,Opengl,Translate Animation,我正在加载一个Obj模型,并尝试如下所示: void Game::Update() { glViewport(0, 0, 800, 600); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClearColor(Color::CornflowerBlue.R, Color::CornflowerBlue

我正在加载一个
Obj模型
,并尝试如下所示:

void Game::Update()
{
    glViewport(0, 0, 800, 600);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glClearColor(Color::CornflowerBlue.R, Color::CornflowerBlue.G, Color::CornflowerBlue.B, Color::CornflowerBlue.A);
    gluPerspective(45.0, 800.0 / 600.0, 1.0, 1000.0);



    DrawModel(model);
}

void DrawModel(const Model &model)
{
    for (size_t i = 0; i < model.Faces.size(); i++)
    {
        if (model.Materials.size() > 0)
        {
            float diffuse[] = { model.Materials[model.Faces[i].Material].Diffuse[0], model.Materials[model.Faces[i].Material].Diffuse[1], model.Materials[model.Faces[i].Material].Diffuse[2], 1.0 };
            float ambient[] = { model.Materials[model.Faces[i].Material].Ambient[0], model.Materials[model.Faces[i].Material].Ambient[1], model.Materials[model.Faces[i].Material].Ambient[2], 1.0 };
            float specular[] = { model.Materials[model.Faces[i].Material].Specular[0], model.Materials[model.Faces[i].Material].Specular[1], model.Materials[model.Faces[i].Material].Specular[2], 1.0 };
            glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse);
            glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);
            glMaterialfv(GL_FRONT, GL_SPECULAR, specular);
            glMaterialf(GL_FRONT, GL_SHININESS, model.Materials[model.Faces[i].Material].Ns);
            glColor3f(diffuse[0], diffuse[1], diffuse[2]);
        }

        int loop = 3;
        if (model.Faces[i].IsQuad){
            loop = 4;
            glBegin(GL_QUADS);
        }
        else
            glBegin(GL_TRIANGLES);

        if (model.NormalVertices.size() > 0)
            glNormal3f(model.NormalVertices.at(model.Faces[i].Index).X, model.NormalVertices.at(model.Faces[i].Index).Y, model.NormalVertices.at(model.Faces[i].Index).Z);
        for (int j = 0; j < loop; j++)
        {
            //TODO TEXTURE:
            if (model.Vertices.size() > 0)
                glVertex3f(model.Vertices[model.Faces[i].VerticesIndex[j]].X, model.Vertices[model.Faces[i].VerticesIndex[j]].Y, model.Vertices[model.Faces[i].VerticesIndex[j]].Z);
        }

        glEnd();
    }
}
void Game::Update()
{
glViewport(0,080600);
glMatrixMode(GL_投影);
glLoadIdentity();
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glClearColor(颜色:矢车菊蓝.R,颜色:矢车菊蓝.G,颜色:矢车菊蓝.B,颜色:矢车菊蓝.A);
gluPerspective(45.0800.0/600.0,1.01000.0);
模型;
}
孔隙模型(常数模型和模型)
{
对于(size_t i=0;i0)
{
浮动漫反射[]={model.Materials[model.Faces[i].Material].diffuse[0],model.Materials[model.Faces[i].Material].diffuse[1],model.Materials[model.Faces[i].Material].diffuse[2],1.0};
浮动环境光[]={model.Materials[model.Faces[i].Material].ambient[0],model.Materials[model.Faces[i].Material].ambient[1],model.Materials[model.Faces[i].Material].ambient[2],1.0};
浮动镜面反射[]={model.Materials[model.Faces[i].Material].specular[0],model.Materials[model.Faces[i].Material].specular[1],model.Materials[model.Faces[i].Material],镜面反射[2],1.0};
GLMATERIALV(GL_前部、GL_漫反射、漫反射);
GLMATERIALV(GL_前部、GL_环境、环境);
GLMATERIALV(GL_前部、GL_镜面反射、镜面反射);
glMaterialf(GL_-FRONT,GL_-shiness,model.Materials[model.Faces[i].Material].Ns);
glColor3f(漫反射[0],漫反射[1],漫反射[2]);
}
int循环=3;
if(model.Faces[i].IsQuad){
循环=4;
glBegin(GL_QUADS);
}
其他的
glBegin(GL_三角形);
if(model.NormalVertices.size()>0)
glNormal3f(model.NormalVertices.at(model.Faces[i].Index).X,model.NormalVertices.at(model.Faces[i].Index).Y,model.NormalVertices.at(model.Faces[i].Index).Z);
对于(int j=0;j0)
glVertex3f(model.Vertices[model.Faces[i].VerticesIndex[j]].X,model.Vertices[model.Faces[i].VerticesIndex[j].Y,model.VerticesIndex[model.Faces[i].VerticesIndex[j].Z);
}
格伦德();
}
}
但是我看不到它,因为它不在屏幕中央,我知道我可以翻译它的坐标,但是我想让它在中间显示模型,而不翻译它怎么可能

试着把“相机”放好,告诉它看哪里

始终转换模型以使其在屏幕上可见,因为只有在单位立方体中渲染的几何体才能绘制到屏幕上。使用gluLookAt()和gluPerspective()仅生成拟合矩阵,以将定义的平截头体中的几何体转换为单位立方体


看起来您正在学习OpenGL。如果是这样的话,我建议不要立即学习旧的(=3.0)OpenGL版本,以及VertexArrayObjects等。首先,我可以推荐这个网站:

那么
DrawModel
到底是什么呢?@littlehalper我已经用
DrawModel
功能更新了这个问题。你的模型设计的中心是(0,0,0)吗?在大多数情况下,奇数变换(比如
glTranslatef
)是免费的。不管怎样,它们都被合并成一个矩阵。