OpenGL投影,视图,模型矩阵

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

原因

三种矩阵在数学上的本质

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值