m_projection.setToIdentity();
m_projection.perspective(60, (float)w / h, 0.001, 1000);
人眼在头部不动的情况下,视野大概为60°。所以我们使用60这个值来模拟人眼看到的透视结果。
注意:这里的角度是指纵向视野的角度,横向视野并不进行限制,你的窗口越宽,看到的内容就会越多,但是靠近边缘的部分,变形也会越严重。
它的第二个参数就是你的窗口的横纵比了,记得转化为float再运算,第三和第四个参数表示距离你的摄像机多近和多远范围内的物体要被显示。超出这个范围的物体将无法被显示。
矩阵的重复使用问题
不同的物体要进行不同的矩阵变换时,不能使用同一个全局矩阵变量(同一个局部可以),不能通过试图改变矩阵的值来实现同一个矩阵对不同物体的矩阵变换,不同物体的矩阵变换必须使用不同的矩阵,即使是同一种类型的矩阵也要重新创建。
错误 eg:
void OpenGLWidget::paintGL()
{
glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
//第一个物体想要放于中心点
object_shader_.bind();
object_shader_.setUniformValue("projection",projection_);
object_shader_.setUniformValue("view",view_);
object_shader_.setUniformValue("model",model_);
object_shader_.setUniformValue("objectColor",1.0f, 0.5f, 0.31f);
object_shader_.setUniformValue("lightColor",1.0,1.0,1.0);
object_VAO_->bind();
for(int i=0;i<6;++i)
glDrawArrays(GL_TRIANGLE_FAN,4*i,4);
object_VAO_->release();
object_shader_.release();
//第二个物体移动,伸缩
model_.translate(lightPos_);
model_.scale(0.3);
light_shader_.bind();//先绑定,再使用
light_shader_.setUniformValue("projection",projection_);
light_shader_.setUniformValue("view",view_);
light_shader_.setUniformValue("model",model_);
light_VAO_->bind();
for(int i=0;i<6;++i)
glDrawArrays(GL_TRIANGLE_FAN,4*i,4);
light_VAO_->release();
light_shader_.release();
}
结果:
正确eg1:
void OpenGLWidget::paintGL()
{
glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
QMatrix4x4 model_object_;//第一个物体的model
object_shader_.bind();
object_shader_.setUniformValue("projection",projection_);
object_shader_.setUniformValue("view",view_);
object_shader_.setUniformValue("model",model_object_);
object_shader_.setUniformValue("objectColor",1.0f, 0.5f, 0.31f);
object_shader_.setUniformValue("lightColor",1.0,1.0,1.0);
object_VAO_->bind();
for(int i=0;i<6;++i)
glDrawArrays(GL_TRIANGLE_FAN,4*i,4);
object_VAO_->release();
object_shader_.release();
QMatrix4x4 model_light_;//第二个物体的model
model_light_.translate(lightPos_);
model_light_.scale(0.3);
light_shader_.bind();//先绑定,再使用
light_shader_.setUniformValue("projection",projection_);
light_shader_.setUniformValue("view",view_);
light_shader_.setUniformValue("model",model_light_);
light_VAO_->bind();
for(int i=0;i<6;++i)
glDrawArrays(GL_TRIANGLE_FAN,4*i,4);
light_VAO_->release();
light_shader_.release();
}
结果:
正确eg2:
void OpenGLWidget::paintGL()
{
glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
QMatrix4x4 model_object_;//第一个物体的model
object_shader_.bind();
object_shader_.setUniformValue("projection",projection_);
object_shader_.setUniformValue("view",view_);
object_shader_.setUniformValue("model",model_object_);
object_shader_.setUniformValue("objectColor",1.0f, 0.5f, 0.31f);
object_shader_.setUniformValue("lightColor",1.0,1.0,1.0);
object_VAO_->bind();
for(int i=0;i<6;++i)
glDrawArrays(GL_TRIANGLE_FAN,4*i,4);
object_VAO_->release();
object_shader_.release();
//QMatrix4x4 model_light_;//不需要第二个物体的model
model_light_.translate(lightPos_);
model_light_.scale(0.3);
light_shader_.bind();//先绑定,再使用
light_shader_.setUniformValue("projection",projection_);
light_shader_.setUniformValue("view",view_);
light_shader_.setUniformValue("model",model_light_);
light_VAO_->bind();
for(int i=0;i<6;++i)
glDrawArrays(GL_TRIANGLE_FAN,4*i,4);
light_VAO_->release();
light_shader_.release();
}