GL回想

博主回忆了学习OpenGL的历程,从设立目标到分析、行动、调整,最终完成毕业设计。过程中,博主强调了搜索技巧、动手实践、英语能力在学习中的重要性,并通过学习3D基础知识、模型制作、人物动画和物理碰撞,逐步建立起对3D技术的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习GL的一些总结

在这个高速发展的社会,很多人都想着掌握各种技能,对内提升自己的内容,自己的价值,对外提升自己的salary,就业机会
学习,它应该是一个学而时习之的过程,是一个提出目标,分析目标,行动,调整,之后达到目标的过程。

目标

回想08~09年,当时的目标是想用GL做毕业设计,实现场景的一个简单3D场景+人物的动画还有简单的物理碰撞处理,物理碰撞部分是通过Lua进行配置。

分析
  • 第一:需要学习相应的GL基础知识

当时国内的资料非常非常少,那么最快捷的方式还是网络,百度就别想了,接近与0资源,那么只能依赖于google了,首先是中文的查询,那么检索相关的知识就需要进行考虑,比如OpenGL, OpenGL 教程, OpenGL 例子,不过这个还是很少,因为google上的资源英文还是最多的,那么进行的是Opengl demo, opengl tutorial, opengl demo等.

  • 第二:需要学习相应的搭建场景的软件

当时很多都是max的资料,而且国内仙剑系列也是用上了3D的基本不过在pc上直接使用的是dx的技术,而且dx有相应的x格式文件模型处理,GL只是统一的接口,没有对应的模型格式动画格式,这就一大难题了。

  • 第三:人物动画的处理,既然dx的x格式不能用,那么就需要考虑换一种方式去处理才行。
  • 第四:物理碰撞

很多情况啥叫物理碰撞呢?当时连概念都不是很清楚,基本上是不能穿透过去吧。资料从哪里来?还是网络上。

行动
  • GL基础知识

好不容易在google上面找到了关于GL的教程最早的是NeHe的,这个就是我GL的启蒙了,用到glut相关的库,开始了我的学习之旅,而但是一大难点也是我的一大痛是英语,超级烂的英语,我只能依靠于英语词典+源代码编译调试,首先是自己跟着教程一遍点着翻译词典,一遍一行一行的写代码,理解,之后编译,经常会出现编译不过当时的vc6.0也是这样熟悉起来,学校里面什么是断点,什么是步进,概念也就一个说头,到自己真正操作,里面就是雾水,得一边学一边里面,c++应该很多人都会头痛,内存没搞好,崩掉了,数据莫名其妙不对了啊,指针的指针啊,这些坑,一次一次的把我拖进去,又爬出来,之后总算是把GL的基础算是囫囵吞枣过了一遍,但是设计到图形学这部分也是很头大了,3D,这个xyz空间的变换,也是一遍的火海,烤得人焦头烂额,什么法线贴图,材质,纹理,shader也是各种头大的名词,和内容往上冒,熬过了这个阶段也只是一个小开始,接下来也不轻松。

  • 模型制作部分

这一块也是一个大头,当时能想到的场景用obj模型,因为结构简单,NeHe教程里面有相应的读取处理,算是抄过来处理了,不过有个问题就是,教程里面的没有处理负数的索引,也是3dmax在导出obj的时候的一个问题,可能是导出自己没设置好,那么问题就好了,做场景怎么做呢?又得从max开始学起,建模型,贴图一点一点学,这一块也是一知半解的做了。

  • 人物和动画

这一块当时有玩到《仙剑奇侠传四》特别的神往,最后人物直接用了主角的模型进行的修改,网上有找到,但是没有骨骼动画,这里实在伤了,在google上翻了,各种各样可以在GL上播放骨骼动画的库,差不多吧google上都翻烂了,也没找到合适的,最后的最后,找到了《半条命》可以使用的库,总算调试可以跑起来,下来就是如果绑定骨骼,如何做动画了,摆动脚摆动手臂等等,这里总算找到milkshap3D这个3d软件制作骨骼和动画, 人物也就才懂了起来。

-物理部分

当时已经没太多的做法,网络上找到了相应的思路,做的都是场景中简单的模型处理,正方体,长方体,圆柱等等进行的,也就是说,Lua配置上都是配置位置,相应的这几种简单的碰撞类型,角色使用的是圆柱(后面才知道,很多都是用的胶囊,而且有相应的物理引擎做支持)我就直接配置和对位置范围等等进行的判断处理的。
而对于这技术国内的资料非常少,虽然已经有不少游戏使用,那么学习的方式网络是最快和直接的,当时找到的GL基础是NeHe的教程

调整

