• 第一个OpenGL程序 - [OpenGL]

    2009-10-28

    刚刚在 Windows XP + Visual Studio 2008 上安装、配置、编译成功了OpenGL3.7beta。现在把过程写下来:

    visual studio2008的OpenGL配置很简单。下载glut-3.7.6-bin.zip,将其解压缩,并进入文件夹中。

    把glut.h copy到x:\Program Files\Microsoft \Visual Studio 9.0\VC\include\GL文件夹中,如果没有GL这个文件夹则可以自己新建一个,然后把glut32.lib copy到C:\Program Files\Microsoft Visual Studio 9.0\VC\lib中,最后把glut32.dll copy到C:\Windows\System32中.所有工作已经完成了,下面测试一下配置结果.打开visual studio2008,新建一个visual C++的Win32控制台应用程序的空项目,然后在项目中添加一个C++文件,在写C++文件名的时候写成是c后缀的文件,然后粘贴下面的代码运行:

    #include <GL/glut.h>

    void myDisplay(void)
    {
    glClear(GL_COLOR_BUFFER_BIT);
    glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
    glFlush();
    }


    int main(int argc, char *argv[])
    {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(400, 400);
    glutCreateWindow("第一个OpenGL程序");
    glutDisplayFunc(&myDisplay);
    glutMainLoop();


    return 0;
    }


    运行成功,会出现一个二维的白色正方形区域,这表明配置OpenGL环境成功!

    (参考http://hi.baidu.com/hermitinhistory/blog/item/1a2d389969d5b80f6e068c83.html/cmtid/628620ec817f6f36269791ff):

  • 三维视景生成和显示的实时性是产生现实感觉的首要条件。三维视景仿真中实时性主要体现在:1)运动体位置、姿态的实时计算和动态绘制;2)画面更新在20~30帧;3)实时交互动作;声音与图像的同步等。
    图形生成速度是仿真可视化的重要瓶颈,速度取决于:图形处理的软硬件体系结构,特别是硬件加速器的图形处理能力;图形生成所采用的各种加速技术;应用因素及虚拟场景的复杂程度、所需要的真实感速度。
    虽然高速发展的CPU和专用图形处理器使当今的图形工作站得到很大提高,但当前图形生成速度相对于仿真可视化环境的规模来说仍然存在相当大的差距。如何从软件着手,减少图形画面的复杂度,成为仿真可视化图形生成的主要目标。下面从软件角度就一些实时图形生成和显示技术做一些介绍:
    1) 可见性判定和消隐技术
    由于视线的方向性、视角的局限性以及物体相互遮挡,人眼所看到的往往只是场景中的一部分。有些目标不在视野范围之内,有些在但可能部分超出屏幕,这就要进行可见性判定和裁减。同时,由于视点的不同,在空间,我们只能看到三维物体的某些面(向前面),而有些面是看不到的(背离面),将那些完全或部分被遮挡的面称为隐藏面,消隐技术就是要消除相对  空间给定观察位置的背离面和隐藏面。
    2) 细节层次模型
    当物体离得越来越远时,人们不能再辨清该物体上的许多细节结构,因此,绘制一个远处的物体时,用该物体细节描述非常复杂的模型是完全没有必要的,浪费图形处理资源和时间。因此同一物体采用不同细节层次模型描述具有很多优点,并已经广泛应用。
    生成不同细节层次的方法:基于曲线、曲面拟合的物体模型可以自动生成该物体的不同层次的细节描述。基于多边形网格模型的多细节层次模型自动生成也有了广泛的研究。主要有一下几类:
    ① 自适应递归划分是曲面、曲线常用的方法。将该方法合曲面拟合技术相结合,用不断逼近的曲面片逼近所要简化的物体模型。
    ② 基于网格重建划分的多边形建模简化方法。
    ③ 基于顶点删除的多边形消减方法是自动生成物体简化模型一种有效方法。决定顶点是否删除,可删则采用递归循环分割法对删除顶点所遗留的空洞进行三角划分。
    细节层次模型的选择方法:根据人的视觉特征,主要依据以下标准:(前两种是常用方法)如何做到不同细节层次模型的光滑过渡仍有待于进一步解决。
    --根据物体与视点的距离
    --根据物体在投影面所占空间的大小,即在屏幕上所占象素的大小
     --根据物体与视线方向的夹角
    --根据人与物体是否存在相对运动
    3) 实例技术
    当三维复杂场景中具有多个几何形状相同但位置不同的物体时,可采用实例技术,例如场景中许多树,之间差别仅限于位置、大小、方向不同,如果把每棵树放入内存,将造成极大的资源浪费。,可以采用内存实例的方法,相同的树木只在内存中存放一份实例,将一个树进行平移、旋转、缩放之后得到所有相同结构的树木。
    4) 纹理映射技术
    环境模型中的图形仅有体和面的几何结构,是不能产生仿真环境的真实感觉的,还需要对其表面进行处理即加表面反射和纹理。以前,提高真实感的主要办法是增加物体的多边形,然而增加多边形的实时仿真会使图形速度变得缓慢,目前的图形硬件都具有实时纹理的处理能力,允许二维图像位图上的象素加到三维实体模型的对应点上,以增强图像的真实感。
    使用纹理映射有以下好处:
    ? --增加了细节水平及景物的真实感
    ? --由于透视变化,纹理提供了良好的三维线素
    ? --纹理大大减少了环境模型的多边形数目提高图形显示的刷新频率
    5) 单元分割技术
    将仿真环境模型分割成较小的环境模型单元称为模型单元分割,分割后,只有在当前模型中的环境模型对象被渲染,可极大减少模型复杂程度。如对对大地形模型和建筑模型分割。对于某些规整的模型,分割容易自动实现。而对于那些完成后一般不再轻易变化的建筑模型,分割能在预先计算阶段离线完成。

  • 计算机动画是当 今计算机图形学及CAD技术中最尖端的应用,已经形成独立的研究领域。根据计算机动画绘制和显示的原理,以及动画的交互程度,可以将计算机动画分为非交互 动画和交互动画,交互动画又分为非实时计算交互动画和实时计算交互动画。视景仿真环境中的动画生成一般是指实时计算交互动画。
    虚拟环境中动画生成根据其所依据的理论和所采用的技术分为:关键帧动画、变形物体动画、人体动画、过程动画和基于物理模型的动画等。
    关键帧动画:关键帧插值问题归结为参数插值问题
    变形物体动画:如电影《终结者II》机械杀手T-1000,由液体变成金属人
    人体动画:目前有许多问题没解决,是计算机动画中最富挑战的课题之一,脸部表情的研究难度最大。
    过 程动画:即用一个过程去控制物体的动画。过程动画经常涉及物体的变形,与前面的柔性物体的动画不同。柔性物体动画,物体的变形是任意的,可由动画师任意控 制。在过程动画,物体变形基于一定的数学模型和物理规律。过程动画应用最为成功的是不规则物体的动画。如火、烟、云等气体现象。利用粒子系统有独特的优 点,在电影《Star Trek II》模拟星系爆炸有成功的应用。
    基于物理模型的动画:20世纪80年代发展起来,能逼真的模拟自然物理现象,是基于物理学定律,(如牛顿动力学),考虑物体的真实属性如质量、弹性、摩擦力等。但因为计算量大模拟缓慢。

  • 很多呼声都是数落各个厂商不开源,忧郁着开源软件的发展未来。但是有没有想过,开源与否,开源的生存不是有那些厂商来决定的,而是由软件的使用者来决定的。

    现在的linux已经比过去5年好了太多了:

    1。在windows下,安装一个软件,依然要双击一下.exe或者.msi安装文件,在一连串的“next”后安装成功。而在linux下,经历了从几年前的源代码安装,到现在直接使用软件包管理器来安装,非常的方便,而且免费而快捷的升级,在互联网时代,这是多么了不起的事情啊!

    2。linux的安装界面比过去漂亮了不少,而且文件系统已经升级为ext4,比我刚用redhat9的ext3有有了飞跃。而windows却起色很少。

    3。开源浏览器firefox几乎完全突破了IE的封锁,在流媒体的播放上已经非常流畅,我现在随时都可以打开优酷看视频,很不错。但是我安装linux下的PPStream后,发现收到的节目很少,这还需要努力。

    4。GNU/Linux对硬件的支持越来越迅速,使得linux的普及成为可能。

    。。。

    进展非常的好,而且在功能、效率、安全上已经全面超过了windows,但是为什么人们对windows不担心,而反而担心超前这么多的linux呢?这的确是个哲学问题,很需要脑子。

    1。在所有因素里面,我认为用户体验是最重要的,比资金链更重要。些开源软件的人,我想很多都不是为了钱才去写代码,而是为了一种开源的精神所指引,所以即使没有酬劳,还是有不少人会继续。但是用户体验不同,编写代码的人,也许在激情之中不能够写出很好的说明文档,也许不能够在复杂的实现中,充分考虑这个开源软件的界面的友好程度。

    于是这归结到,开源软件如果要作大就必须要形成一个一个的社区,每个社区都有自己的招牌软件,最好这些社区不要重复太多,毕竟开源软件不比商业套件,有很高的利润,可以容忍互相竞争,而开源软件本身是对代码的狂热和对自由世界的膜拜,完全可以靠一种“共产主义”式的激情让代码日臻完善,完全不必引入竞争机制来让这个社区不安,最重要的是造成资源的严重浪费!看看linux的书不清楚的发行版就可以看到这一问题的严重后果。

    在每一个社区当中,应该细分,比如对于图像处理的某种软件,可以细分为代码小区、GUI小区、Debug小区、用户体验小区、日常维护小区、发展规划小区等等,而每一个小区又可以再分成单元,每个单元负责不同的部分,最后的住户就是一个个优秀而具有开源精神的程序员。——这样便可以形成一个自由而开源的“世界”。

    同时在开源世界中,因该存在一个这样的社区,它的目的就是为开源软件程序员建立合作机制,建立通信方式,建立某种基金来支持和奖励有所贡献的社区,来资助其进一步的发展(比如程序员之间面对面的交流等)。这样一个社区的存在非常非常的重要,没有规律的散乱只会让力量分散,而有机的结合和适度的管理会让社区很好的发展。

    这里我就觉得国际国内这么多的bbs,为什么要分的那么散?为什么不能整合起来,一站式管理,把多出来的服务器投入到“云计算”中,使得世界各地的用户和开发员都能够无延迟的网络交流呢?

    自由,应是从发展上的自由、使用上的自由,但是在开发的时候不能够那么随意,开源的目的不是为了开发自由,而是为了使用的自由,更好的继承是前提,有效而快速的发展是目的!开源世界就像宇宙中的一个国家,无意与其他体系开战,发展开源是为了将人的智力最大程度的凝聚,探索未知!升级人的大脑!

    2。资金问题。

    我不止一次问自己,开源的目的是什么,是赚钱吗?回答是否定的。开源的扩大需要钱吗?回答是肯定的。这又形成了一个矛盾,形成了一个哲学问题。思索,非常艰难!

    有些人开源完全是为了自己的工作需要,必须要自己开发一套程序,他们的目的并不是为了直接从这里赚钱,因此,代码越简单越好,功能上当然是为了工作需要,而不会考虑对其他使用者的难易程度。而他无私地公开他的代码,用来帮助那些也需要用到这套工具的人。

    有些人开发开源软件,完全是为了兴趣,为了把开源做大,为了让所有人用自由软件,用免费而高效的软件,这众人的精神可贵,然而也分为两类:一类是有固定的工作,把开发开源软件当作自己的乐趣;另一类是完全以开源为生,希望在开源中既可以满足自己的free梦想,又可以在开源中自己自足。

    还有些人,完全以盈利为目的,这这的话,我不考虑,仅仅考虑前两种。

    我曾认真的考虑过,自由开源的软件不盈利的前提——就是全世界都共产主义,一切按需分配,而不是按劳分配——这在目前是不可能的。原因很简单,世界是一个连续的链条,一环套一环。

    我在考虑是否有一种盈利模式,这中模式下的公司是一个承包社区,该社区专门负责挑选开源软件,为其他企业进行定制化的GUI开发和代码优化等。这只是一个脑海中的雏形,有兴趣的朋友可以一起来做。


  • void之害 - [GCC]

    2009-10-18

    搞了半个小时的void main(), 一直说冲突,谷歌了一下才知道,void已经被ANSI C抛弃了,空返回全部使用默认的int定义。


    而且gcc下,空返回不需要使用int和return就可以了。不过为了代码的可移植性,最好还是添上吧。

  • <table cellspacing=0 cellpadding=0 height=90 bgcolor="#ffff00" style=border-color:ff0000;border-left-style:solid;border-width:5px><tr><td valign=top>

    内容

    </table>

    可以先编辑好文档、代码,然后在html中添上上面的代码就可以了。下面给出一些解释:

    1. <table> 标签定义 HTML 表格。

    简单的 HTML 表格由 table 元素以及一个或多个 tr、th 或 td 元素组成。

    tr 元素定义表格行,th 元素定义表头,td 元素定义表格单元。

    更复杂的 HTML 表格也可能包括 caption、col、colgroup、thead、tfoot 以及 tbody 元素。

    具体参见:http://www.w3school.com.cn/tags/tag_table.asp

    2.其中的 hight, bgcolor等都是属性。

  • 恼火的程序 - [GCC]

    2009-10-16

    搞了半天终于把下面的程序搞定了。整理了一下思路,主要的问题在对于if语句的理解上.

    #include<stdio.h>
    int main()
    {
        int ch;    /*chooser=0和非0,类似Dirac函数,如果是0则输入一个华氏温度返回相应的摄氏度;否则为输出表格*/
        int i;
        int celsius;
        int fahr=1;    /*c为摄氏温度,f为华氏温度*/

        scanf("%d",&ch);        /*输入选择器数值*/

        if(ch==0)
            {
                scanf("%d",&fahr);
                celsius=5*(fahr-32)/9;
                printf("%d \t %d\n",fahr,celsius);
            }
        else   
            {
                celsius=5*(fahr-32)/9;
                printf("%d \t %d\n",fahr,celsius);
                for(i=1;i<=15;i++)
                    {
                        fahr=20*i;
                        celsius=5*(fahr-32)/9;
                        printf("%d \t %d\n",fahr,celsius);
                    }
            }
        return (0);
    }

     

  • Gedit - [GNU/Linux mint]

    2009-10-16

    忽然发现Gedit原来这么牛,这么适合我,忍不住抄了一段总结的不错的发出来跟大家共享。

    (摘录自:http://codeigniter.org.cn/forums/archiver/tid-1639.html_
    首先,要说明的是,如果你是想找一个大型的IDE,那这篇文章的介绍并不适合你,也不必花太大力气去寻找了,直接安装Aptana就可以。绝对好用。

    不过呢,像我这样有电脑洁癖的家伙,总希望按照自己的意愿,配置一个强大又尽可能轻量级的开发环境,选来选去,最后还是觉得用Ubuntu linux默认的文本编辑器Gedit更适合。

    相信看过CI视频教学的朋友,都会对视频里面使用的Textmate编辑器流口水,如果我告诉你,Gedit也可以做到像Textmate那样,你信吗?

    Gedit默认是只有语法高亮显示功能的,现在,我们开始来改造它一下,把它变成我们的Textmate。

    首先,文件浏览器是必须的。因此点编辑-首选项,然后在插件标签里找到文件浏览器面板和括号补全,选上。当然,什么嵌入式终端之类的,只要你想要的,里面有的也可以都给他选上。

    接着,在编辑器面板上,把启用自动缩进勾选上。Gedit在每次编辑文件的时候都会生成一个备份文件,有时这个功能其实很讨厌的。所以,我们把文件保存下面两个选项的选项都给取消掉。

    别急着关掉,再转到查看面板,把显示行号、突出显示当前行、突出显示匹配的括号这些统统选上。

    现在可以把首选项关闭了。

    接下来,我们要加上最重要的一步——代码提示。Gedit默认是没有代码提示的,我们只能去下载一个插件来实现代码提示。注意,这个代码提示并非真正的代码提示,它是抽取你本次打开过的文件中的所有单词,在你输入一部分代码后,它会把能够匹配上的部分全部列出来供你选择。按上下键可以切换当前选择的单词,注意,这个时候使用空格或者回车是都没有用的,想要让你选择的补全单词上屏,要使用tab键。去[url]http://live.gnome.org /Gedit/Plugins[/url]下载Word completion插件,解压拷贝到你的gedit目录下(我的ubuntu下是~/.gnome2/gedit/plugins),然后重新启动 Gedit,仍然在插件标签里,把Word Completion勾选上,就可以了。

    你也可以根据自己的喜好,修改Gedit编辑区的颜色风格,Gedit默认提供了4种风格。

  • C-2 - [GCC]

    2009-10-16

    1.main函数:每个程序都必须从main函数开始,而main函数可以调用其他函数,函数之中又可以嵌套调用再其他的函数。

    2.include语句,在后面将会讲到,它的基本目的就是要把外部库函数包含进来。比如现在我已经知道的math.h可以将外部的标准数学库函数调入进来,stdio.h可以将外部的标准输入输出函数调入。值得注意的是,ANSI C为了让C的可移植性最大化,让C的体积最小化,就把输入输出都踢了出去。其实这在fortran里面我曾经搞过类似的事情,当时我不使用scan这个函数来输入微分方程的初始值,而是直接在程序中就定义了初边值,当时是为了方便。现在C这样作,我想是因为有些设备不需要你去设定他的初值吧。

    问题一是:这些库函数是在编译的时候被调入还是在链接的时候被调入?

    问题二是:在使用gcc -o的时候需要在后面添加命令让gcc链接外部库函数。所以似乎是在链接的阶段调入库函数。这个问题需要好好读读man gcc了。

    3.变量命名规则:只能是字母、阿拉伯数字、下划线三种,第一个字符不能是阿拉伯数字。一般来说,全局变量的首字母要用大写,而局部变量名都用小写;常量名全部都要大写。另外还要注意不同的编译器支持的变量名的字符长度都有不同的限制,这可以查查书就知道。

  • C-1 - [GCC]

    2009-10-16

    1. 选书风波

    我对谭浩强的C程序设计非常失望。以前我写的都是Fortran代码,看的书也是蓝色封面的一个台湾人写的书。这次一看这本发行500万册的书,我就非常头疼!最要命的是,每写一段话就要拿数据结构说事情,我认为,我学的是C语言,不是数据结构——是的,知道数据结构有好处,但是我打算的是学完C的基础后再去看数据结构。于是,在学C的路上,我不可避免的要不断的思考他讲的数据结构上的内存之类的东西是怎么回事。再者说,就算要讲这些,就不能一次性放个附录之类的,或者前言之类的东西吗?非要这样让我不能一次学完,还得提心吊胆。


    因此,当我看完了除指针和结构体之外的内容后,我直接开始看老外的那本经典书籍了。

    2.编辑器的选择

    这个确实让我苦恼一阵子,羡慕Emacs的强大,Eclipse的集成化环境,Vi的简练。最终,我看破了这些,还是选择用vim了,直接命令行式的输入,和命令行式的debug,我想会锻炼我的。