在对光照和面的消除以及碰撞检测进行了些许研究后,改进的 3D Demo 再次出炉。
这次的立体感更强了,因为加入了光照去掉了混合并加上了深度测试。不过开始的时候,因为去掉了混合,不能搞半透明了,本来想直接判断视角然后不绘制立方体相应的面,结果后来无意中发现一个叫做 glCullFace 的东西可以直接去掉某一个平面的一个面(变成透明),于是就把它施在了那个立方体上。(当时参考的资料找不到了……)这样就有了这一个效果:你总是看到你本来看不到的面。
接着就是加光照。不用 CullFace 的情况下,光照没问题,可是一开就变得十分黯淡,不懂得为什么……开始觉得是不是这两个会冲突,但想想又觉得这两个没道理冲突啊……后来终于想到了——法线,因为法线是为外面的面设置的(朝向立方体外),我把所有法线掉一个头,瞬间效果就出来了……
球什么的还按照原来的方法加好。这次的挑战其实主要是那个碰撞检测。我想了很久,觉得要几乎真实的模拟只有通过大规模的计算进行逐个测试,于是我就这么做了……但事实证明,这样做虽然效果看起来不差,不过由于有碰撞和没碰撞时计算量差异可能非常大,以致瞬间造成“卡”的感觉,同时,我发现所有球停下来后,会叠在一起,而不会像真实那样下面的滚开让上面的下来。不过后面这个就现在的模型来说也没什么办法,因为本来就不是模拟力的,只模拟了个加速度……至于前面那个,我暂时也没想出什么好办法解决,或许可以用一些更简陋的方法来计算,以求更高的速度?
在 3D 中速度才是王道啊……
这次还加入了即时显示 fps 的东西,试用了 Google 的 DroidSans 开源字体,体积上还是相当不错的~我基本上是设置了每 0.15s 更新一次显示的 fps。
最后,因为希望整个程序结构清晰一些,把原来的一大个文件分成了好多文件,所以这次必须打包了……还因此顺便又尝试写了个比较大的 Makefile……
最最后是下载地址:myballs.rar (100.45 KB)
< OpenGL >
花了几天完全自己写了个小小的 Demo,本来想把球与球之间的碰撞也写出来的,结果写的太 bug 了,就暂时算了,先发这个了……
由于这个主要在学校完成,所以就只生成了 for Windows 的版本。同时,为了稍微推广一下,还写了个前端……
编译好的版本:test2.exe
前端:test2_ui.exe
把这两个放在一个目录就可以用了……
这一次基本没再参考什么教程,不过等到我发觉我再也写不下去的时候,我才发现其实我要学的东西还很多。写这个看来要有相当好的数学和物理基础,特别是计算几何和运动学(我物理中最差的恰是运动学……)。这次的程序加入了许多控制键,模拟重力效果个人是比较满意的,显示效果等到以后学了再做得更好。
额外的,这个程序会在命令行中输出帧数,本来是用以测试一些优化是否有效的,这下也可以小试一下显卡。
Read the rest of this entry »
< OpenGL >
今天回家本想在我的 Ubuntu 上玩玩 OpenGL,结果花了一个下午,终于研究出些东西了……
在 NeHe 的源代码中似乎有 Linux 的,不过一个是用 glut、一个是用 SDL、一个是用 GLX,原本看到 glut 是 OpenGL 官方的一个夸平台的简单窗口系统,结果发现全屏不能……于是就找到了 GLFW 这个东西,据说比较简单,不过还是研究了一个下午。
下面说一下研究成果吧,首先,想要用 g++ 编译用 GLFW 写的程序,一定要加这些编译参数: -lglfw -lGL -lGLU -lXrandr,特别是最后一个,是其官方参考中没有的!这个是我查了许多资料,然后瞎猜猜到的……再说说头文件,这次不需要引用3个库了,只有一个 #include <GL/glfw.h> 就可以了,似乎把其他的库自动引用了。另外就是,画完要用 glfwSwapBuffers(); 刷新,不然不仅什么都不会显示,而且还会死机……除此之外,还要注意那个键盘的按键,不要想当然的和 Windows 下拿去类比,根据研究发现,键盘事件交出的 key 最大可以达到 318,而且特殊键都会以这些“大值”返回,所以一定要申请好内存……
这次主要参考了:
GLFW Reference
OpenGL Tutorials – Basics
以及 NeHe 的 OpenGL 教程。
Read the rest of this entry »
< C/C++/C#,Linux,OpenGL >
今天又玩了玩,感觉到 OpenGL 实在太强大了!我也第一次遭到了买好显卡的重要意义:可以写 OpenGL 的程序!右边是效果图,有半透明、点光源效果。其实动起来会比较炫一点。
参考了下面教程(其实主要是抄):
OpenGL教程之纹理映射
OpenGL教程之纹理滤波方式
OpenGL教程之Alpha混合
除了教程里的功能,我还增加了按空格停止和按回车复位两个无聊功能……
整个程序也已经由上一篇的将近400行增加到了超过500行。不过和新的的优美效果比起来,这点代码似乎不算什么~
Read the rest of this entry »
< C/C++/C#,OpenGL >
Comments