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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangpengzp/article/details/88748471

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;

猜你喜欢

转载自blog.csdn.net/zhangpengzp/article/details/88748471