5-3 代码实现3D效果

本节程序 下载(面)
本节程序 下载(立方体)

1.顶点着色器,三个重要矩阵

#version 330 core
layout(location=1) in vec3 aPos;
layout(location=2) in vec2 aTextureCoord;

out vec2 texcoord;

uniform mat4x4 model;
uniform mat4x4 view;
uniform mat4x4 perspective;

void main()
{
  gl_Position =perspective*view*model * vec4(aPos.x,aPos.y,aPos.z,1.0f);
  texcoord = aTextureCoord;
};

V c l i p = M p r o j e c t i o n ∗ M v i e w ∗ M m o d e l ∗ V l o c a l V _{clip} = M _{projection} * M _{view} * M _{model} *V _{local} Vclip=MprojectionMviewMmodelVlocal
gl_Position =perspectiveviewmodel * vec4(aPos.x,aPos.y,aPos.z,1.0f);

2.在 CPU端设置三个重要矩阵

    QMatrix4x4 matModel;
    QMatrix4x4 matView;
    QMatrix4x4 matPerspective;


    matModel.rotate(-45,1.0f,0.0f,0.0f); //绕着x轴转-45度   
    matView.translate(0.f,0.f,-3.f); // 把视图点放下去
    matPerspective.perspective(-45,width()*1.0/height(),0.1f,100.f); // 准备投影矩阵

	program.setUniformValue("model",matModel);
    program.setUniformValue("view",matView);
    program.setUniformValue("perspective",matPerspective);

3 绘制立方体

  1. 坐标

float va = 1.0f;
float vertices[] = {
    //坐标          texture coord
    //正面
    va,va,va,     1.0f,1.0f,       //右上
    va,-va,va,    1.0f,0.0f,    //右下
    -va,-va,va,   0.f, 0.f,     //左下
    -va,va,va,    0.f, 1.0f,    //左上

    //后面
    va,va,-va,     1.0f,1.0f,  //右上
    va,-va,-va,    1.0f,0.0f,    //右下
    -va,-va,-va,   0.f, 0.f,   //左下
    -va,va,-va,    0.f, 1.0f,  //左上

    //右面
    va,va,-va,     1.0f,1.0f, //后上
    va,-va,-va,    1.0f,0.0f, //后下
    va,-va,va,   0.f, 0.f,   //前下
    va,va,va,    0.f, 1.0f,  //前上


    //左面
    -va,va,-va,     1.0f,1.0f,//后上
    -va,-va,-va,    1.0f,0.0f, //后下
    -va,-va,va,   0.f, 0.f,   //前下
    -va,va,va,    0.f, 1.0f,  //前上

    //上面
    va,va,-va,    1.0f,1.0f,   //右后
    va,va,va,     1.0f,0.0f,  //右前
    -va,va,va,    0.f, 0.f,      //左前
    -va,va,-va,   0.f, 1.0f,  //左后

    //下面
    va,-va,-va,    1.0f,1.0f,   //右后
    va,-va,va,     1.0f,0.0f,  //右前
    -va,-va,va,    0.f, 0.f,     //左前
    -va,-va,-va,    0.f, 1.0f //左后
};

unsigned int indices[]=
{
    //前面 0 1 2 3
    0,1,3,
    1,2,3,

    //后面  4 5 6 7
    4,5,7,
    5,6,7,

    //右面  8 9 10 11
    8,9,11,
    9,10,11,

    //左面  12 13 14 15
    12,13,15,
    13,14,15,

    //上面  16 17 18 19
    16,17,19,
    17,18,19,

    //下面  20 21 22 23
    20,21,23,
    21,22,23,
};
  1. VAO
       glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,5*sizeof(float),(void*)0);
       glVertexAttribPointer(2,2,GL_FLOAT,GL_FALSE,5*sizeof(float),(void*)(3*sizeof(float)));

3.绘制

    glEnable(GL_DEPTH_TEST);
    glClearColor(0.f,1.0f,1.0f,1.0f);
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    textureWall->bind(0);
    textureLe->bind(1);
    textureSmall->bind(2);

    program.bind();
    program.setUniformValue("ourTexture1",0);
    program.setUniformValue("ourTexture2",1);
    program.setUniformValue("ourTexture3",2);

    program.setUniformValue("model",matModel);
    program.setUniformValue("view",matView);
    program.setUniformValue("perspective",matPerspective);

    glBindVertexArray(VAO);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,EBO);

    glDrawElements(GL_TRIANGLES,sizeof(indices),GL_UNSIGNED_INT,0);

NDC标准设备坐标时左手坐标.
但是:投影矩阵交换了左右手, openGL是右手

4. view (相机) -换基底概念

  1. 基底坐标系= 就是把别人放在以我为中心的坐标系
  2. 相机:
    相机:下面红色手动绘制坐标系.
    把世界坐标系 放在相机坐标系下z=-3的位置.
    view = 换了个基底,换成了相机的坐标系
    在这里插入图片描述
    代码: matView.translate(0.f,0.f,-3.f); // 把视图点放下去
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值