在对光照和面的消除以及碰撞检测进行了些许研究后,改进的 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 >
对于字符串累加的处理,在 PHP 或 JavaScript 中似乎都可以通过类似 += (.= for PHP) 的方式实现,但有不少人抱怨道,这种方式效率很低。事实上,在我还在用 VB 的时候我就注意到这样的效率很低,当时的效率低是因为累加需要反复申请内存,而解决方法也很简单,就是用 Space$ 命令事先申请内存,然后用 Mid$ 来修改,这样效率大大提高!
然而在这里就不一样了,PHP 和 JavaScript 的内存机制我不是非常了解,同时我们似乎也不再使用预申请的方法来加速了(似乎也比较困难……),而是直接用上了 += 这样的符号。
下面就是问题了:这样的效率低吗?
Read the rest of this entry »
< Javascript,PHP,效率 >
为了想提早试验 PHP 5.3 (昨晚下了个 Alpha,今天发现变成 Beta 了……),我在 VMware 下建立了个实验室,因为据说 JeOS 是有为虚拟机优化的,所以用了 Ubuntu JeOS 8.04.1,取名叫 upsuper-lab1。
Read the rest of this entry »
< JeOS,PHP,Ubuntu,VMware,虚拟机 >
昨晚看到了这个证明,觉得很神奇,最后再想想……发现被骗了……
据说这是几何学上非常经典的错误证明,我来说一说:
看右图,△ABC是一个任意三角形,下面我们来证明,AB=AC。
首先,我们设∠A的角平分线与线段BC的垂直平分线交于O点,过点O做AB垂线交AB于B’,再过点O做AC垂线交AC于C’,接着连OB及OC。这是图。
下面开始证明:
∵ OA是∠A的角平分线
∴ ∠OAC=∠OAB
又∵ Rt∠AB’O=Rt∠AC’O, AO=AO
∴ △AB’O≌△AC’O
∴ AB’=AC’, OB’=OC’
又∵ O在BC的垂直平分线上
∴ OB=OC
∴ Rt△BB’O≌Rt△CC’O
∴ BB’=CC’
又∵ 上面证明了AB’=AC’
∴ AB=AC
即△ABC为等腰三角形。
继续下去,同理我们也可以证明AC=BC=AB,于是我们便证明了任意三角形都是等边三角形。
但这显然是错误的。可是错在哪里呢?大家不妨自己先想想,然后再往下看。
Read the rest of this entry »
< 数学 >
在升级 Ubuntu 8.10 之后,由于内核的更新,原来编译安装的 VMware 6.0 已经不能用了,也没有兴趣再 config 一次,想到 6.5 已经出了,就干脆用 vmware-uninstall.pl 卸了……但是网上一直找不到 VMware 6.5,连 VeryCD 上都没有……
今天又搜了一遍,发现 VMware 出了 6.5.1……最终到 VMware 的官方网站注册并下载了 VMware Workstation 6.5.1 for linux,准备发到 VeryCD 上去~
下载来的,是一个 .bundle 的文件,不知道怎么开,网上看到Ubuntu 下安装bundle文件。原来只要把 .bundle 文件的权限添加“可以以程序执行文件”,然后直接运行就可以了。
将其权限加好后,在 sudo 下执行,发现下面的错误:
Extracting VMware Installer…done.
Launching a SCIM daemon with Socket FrontEnd…
Loading simple Config module …
Creating backend …
Traceback (most recent call last):
File “/usr/share/scim-python/engine/__init__.py”, line 26, in
import scim
ImportError: No module named scim
ImportError: No module named engine
/tmp/vmis.P26669/install/vmware-installer/vmware-installer: line 27: 26725 段错误 “$PYTHON” “$VMWARE_INSTALLER”/vmware-installer.py “$@”
不知道这是什么错误……我把 pkill 了 scim,没用,把 scim-python 文件夹重命名,还是没用……又是一番搜索,发现 Ubuntu 中文论坛上似乎有同样的问题:安装VMware6.5错误,内附错误信息,请大家给我看看该怎么办。根据下面一个人回复的提示,我将 /usr/share/scim-python/engine/__init__.py 文件中的 import scim 注释掉,可以正常安装。但去掉注释并没有像那人所说的依然可以安装。因此我将 import scim 的注释保留到安装完成。
安好后,就是注册的问题。因为 VMware 是可以先试用的,虽然 keygen 是 Windows 下的,我也 wine 不起来(好像以前可以……),于是就干脆先装了一个 Windows 在里面,然后在那里面跑 keygen,把注册码填进去。这实在不能不说是一种讽刺啊……
经过试用,这个版本相对原来的 6.0 在速度上有很大改进,对于我很关注的新加入的 Unity 原生窗口支持,倒是并没有期待中那么好。我主要是觉得有些地方还是不够方便,比如我的电脑等对于 Windows 很关键的东西在 Unity 中并没有出现,因此操作起来时不时还要切换回去。同时,Unity 的速度实在不敢恭维……特别是在 Compiz 下,类似迅雷那种有很多奇怪的窗口就比较累一点(因为那些提示性的“窗口”也要像普通窗口那样炫一下……)因此还是乖乖继续用原来的方式,期待 VMware 的继续改进……
< Linux,Ubuntu,VeryCD,Windows,虚拟机 >
Comments