首先要用到glm库。在进行PVM变换时可以帮助我们方便地运算。
下载:https://github.com/g-truc/glm/tags

首先是处理顶点数据,由于是一个正方体,有六个面,每个面两个三角形,一共36个点。输入顶点有顶点坐标和顶点的颜色值。这里的坐标是处在模型空间的坐标。

const float vertices[] = {                  //立方体数组-0.5f, -0.5f, -0.5f, 1.0f,0.0f,0.0f,    //六个面,每个面两个三角形。0.5f, -0.5f, -0.5f,  1.0f,0.0f,0.0f,    //每一行前三个为顶点的坐标,0.5f,  0.5f, -0.5f,  1.0f,0.0f,0.0f,    //后三个值为顶点颜色值0.5f,  0.5f, -0.5f,  1.0f,0.0f,0.0f,-0.5f,  0.5f, -0.5f,  1.0f,0.0f,0.0f,-0.5f, -0.5f, -0.5f,  1.0f,0.0f,0.0f,-0.5f, -0.5f,  0.5f,  0.0f,1.0f,0.0f,0.5f, -0.5f,  0.5f,  0.0f,1.0f,0.0f,0.5f,  0.5f,  0.5f,  0.0f,1.0f,0.0f,0.5f,  0.5f,  0.5f,  0.0f,1.0f,0.0f,-0.5f,  0.5f,  0.5f,  0.0f,1.0f,0.0f,-0.5f, -0.5f,  0.5f,  0.0f,1.0f,0.0f,-0.5f,  0.5f,  0.5f,  0.0f,0.0f,1.0f,-0.5f,  0.5f, -0.5f,  0.0f,0.0f,1.0f,-0.5f, -0.5f, -0.5f,  0.0f,0.0f,1.0f,-0.5f, -0.5f, -0.5f,  0.0f,0.0f,1.0f,-0.5f, -0.5f,  0.5f,  0.0f,0.0f,1.0f,-0.5f,  0.5f,  0.5f,  0.0f,0.0f,1.0f,0.5f,  0.5f,  0.5f,  0.5f,0.0f,0.0f,0.5f,  0.5f, -0.5f,  0.5f,0.0f,0.0f,0.5f, -0.5f, -0.5f,  0.5f,0.0f,0.0f,0.5f, -0.5f, -0.5f,  0.5f,0.0f,0.0f,0.5f, -0.5f,  0.5f,  0.5f,0.0f,0.0f,0.5f,  0.5f,  0.5f,  0.5f,0.0f,0.0f,-0.5f, -0.5f, -0.5f,  0.0f,0.5f,0.0f,0.5f, -0.5f, -0.5f,  0.0f,0.5f,0.0f,0.5f, -0.5f,  0.5f,  0.0f,0.5f,0.0f,0.5f, -0.5f,  0.5f,  0.0f,0.5f,0.0f,-0.5f, -0.5f,  0.5f,  0.0f,0.5f,0.0f,-0.5f, -0.5f, -0.5f,  0.0f,0.5f,0.0f,-0.5f,  0.5f, -0.5f,  0.0f,0.0f,0.5f,0.5f,  0.5f, -0.5f,  0.0f,0.0f,0.5f,0.5f,  0.5f,  0.5f,  0.0f,0.0f,0.5f,0.5f,  0.5f,  0.5f,  0.0f,0.0f,0.5f,-0.5f,  0.5f,  0.5f,  0.0f,0.0f,0.5f,-0.5f,  0.5f, -0.5f,  0.0f,0.0f,0.5f
};

很繁杂,但是一般模型都是导入的,不用自己去一个个顶点的写。

接下来根据坐标转换流程来写:

PVM变换矩阵就对应于这个过程。

  • model矩阵对应模型变换过程,将局部坐标转换到世界坐标。
  • view矩阵对应

接下来是PVM变换矩阵。实际的变换顺序是“MVP”。Model矩阵用于将模型坐标转化为世界坐标。view矩阵用于从世界坐标转移到观察坐标,要设置观察摄像机的位置,观察方向和头顶方向。projection对应从观察空间到剪裁空间的变换,指定了坐标的范围。
在进入主循环后,得到pvm三个矩阵:

 // Transform坐标变换矩阵glm::mat4 model(1);//model矩阵,局部坐标变换至世界坐标model = glm::translate(model, glm::vec3(0.0, 0.0, 0.0));model = glm::rotate(model, (float)glfwGetTime(), glm::vec3(0.5f, 1.0f, 0.0f));model = glm::scale(model, glm::vec3(1.0f, 1.0f, 1.0f));glm::mat4 view(1);//view矩阵,世界坐标变换至观察坐标系view = glm::lookAt(camera_position, camera_position + camera_front, camera_up);glm::mat4 projection(1);//projection矩阵,投影矩阵projection = glm::perspective(glm::radians(fov), (float)screen_width / screen_height, 0.1f, 100.0f);

