openGL入门

参考:蓝桥网课:太阳系行星系统 https://www.lanqiao.cn/courses/558
主要梳理概念,不写大量的代码(可能会显得非常臃肿),代码打包放到github上。
闲得无聊逛sh聚聚的博客,发现了一个很好的openGL学习网站,挂一下:https://learnopengl-cn.github.io/
顺便挂一下sh聚当时的记录:https://www.kirito.info/learn-opengl-env/

写在前面

  1. 通过windows下的openGL实现简单的绘图和动画。
  2. 利用vs2022开发。

openGL包含了很多渲染函数,但他们是独立于操作系统和窗口系统的,本身并没有包含创建窗口或者读取键鼠的函数,因此需要额外使用GLUT(openGL Uitlity Toolkit),负责处理操作系统的调用,使用GLUT可以屏蔽操作系统的差异,可以实现跨平台。
windows开发,可以自己通过相关安装openGL的博客去自行安装,也可以通过vs2022的解决方案中的管理NuGet程序包搜索nupengl.core安装,vs2022会自动配置相关环境。

项目介绍

main函数:初始化窗口参数,定义回调函数。

star类:

  • 定义星星的基本参数,包括材质,位置,速度等信息。
  • 提供展示图像和更新参数的两个接口。

solarSystem类:

  • 定义太阳系内的常见天体参数(几个行星,卫星和太阳)。
  • 提供显示,更新窗口和监听键盘信息的接口。

通过实现star类计算星球相对位置。
通过solarSystem类定义相机信息,调用star中的show和update方法。同时通过监听键鼠信息来调整相机的位置。

细节方法

openGL提供的方法都是glutXxx()方法,因此很容易就能分辨出来那些方法是用的库函数。

main函数

初始化窗口信息和参数,定义显示和更新的回调函数。
主要包括

  • 初始化窗口
    • glutInit() 用来初始化GLUT库,获取main函数里面的两个参数,
    • glutInitDisplayMode() 用来定义窗口的显示模式,包括颜色显示,缓冲窗口等参数,
    • glutInitWindowPosition() 定义窗口的位置,相对于屏幕左上角x, y的坐标
    • glutCreateWindow() 定义窗口的名字
  • 三个回调函数
    • glutDisplayFunc() 用于更新时,执行回调函数,专注于试图的刷新
    • glutIdleFunc() 用于处理当前时间循环空闲时的回调函数,空闲时专注于星球位置的更新
    • glutKeyboardFunc() 用于处理键盘事件

通过这些参数,就可以在窗口中显示一些图像了。

star

主要定义了星星的参数和方法,包括:

  • 基本参数:自转和公转位置,星体材质,运动半径,所围绕的星球。
  • 方法:
    • update:更新自转角度和公转角度。
    • show:显示星体,主要根据自转和公转信息显示星球的位置和状态,通过材质显示星球的形状和颜色。
      • glEnable:启用或禁用openGL中的某些功能,
      • glPushMatrix和glPopMatrix方法,放入或弹出当前矩阵堆栈。就是将当前矩阵作为一个副本保存或使用。
        补充:这里的矩阵就涉及到OpenGL的物体建模方法了,大概意思就是先在坐标系远点描绘物体,再通过矩阵变换,将物体变换到目标位置处。这里有一个解释openGL中矩阵的作用的博客:https://blog.csdn.net/xyh930929/article/details/83715368,感觉还满详细的。
      • glRotated 矩阵变换,旋转:绕某一向量旋转,注意最后的d和f表示的时double和float
      • glTranslatef矩阵变换,平移:平移一个向量的长度
      • glBegin和glEnd绘制图形:在中间使用glVertex2f方法进行画点,根据图形的定义不同,这些点也会组成不同的图像。关于glVertex2f,这里有个博客写的很清楚:https://blog.csdn.net/qq844352155/article/details/28465919。
      • glutSolidSphere绘制球体
    • 在派生类中实现了不同星体的画法,通过glMaterialfv方法提前对材质进行一些处理

solarSystem

主要定义摄像机的位置来绘出的图像
基本参数:描述摄像机的9个参数,相机坐标,相机所拍目标的坐标,相机视角,
在构造函数中构造相机参数和 包含星体对象的数组,每次更新和展示都直接调用star中的方法即可。

  • 构造函数:通过gluLookAt方法描述相机的位置。
  • onDisplay:相机拍摄,针对viewport缓冲区进行一些操作
    • glClear清空缓冲区
    • glClearColor设置颜色缓存,只起到一个set的作用,没有clear的作用
    • glMatrixMode声明一下接下来要做的操作,通过传入投影,透视,纹理三个参数来表明
    • glLoadIdentity坐标系初始化
    • gluPerspective,定义相机的镜头参数,包括视角,距离等信息。

通过相机拍摄图像,然后更新到窗口中,这就是一个简单的openGL项目流程。

代码仓库:https://github.com/1074224619/OpenGL_demo

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值