当时涉及到了在制作过程的大量的调整,因为太多的未知,花费大量的时间,基本上大四都是在学习和制作毕业设计。

  • 首先是是对工具vc6.0的使用,以前的课程设计都做的比较简单,更深入的时候根本没太对,这里需要大量的调试,认识新的东西,不如指针,比如内存调试,比如断点的技巧,比如查看变量,等等。
  • 再次是3dmax的学习到milkshap3d的学习这个是找了大量的资料人物动画的格式对于当时的我没有处理好的一个问题,只能依靠库来处理,当时也有开始了解ogre不过,他庞大的源代码,我也只是学了他例子而已。
  • 物理部分了解也没那么多,后来在开始去了解了bullet这个物理引擎。
最后毕业设计算是勉强做出来了

一路做过来基本也就是:设定目标,分析,才分成可执行目标,如果不知道目标是否足够小,尝试,之后进一步了解,如果这时知道了需要进行拆分,那么在进行相应的才分,如果最后完成一个一个小目标,最后大目标就这样完成了,感觉好像拼图一样,N块拼图,每一块都拼对了,大图就出来了。

  • 期间的收获

1 搜索的重要性,关键字非常重要,一个合理范围的关键字,直接里面定位要搜索的内容。

2 动手能力
也就是行动力,GL基础的学习,看的和做根本是两码事,vc6.0这个的学习这样工具的学习,要靠大量的实践,思考+查阅资料来掌握。

3 英语的重要性
这个坑我一直没填好,国内的技术资料都是很贫乏的,还有目前的百度,基本上已经搜索不到太深入的东西了,而且在深入一些的基本上都是英文,而且理解需要阅读+动手才比较好掌握。

4 我更深入的了解了3D这个东东,学习了3dmax软件等,当时的学习,培养了我对3D的一个根基,就像种子一样,后面对3D的学习,基本上就在这基础上进行深化,扩展了,比如后面的maya,blender,或者上层的引擎都基本在这个的基础上进行架构,里面的猫腻,基本上在学习了CEGUI+ogre后整体后了大概的了解,如此一步一步的形成了这一块的一个大观。

至此

对很多的东西的了解是否也类似这样,像种子一样发芽生长开花结果,如上解决的问题,分解,分解,在分解直到可以一下解决这个小问题,或者在探索中在进行分解,当解决所有小问题之后大问题也就解决。期间的特点:知+行 循环往复,是否很多东西都可以这样呢?

#include <glut.h> #include <stdio.h> #include <gl.h> #include <math.h> int i, j; const int N = 40; float x[N], y[N]; #define PI 3.1416 void glRect(int leftX, int leftY, int rightX, int rightY) { glBegin(GL_LINE_LOOP); glVertex2d(leftX, leftY); glVertex2d(rightX, leftY); glVertex2d(rightX, rightY); glVertex2d(leftX, rightY); glEnd(); } void glArc(double x, double y, double start_angle, double end_angle, double radius) { glBegin(GL_LINE_STRIP); double delta_angle = PI / 180; for (double i = start_angle; i <= end_angle; i += delta_angle) { double vx = x + radius * cos(i); double vy = y + radius * sin(i); glVertex2d(vx, vy); } glEnd(); } void glCircle(double x, double y, double radius) { glArc(x, y, 0, 2 * PI, radius); } void glTri(int x1, int y1, int x2, int y2, int x3, int y3) { glBegin(GL_LINE_LOOP); glVertex2d(x1, y1); glVertex2d(x2, y2); glVertex2d(x3, y3); glEnd(); } void glLine(int x1, int y1, int x2, int y2) { glBegin(GL_LINE_STRIP); glVertex2d(x1, y1); glVertex2d(x2, y2); glEnd(); } void display(void) { glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glLineWidth(3.0); // 绘制熊猫的身体 glColor3f(0.0, 0.0, 0.0); glCircle(0, 0, 100); // 绘制熊猫的头部 glColor3f(0.0, 0.0, 0.0); glCircle(0, 120, 60); // 绘制熊猫的眼睛 glColor3f(0.0, 0.0, 0.0); glCircle(-30, 140, 15); glCircle(30, 140, 15); // 绘制熊猫的眼珠 glColor3f(1.0, 1.0, 1.0); glCircle(-30, 140, 5); glCircle(30, 140, 5); // 绘制熊猫的鼻子 glColor3f(0.0, 0.0, 0.0); glCircle(0, 110, 10); // 绘制熊猫的嘴巴 glColor3f(0.0, 0.0, 0.0); glArc(0, 90, 0, PI, 20); // 绘制熊猫的耳朵 glColor3f(0.0, 0.0, 0.0); glCircle(-60, 180, 20); glCircle(60, 180, 20); // 绘制熊猫的手臂 glColor3f(0.0, 0.0, 0.0); glRect(-120, -40, -80, 40); glRect(80, -40, 120, 40); // 绘制熊猫的腿 glColor3f(0.0, 0.0, 0.0); glRevsc++运行结果图片
最新发布
03-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值