这里之前要设置view矩阵中摄像机的各参数:

glm::vec3 camera_position = glm::vec3(0.0f, 0.0f, 3.0f);   // 摄像机位置glm::vec3 camera_front = glm::vec3(0.0f, 0.0f, -1.0f);     // 摄像机方向glm::vec3 camera_up = glm::vec3(0.0f, 1.0f, 0.0f);         // 摄像机上向量

以及projection矩阵中的视角:

float fov=45.0f;

首先计算的是model矩阵

  • 首先要创建一个model矩阵,glm::mat4 model(1)创建一个4*4的单位矩阵。
  • glm::translate()函数用于进行平移变换,将物体平移(0,0,0),也就是不变。
  • glm::rotate()函数用于旋转。第二个参数为旋转角度,第三个参数为旋转轴。这里的glfwGetTime是获取glfw初始化到当前状态所经过的秒数。如果是一个常数的话,就不会旋转了。那是因为每次进入循环之后矩阵在初始状态,都旋转同一个角度,那么肯定就看不到旋转。每次循环旋转不同角度,且这个角度的大小随时间变换,才能看得到旋转效果。
  • glm::scale()函数用于缩放,vec3指定x,y,z三个方向上的缩放比例。
glm::mat4 model(1);//model矩阵,局部坐标变换至世界坐标
model = glm::translate(model, glm::vec3(0.0,0.0,0.0));
model = glm::rotate(model, (float)glfwGetTime(), glm::vec3(0.5f, 1.0f,
0.0f));
model = glm::scale(model, glm::vec3(1.0f,1.0f,1.0f));

接着是view矩阵

  • 首先还是要创建一个4*4的单位矩阵
  • 通过lookAt函数计算。第一个参数是相机位置,第二个参数是相机所正对的目标的坐标,这里用camera_position+camera_front(相机的方向)进行向量加法后可以得到相机正对的坐标。第三个参数是相机的上向量。
glm::mat4 view(1);//view矩阵,世界坐标变换至观察坐标系
view = glm::lookAt(camera_position, camera_position + camera_front,
camera_up);

最后是projection矩阵

  • 这是一个投影透视矩阵
  • 第一个参数fov是角度值,定义了视野。对一个真实的观察效果,通常设置为45,如果要看到更多东西需要设置一个更大的值.
  • 第二个参数设置宽高比,也就是屏幕宽度比上屏幕高度。
  • 第三个和第四个参数设置了平截头体(也就是一个四棱台)的近和远平面。通常设置最近距离为0.1,最远距离为100.0。所有在近平面和远平面的顶点且处于平截头体内的顶点都会被渲染。
glm::mat4 projection(1);//projection矩阵,投影矩阵
projection = glm::perspective(glm::radians(fov), (float)screen_width /
screen_height, 0.1f, 100.0f);

以上对model,view,projection矩阵进行初始化后,还要将这三个矩阵传入着色器内。

glGetUniformLocation函数可以获得某个着色器中参数的位置,第一个参数为着色器id,第二个参数为该参数的名字

int model_location = glGetUniformLocation(shader.ID, "model");

glUniformMatrix4fv函数用于向指定位置传入一个4*4矩阵值。

glUniformMatrx4fv(model_location,1,GL_FALSE,glm::value_ptr(model));

接下来看顶点着色器的内容:

#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 PosColor;
out vec3 positionColor;
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;void main()
{gl_Position = projection * view * model * vec4(aPos, 1.0);positionColor=PosColor;
}

可以看到这里的参数和我们在程序内设置的是对应的。
注意顺序。由于opengl的向量是列向量,与行向量算的方式相反。

