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
)是免费的。不管怎样,它们都被合并成一个矩阵。