2006年9月27日

被ACMer激怒了

昨天晚上去自习,很晚才回来。路上遇到一个ACMer(不是Sendoh)说:”你怎么去自习,不在Dian干活。”真的是不
能忍了,还是以前一起搞ACM的,虽然我半途而废。我觉得做ACM也不用这么嚣张吧,我以前看过一篇文章,还亲自打印
了,ACM图灵奖得主的演讲:The humble programmer
即便可以选择的话,也不再去搞ACM。来到这里有我的理由的:理想,朋友 ,归属感......。起码在这里过得更快乐
。这总不该遭到鄙视吧。
还是小熊更实在一些,评价更中肯一点,小熊说Dian对新人来说是个很好的地方,很多团队对新人的培养都不好,但
是有经验的人在这里没法拿太多精力来做研究,提高自己。其实小熊也来过这里面试,还跟刘老师谈过,但是考虑到没有
足够的时间就放弃了。小熊说即便来了,也会常去俱乐部的,毕竟感情深一些。我对南一这里也很有感情了。
小熊又说了,高调做事,低调为人。
也要做点研究了,下一个是:soft shadow
post:有点激动了,其实没那么严重的

2006年9月21日

小熊 && 开复 &&金戈

昨天去CLUB跟小熊聊了一会儿.很久以前就听Sendoh说过小熊,偶尔还会在gmail上聊聊天,只是没见过面。小熊是很强的人,很多方面很有见地,很重感情的人。昨天聊过之后回来想了很多,为什么要做graphics,以后怎么做下去都是要好好想想的。HUST做研究生做graphics的绝少,水平也不那么好,还要另找地方了,以前松松散散的等着保研呢。
Shadow Volume研究了快一个月了,但是小熊这个知道的的确比我多。SDK没有好好利用。NV,ATI,DX的SDK都是很早就下了的,还有暴多的DEMO。今天到小熊昨天给我看的网站看了一下graphics.cs.lth.se/research/shadows/
还有MIT的开放课件
国内地址(CORE)

MIT
国外大学的graphics的水平的确超越我们很多(虽然对国内的情况不是特别清楚)。隆德大学,苏黎士工学院,斯坦福,MIT,甚至chalmers(查尔姆斯技术学院)也是相当有实力的。
想去年来读大学的时候便是抱着”恐遂汩没,故决然舍去,求天下奇闻壮观,以知天地之广大。“(苏辙)的决心来的。还碰巧去GameDev.Net转了一下,也有不少收获呢。
写了一晚上代码了,只好看篇论文休息一下


今天是HUST Google camp开营仪式,开复先生来做了发言。很随和的人,重感情的人,有主见。kaifulee演讲的题目是《21世纪最需要的七种人》,着实精彩,值得一看。可惜前面搞的活动实在是又俗套又恶心。。。


今天组里开例会,也遇到一些问题。以后能全天候工作的人越来越少了。组长的管理方式还是比较人性化的。


最近有一个演讲,csdn搞的,演讲是由金戈(《代码大全》翻译者)来做的。也放到一起
同样学计算学科,是有两个职业方向的computer science researcher,software engineer.这两种当然是有很大不同的。他主要谈的是engineer,engineer当然更倾向于实践。然后讲了一些engineer所需要的东西,更kaifu lee的也有些相似。

2006年9月20日

期待已久的摘要功能终于实现了!!!

在周亮同学的热心帮助下,我终于有了期待已久的摘要功能。
blogger本身未能提供这一功能真是缺憾。
以前下载过一段代码加到模板里,但是那个摘要会隐藏整贴的内容,不爽。呵呵


点击查看全部内容....

2006年9月19日

地形生成

本来地形这个东东可以用柏林噪声之类的生成不错的东西,还有四叉树,但是现在情况比较特殊。组长希望:远处有山。所以做生成有点麻烦(其实也不麻烦)。现在是用生成好的bmp高程图。有专门的软件做这个事情。 World Machine,国外做的东西,有点复杂,但是很强大,也很好用。现在还在学习中。bmp文件其实并不很合适,那个头部的定义就够BT了。而且生成的图是24bit信息的,其实8位就够了,不需要那么高的精度。居然还有48位的,太。。。了,也许是因为专业吧。我用的还是trail版,pro简直难以想象了。
昨天的纹理问题今天解决的差不多了,还有法线一会儿也能解决。那就无敌了。可惜cactus同学嫌VSS服务器文件太大,把整个data目录给。。喀。。了,所以文理图不敢改,改了只有我这里是最新的,又会回到手动源代码管理的时代了。唉,得想点办法。