OpenGL绘制旋转立方体。相关推荐

  1. 安卓学习笔记38:利用OpenGL ES绘制旋转立方体

    文章目录 零.学习目标 一.绘制图形基本步骤 二.绘制旋转立方体 (一)运行效果 (二)实现步骤 1.创建安卓应用[DrawRotatingCube] 2.建模:立方体类 - Cube 3.渲染:立方 ...

  2. iOS OpenGL ES 旋转立方体

    思路 立方体有6个面,由于OpenGL es的特性,每个面只能有两个三角形组成,一个三角形有三个顶点,在不考虑使用顶点索引的情况下,一共需要36个顶点 立方体,需要开启深度测试和光源着色器 旋转立方体 ...

  3. 【OpenGL 学习笔记】第 7 篇:绘制旋转立方体

    目录 1.Z-缓冲 2.GLM库函数 3.PVM矩阵 4.PVM矩阵的使用 5.工程文件结构 1.Z-缓冲 //开启深度测试 glEnable(GL_DEPTH_TEST); 2.GLM库函数 3.P ...

  4. opengl es3.0学习篇七:使用opengl绘制一个立方体

    2019独角兽企业重金招聘Python工程师标准>>> 这里简单运用之前所学的知识来实现一个对应的立方体: public class MainActivity extends App ...

  5. OpenGL绘制旋转茶壶

    绘制一个茶壶,鼠标左键实现拖动旋转, 鼠标右键点击加速绕Y轴旋转: 弱鸡套了三四个版子才拼凑出来拿出来当明天的实验报告, 代码: #include <stdlib.h> #include ...

  6. OpenGl 绘制一个立方体

    https://www.cnblogs.com/icmzn/p/5049768.html https://blog.csdn.net/auccy/article/details/82392921

  7. OpenGL-绘制旋转立方体

    OpenGL绘制旋转立方体. 编译环境 vs2015+glut 效果图: //By:ZHangFY #include <GL/glut.h>GLfloat rotate_angle1 = ...

  8. 计算机图形学 | 实验六:旋转立方体

    计算机图形学 | 实验六:旋转立方体 计算机图形学 | 实验六:旋转立方体 Z-缓冲 GLM函数库 PVM矩阵 PVM矩阵的使用 华中科技大学<计算机图形学>课程 MOOC地址:计算机图形 ...

  9. OpenGL旋转立方体的实现

    计算机图形学大作业 题目要求 使用openGL实现旋转的正方体. 过程步骤 主要分为搭建环境和完成代码编写两部分. 搭建环境 首先下载并安装Dev C++,我使用的版本是:Dev-Cpp 5.11自带 ...

最新文章

  1. java 基础---继承
  2. AI 框架部署方案之模型部署概述
  3. linux tcp阻塞socket recv接收数据 未达到指定长度返回问题
  4. 二分大法| 求X的开方,结果一个公式解决! (力扣69.X 的平方根)
  5. hdu 5066 小球碰撞(物理题)
  6. mysql 秒杀 隔离级别_MySQL 四种隔离级别详解,看完吊打面试官
  7. Redundant Paths POJ - 3177(tarjan+边双连通分量)
  8. 从StreamCorruptedException解析值:无效的流头消息
  9. 【Poj1017】Packets
  10. php version 5.5.17-1~dotdeb.1,Ubuntu 12.04使用Dotdeb安装PHP5.4 / Nginx1.4/Redis2.6等新版本
  11. Python机器学习:PCA与梯度上升:06scikit中的PCA
  12. web电商、商城pc端、商城、购物车、订单、线上支付、web商城、pc商城、登录注册、人工客服、收货地址、现金券、优惠券、礼品卡、团购订单、评价晒单、消息通知、电子产品商城、手机商城、电脑商城
  13. [算法 笔记]2014年 去哪儿网 开发笔试题
  14. grafana+zabbix 部署分布式监控系统
  15. 我想牵你的手,从心动到古稀
  16. C语言中基础数据类型的取值范围——整型溢出问题
  17. SQLite 3.7.13的加密解密(三)—— 创建加密解密函数
  18. 移动前端页面与Chrome的远程真机调试
  19. 华为eSight网络监控平台安装
  20. 计算机应用技术信息管理方向,计算机应用技术专业(信息管理方向).docx

热门文章

  1. mysql异地多活方案_数据库跨云备份和异地多活解决方案.PDF
  2. php 默认图片,武磊西甲告别战再现“罕见”1幕:开场3分钟连续2次“抱怨”队友...
  3. 突破ThinkPad电脑只能运行一次Create Product Recovery Media的限制
  4. 【极客之作】快到极致的Android模拟器——Genymotion
  5. 新浪微博开发之三十五(微博frame)
  6. mysql中curtime()、curdate()、now()的区别
  7. html 横线的代码
  8. 爬自己的微信好友遇到的问题
  9. 如何购买AUTOSAR软件?(一)
  10. 20211229日语学习笔记