glm来实现的mvp矩阵变换实现opengl渲染模型

glm库是很强大的数学矩阵库,这里就不介绍了,下面利用这个库来实现opengl的模型渲染。

上一篇从渲染过程来理解opengl坐标系和坐标变换投影讲过了,opengl渲染图像模型的过程,这篇主要讲解使用glm库来实现这个过程。这篇文章demo主要渲染一个地球和一个地面,然后旋转地球,移动相机等操作。

材料准备

1、渲染的模型的cube文件,里面存储的是地球的vertextPoints(vt),vertexTexturCoordinate(vc),vertexNormal(vn) 以及要绘制的每个面(面由点存成,f后面存储的是点的index)。

2、地球的纹理。

模型解析

# v点是点,vt是纹理映射点,vn 是点法向量点, 这些点只是存储点 ,重要的绘画主要是根据后面的f ,
# 由f数据,组成的index 和  上面对应的点来绘制,f 1/1/1 2/2/2 3/3/3, 表示的第一个面,由上面的第一、二、三个v、vt、vn来绘制
# 为了节约内存, v、vt、vn同时相同的点,如:
#f 1/1/1 2/2/2 3/3/3
#f 3/3/3 2/2/2 4/4/4
#我们只需要存储 一次2/2/2 3/3/3,然后绘图点存储的时候1,1,1;2,2,2;3,3,3;4,4,4 绘制的index则存储为1,2,3,3,2,4

#所以最终我们要给着色器的点是通过存储的1,1,1;2,2,2;3,3,3;4,4,4 获得上面的v、vt、vn值和 index1,2,3,3,2,4来获得的

解析模型的方法很简单,

1、读取出模型的数据,利用string的一些操作,取得所有的vt,vn,vc.

2、解析出face面的所有点,去除重复点,但存储的index不是去除,而是替换成以及存储的重复点的index。这里的一个点是 v/tv/tn index组成的。

3利用index 存储的 v/vt/tn的index 去 v、vt、vn中取出点的值.

渲染

构建M矩阵(设定模型世界坐标)

解析出模型后,我们要设置模型在世界坐标的位置。即生成M矩阵。就是将解析出来的模型平移,旋转、缩放,最终得到模型中各个点在世界坐标系中的位置。

    glm::mat4 modelMatrix;
    modelMatrix= glm::translate(modelMatrix,glm::vec3(2.0f,0.0f,0.0f));
	modelMatrix= glm::rotate(modelMatrix,45.f,glm::vec3(0.0f,1.0f,0.0f));
	modelMatrix= glm::scale(modelMatrix,glm::vec3(1.0f,2.0f,1.0f));
 

从上面的代码就可以看出modelMatrix 由平移、旋转、缩放的三个矩阵相乘而来,因此可以写成

  ModelMatrix=glm::translate(2.0f,0.0f,0.0f)*glm::rotate(modelMatrix,45.f,glm::vec3(0.0f,1.0f,0.0f))
                *glm::scale(1.0f,2.0f,1.0f);

node: 这里的平移,旋转都是相对与世界坐标系,非平面坐标系,因此,我们在做移动的时候要在世界坐标系上设计。

构建ViewMatrix

有了模型的坐标,现在要设定相机、视点的位置。

viewMatrix=glm::lookAt(glm::vec3(10.0f,10.0f,10.0f),glm::vec3(0.0f,0.0f,0.0f),glm::vec3(0.0f,1.0f,0.0f));

代码里的三个向量,分别代表的是相机的位置视点头顶向量(up vector)这里也是世界坐标系,由这三个点可以确定屏幕的坐标系,从而确定三位世界的点在屏幕坐标系的位置。这里的解释请看上一篇从渲染过程来理解opengl坐标系和坐标变换投影

构建projectionMatrix

将三位坐标转化为屏幕坐标后,就需要投影了,这里需要设定我们的视角、远平面到平面距离、近平面到平面距离、宽高比。

 projectionMatrix=glm::perspective(45.0f,(float)width/(float)height,0.1f,1000.0f);

有了这三个矩阵的变化后,我们就可以利用着色器将模型绘制到平面上了。

下面为定点着色器点的计算方法。

gl_Position=ProjectionMatrix*ViewMatrix*ModelMatrix*position;

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在QT中使用OpenGL渲染一个OBJ模型,可以按照以下步骤进行: 1. 创建一个QT项目,选择OpenGL窗口模板。 2. 在OpenGL窗口中初始化OpenGL和QT的集成,可以使用以下代码: ```c++ void GLWidget::initializeGL() { initializeOpenGLFunctions(); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_COLOR_MATERIAL); } void GLWidget::resizeGL(int w, int h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0, (double)w / (double)h, 0.01, 100.0); glMatrixMode(GL_MODELVIEW); } void GLWidget::paintGL() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0.0f, 0.0f, -5.0f); glRotatef(rotationX, 1.0, 0.0, 0.0); glRotatef(rotationY, 0.0, 1.0, 0.0); drawModel(); } ``` 3. 加载OBJ模型,并将其渲染OpenGL窗口中,可以使用以下代码: ```c++ void GLWidget::loadModel(QString filename) { model = glmReadOBJ(filename.toStdString().c_str()); glmUnitize(model); glmFacetNormals(model); glmVertexNormals(model, 90); } void GLWidget::drawModel() { if (model != NULL) { glmDraw(model, GLM_SMOOTH); } } ``` 4. 在QT的主窗口中添加一个QPushButton,点击按钮后调用loadModel()函数加载OBJ模型。 ```c++ void MainWindow::on_btnLoad_clicked() { QString filename = QFileDialog::getOpenFileName(this, tr("Open File"), ".", tr("OBJ Files (*.obj)")); if (!filename.isEmpty()) { ui->glWidget->loadModel(filename); } } ``` 5. 运行程序,点击按钮加载OBJ模型并在OpenGL窗口中显示。 以上就是在QT中使用OpenGL渲染OBJ模型的基本步骤,需要注意的是,这里使用了OpenGL Utility Toolkit(GLUT)和OpenGL Mathematics(GLM)库来帮助加载OBJ模型和进行矩阵变换等操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值