2006年9月17日

选择数据类型还是要注意一点

我想,如果不是必须的话,unsigned 还是少用为好
昨天晚上帮一个同学做课设,做一个简单的分词器,就是把句子里的词语划分出来。字典文件里的词条有116500左右。我是把整个字典都转化成pascal-like的格式存储到内存里。pascal-like格式好啊,字符串比较函数超级的快,因为长度是已知的,一定程度上也更安全。然后做了一个hash表,表里有内容为index的list指向字典的不同位置。失误就在于用了unsigned int 来表示这个,unsigned int 的最大值在65535,比那个116500小了一半,然后害死我了,always debugging......。这个问题倒也不怪unsigned,怪short长度太短。豆豆帮我用doxgen生成了文档,果然是很强大的工具呢,对Unix文化和工具越发有好感了。
今天绘制Terrain,又害了我一把,以前的接口就是unsigned int的,但是地形坐标显然是有负值的,
然后.....,不知道xophiix的库里怎样处理的。
还有这个blogger,S键是publish,我按Ctrl+S按习惯了,又害死我了.....

2006年9月15日

struct内部成员对齐带来的问题

24位的bmp文件的头部信息是由如下的两个结构组成的。共54字节


struct SBitMapFileHeader
{
unsigned short bfType; // 位图文件的类型,必须为BM
unsigned long bfSize; // 位图文件的大小,以字节为单位
unsigned short bfReserved1; // 位图文件保留字,必须为0
unsigned short bfReserved2; // 位图文件保留字,必须为0
unsigned long bfOffBits; // 位图数据的起始位置,以相对于位图

};


struct SBitMapInforHeader
{
unsigned long biSize;
long biWidth;
long biHeight;
unsigned short biPlanes;
unsigned short biBitCount;
unsigned long biCompression;
unsigned long biSizeImage;
long biXPelsPerMeter;
long biYPelsPerMeter;
unsigned long biClrUsed;
unsigned long biClrImportant;

};

拿第一个struct做例子吧,用printf("%d",sizeof(SBitMapFileHeader));看一下大小是16字节。
三个unsigned short,两个unsigned long加起来是14字节,因为为了内存对齐,第一个unsigned short占了4个字节的内存区域。(实际用于存储的还是两个)。bmp里仍然是用14个字节来存储。所以fread(&mapHeader , 1 , sizeof(SBitMapFileHeader), pMapFile);的读取办法就会出错。(在VS.NET 2003和Dev C++是如此的)。
一种写法:

fread(tmp_head, 14, 1, fp_load); /* 此处用中转空间tmp_head */
file_header.bfType = tmp_head[0];
file_header.bfSize = (0xffff0000 & ((unsigned long)tmp_head[2] << 16) |
0x0000ffff & ((unsigned long)tmp_head[1]));
file_header.bfReserved1 = tmp_head[3];
file_header.bfReserved2 = tmp_head[4];
file_header.bfOffBits = (0xffff0000 & ((unsigned long)tmp_head[6] << 16) |
0x0000ffff & ((unsigned long)tmp_head[5]));

我看了觉得不爽,不够透明。写了这个:

fread(&mapHeader.bfType , 1 , sizeof(unsigned short) , pMapFile);
fread(&mapHeader.bfSize , 1 , sizeof(unsigned long ) , pMapFile);
fread(&mapHeader.bfReserved1 , 1 , sizeof(unsigned short) , pMapFile);
fread(&mapHeader.bfReserved2 , 1 , sizeof(unsigned short) , pMapFile);
fread(&mapHeader.bfOffBits , 1 , sizeof(unsigned long ) , pMapFile);

豆豆看了又觉得不爽,写了这个:

#pragma pack(1)
struct SBitMapFileHeader
{
unsigned short bfType; // 位图文件的类型,必须为BM
unsigned long bfSize; // 位图文件的大小,以字节为单位
unsigned short bfReserved1; // 位图文件保留字,必须为0
unsigned short bfReserved2; // 位图文件保留字,必须为0
unsigned long bfOffBits; // 位图数据的起始位置,以相对于位图

};
#pragma pack(4)

这样编译器就不会默认用4个字节对齐了,VS.NET 2003,W4(Warning 4)等级下有一个warning.不过已经是很完美的方案了。

2006年9月12日

NeHe的OpenGL教程(完全版)下载

NeHe的OpenGL教程(完全版)下载(chm)
但是不附带代码,代码可以去http://www.xophiix.com.cn下载,是打了包的,或者NeHe的网站
或者看电子书的时候看到那里,就下那一章的,书里有链接。NeHe的教程还是不错的,如果能从头到尾学下来,也有一定水平了。可惜最近不怎么更新了。

谷歌的宣传flash

谷歌的宣传flash,我觉得这个名字蛮好的吗。。

下载

教育网下的软件升级

很多软件的升级服务器用教育网是无法直接访问的。比如avast! antivirus,McAfee firewall,Dev C++,这三个是我升级成功的。说一下经验。(像norton这样大厂商的产品用教育网也可以升级)
avast !是绝好的杀毒软件,功能很强,也很为用户考虑,开机扫描(这个可是在没登陆的时候就进行的,跟开机磁盘检查用的同一个界面),检测内存,不在全屏模式(比如你正在玩游戏)弹出,可定制的自动防护操控,皮肤切换。。。而且免费两年。avast !的更新是可以设置代理的,我用的是221.208.173.84:3128。一直很稳定。
McAfee firewall,Dev C++没有代理设置,不过最近发现他们默认使用IE的代理,所以把IE代理设置好就可以了。Dev C++的升级并不指真正的升级而是check for updates.又很多好东东呢。Dev C++还是很有生命力的。NeHe也提供Dev C++源码的。OpenSSL,zlib,OGRE,boost,Python,glut等等。Dev C++也是有很多缺陷的这个很限制它,编辑器的诸多bug,工程编译的一些问题,CVS功能比较弱,调试不够强。check for updates只能从库的方面改进它,而不是从它本身,插件机制才是王道啊!

2006年9月5日

关于C语言的字符串的问题

这是最近一个同学问我的问题,大致如下


#include <stdio.h>
#include <string.>

void ShowFile(char *fileName);

int main()
{
ShowFile("test");
Printf("%s","Hello World");
}
void ShowFile(char *fileName)
{
FILE *pShowFile;
strcat(fileName,".txt");
fopen("fileName","r");
......
}

ShowFile函数的本意是打印一个文本文件的内容,但这个程序输出的时候,"Hello World"不见了,变成了”.txt"。
实际上常量字符串是作为静态(static)变量来存储的,位置在全局变量之后,strcat()语句在"test"这个字符串之后写上了信息,破坏了下一个字符串"Hello World"的结构。
改写前:t e s t '\0' H e l l o....
改写后:t e s t . t x t '\0'

这个问题通常是这样解决的

void ShowFile(char *fileName)
{
char tempFileName[MAX_FILE_NAME_LENGTH];
FILE *pShowFile;

strcpy(tempFileName, fileName);
strcat(tempFileName,".txt");
fopen("tempFileName","r");
......
}

C语言的字符串处理机制的却并不怎么好,而且不仅仅是静态字符串。想起《JOEL 说软件》提到的事情了。C语言中字符串是以‘\0'作为结束符的。获取字符串长度的办法就是:从串首开始遍历,直到遇到这个结束符。这个方案也许也并不怎样,效率很低。
Joel提到了Pascal的字符串处理机制,串的第一位存储长度,不仅获取长度的问题解决了,而且两个串合并的问题也变得更容易了。可以通过一次移位到字符串的末尾!

还讲了一个油漆匠的故事。他的名字我忘记了。就是说有一个油漆匠吧,他负责漆路面,第一天漆了很远,老板夸奖他。第二天没有前一天那么远了,但是也算不少。第三天,他非常的卖力,但是仅仅,漆了很短的距离。因为他离油漆桶越来越远了。这就是C语言的字符串,每一次操作都从头开始。要保留当前计算的结果,所以要带着油漆桶走。

