【问题标题】:why the drawn model is not centered in the screen为什么绘制的模型不在屏幕中心
【发布时间】:2014-09-26 00:57:23
【问题描述】:

我正在加载一个Obj model 并尝试像这样绘制它:

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();
    }
}

但我看不到它,因为它不在屏幕中心,我知道我可以translate 它的坐标,但我希望它在中心显示模型而不翻译这怎么可能?

【问题讨论】:

  • DrawModel 到底是什么意思?
  • @LittleHelper 我已经用DrawModel 函数更新了这个问题。
  • 您的模型是否设计为中心在 (0,0,0)?
  • 大部分情况下,奇怪的变换(如glTranslatef)在这里和那里都是免费的。无论如何,它们都会组合成一个矩阵。

标签: c++ opengl translate-animation


【解决方案1】:

尝试gluLookAt() 放置“相机”并告诉它在哪里看。

您总是翻译模型以使它们在屏幕上可见,因为只有在单位立方体中渲染的几何图形才会被绘制到屏幕上。使用 gluLookAt() 和 gluPerspective() 仅生成拟合矩阵以将定义的平截头体中的几何图形转换为单位立方体。

看来您正在学习 OpenGL。如果是这种情况,我建议不要使用 glBegin(GL_TRIANGLES) 等学习旧的 (=3.0) OpenGL 版本。首先,我可以推荐这个网站:OpenGL Tutorials

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-03
    相关资源
    最近更新 更多