2006年9月3日

Shadow Volume

弄了一天的 Shadow Volume,还是有点收获的。基本的过程是了解了。
单个三角形的情况还很容易理解,多个的还没想明白。要努力啊
整整弄了一天,也没有War3。快开学了,时间不多了,该做点事了
xophiix回来了,自己感觉还是很受鼓励的。
06.09.05
今天是非常的不爽,在代码即将写完的时候,VS.NET 2003顺利崩溃。更为致命的是产生了罕见的蓝屏错误,然后启动失败。然后启动了若干次启动到安全模式。check hard disk,这个硬盘一直有问题。哎,本来准备今天见到效果 的。
06.09.05
今天重写了,所有的物体都出来了,偏偏阴影不见了。3维程序调试起来也很麻烦,跟普通的不一样,他是看效果的。
06.09.06
终于改出一个能用的了。从NeHe的27课弄出来的。因为昨天写的那个是VS.NET 2003写的,用xophiix的框架,现在VS彻底崩了,无法编译了。NeHe的一个做法让我很不解,他从文件里读顶点信息,也就是说你要画一个物体,必须提前计算出所有顶点。实际上多个面可能有一个公共的顶点的。在OGL里就可以画每个面的时候都glVertex..... ,判断两个面是否相邻时判断顶点的坐标是否相等。我重载了struct SVertex的 == 操作符。尽管重载并不是好事。


bool operator== (SVertex p1, SVertex p2)
{
if(p1.x == p2.x && p1.y == p2.y && p1.z == p2.z )
return true;
else
return false;
}

还有矩阵那一部分也要改一下,其实没必要重新生成一个矩阵,用逆矩阵就可以了。实际上他那个矩阵变换我还是有点不明白的。
06.09.06
现在明白NeHe为什么那样读取数据了,很多模型文件(比如3ds)都是在前面存模型的顶点,面的信息里只有顶点的索引。听xophiix说的。
看来线性代数的东西还是比较重要,连个矩阵求逆都不会了。还到处找资料^_^
06.09.08
NeHe求逆矩阵的方法真是奇怪,按相反方向进行变换,然后glGetFloatv(GL_MODELVIEW_MATRIX, curMatrix);
其实有专门的矩阵函数的............,比如高斯-约旦法。不过我只有代码,具体的数学知识并不清楚。要开始研究3DS文件了。程序员们总喜欢做抽象层。。。
从NeHe的网站上看到一段话,会让很多人汗颜了
One final note, if you see code that you feel is similar to someone else's code, please contact me. I assure you, any code I borrow from or learn from either comes from the MSDN or from sites created to help teach people in a similar way that my site teaches GL. I never intentionally take code, and never would without giving the proper person credit. There may be instances where I get code from a free site not knowing that site took it from someone else, so if that happens, please contact me. I will either rewrite the code, or remove it from my program. Most the code should be original however, I only borrow when I absolutely have no idea how to accomplish something, and even then I make sure I understand the code before I decide to include it in my program. If you spot mistakes in any of the lessons, no matter how tiny the mistake may be, please let me know.
现在看来把
阴影加到3DS模型里还是比较容易的,3DS文件的定义和需要的数据差不多。明天得补一下功课了。可惜矩阵变换那一部分还是有点不明白,必须用我认为错误的方法才能得到正确的结果。。。
Z-PASS + 3DS基本上弄得差不多了,发张图先

要z-fail了,会是一个难点啊。还有今天因为要用Import3DS这个函数而从CLoad3DS继承了CBW3DSShadow被cactus和xophiix。。。。
的确是经验啊,继承不该被滥用。而且,有些成员为了这次继承变成了protected,又是滥用.......
06.09.14
今天例会又讲了一下Shadow Volume,才发现有些地方还是没真正弄明白,只是弄了一个能用的东西而已。像glLoadIdentity之后glRect产生的图形将覆盖整个屏幕。老是以为相机已经设定好了。还要改进啊,z-fail并不急,先用NV的改进方法吧。场景还要改善,新的地形和光束....
06.09.26
终于把ShadowVolume真正弄明白了,耶,还有soft shadow呢。4点多了。