??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品乱码一区二区三区,欧美视频一区二区三区…,国产精品久久久久久久久久妞妞http://www.shnenglu.com/winmain/Programming is so coolzh-cnSat, 23 Aug 2025 22:11:09 GMTSat, 23 Aug 2025 22:11:09 GMT60搬家d客园?/title><link>http://www.shnenglu.com/winmain/archive/2010/05/16/115510.html</link><dc:creator>Code Knight</dc:creator><author>Code Knight</author><pubDate>Sun, 16 May 2010 04:57:00 GMT</pubDate><guid>http://www.shnenglu.com/winmain/archive/2010/05/16/115510.html</guid><wfw:comment>http://www.shnenglu.com/winmain/comments/115510.html</wfw:comment><comments>http://www.shnenglu.com/winmain/archive/2010/05/16/115510.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/winmain/comments/commentRss/115510.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/winmain/services/trackbacks/115510.html</trackback:ping><description><![CDATA[<a >http://www.cnblogs.com/CodeKnight/</a> <img src ="http://www.shnenglu.com/winmain/aggbug/115510.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/winmain/" target="_blank">Code Knight</a> 2010-05-16 12:57 <a href="http://www.shnenglu.com/winmain/archive/2010/05/16/115510.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一道面试题http://www.shnenglu.com/winmain/archive/2010/04/12/112332.htmlCode KnightCode KnightMon, 12 Apr 2010 07:55:00 GMThttp://www.shnenglu.com/winmain/archive/2010/04/12/112332.htmlhttp://www.shnenglu.com/winmain/comments/112332.htmlhttp://www.shnenglu.com/winmain/archive/2010/04/12/112332.html#Feedback0http://www.shnenglu.com/winmain/comments/commentRss/112332.htmlhttp://www.shnenglu.com/winmain/services/trackbacks/112332.html阅读全文

Code Knight 2010-04-12 15:55 发表评论
]]>
LUA记http://www.shnenglu.com/winmain/archive/2010/03/29/110919.htmlCode KnightCode KnightMon, 29 Mar 2010 13:58:00 GMThttp://www.shnenglu.com/winmain/archive/2010/03/29/110919.htmlhttp://www.shnenglu.com/winmain/comments/110919.htmlhttp://www.shnenglu.com/winmain/archive/2010/03/29/110919.html#Feedback0http://www.shnenglu.com/winmain/comments/commentRss/110919.htmlhttp://www.shnenglu.com/winmain/services/trackbacks/110919.html2Qdostring可以直接?a(1, 2)“的字W串来调用LUA开攄C(j)++调用的诸如function a(x, y)的函数?

Code Knight 2010-03-29 21:58 发表评论
]]>
CryEnginehttp://www.shnenglu.com/winmain/archive/2010/03/07/109136.htmlCode KnightCode KnightSun, 07 Mar 2010 11:50:00 GMThttp://www.shnenglu.com/winmain/archive/2010/03/07/109136.htmlhttp://www.shnenglu.com/winmain/comments/109136.htmlhttp://www.shnenglu.com/winmain/archive/2010/03/07/109136.html#Feedback0http://www.shnenglu.com/winmain/comments/commentRss/109136.htmlhttp://www.shnenglu.com/winmain/services/trackbacks/109136.htmlCryEnginepd引擎玩家们ƈ不陌生,从最初的单机游戏《孤岛惊》、《孤岛危机》到目前火热的网游《永恒之塔》等一pd大作都是ppd1?代引擎打造,目前QCrytek已经发布?jin)该pd的第三代引擎“CryEngine 3”?/p>

  如下是最新公布的一D?#8220;CryEngine 3”引擎制作FPS游戏地图视频Q从制作到演CZ?分钟Q看?jin)让人瞠目结舌,唏嘘(sh)已?/p>

Code Knight 2010-03-07 19:50 发表评论
]]>
[转蝲]Q观点)(j)郎咸q与中国|游http://www.shnenglu.com/winmain/archive/2010/02/28/108627.htmlCode KnightCode KnightSun, 28 Feb 2010 12:21:00 GMThttp://www.shnenglu.com/winmain/archive/2010/02/28/108627.htmlhttp://www.shnenglu.com/winmain/comments/108627.htmlhttp://www.shnenglu.com/winmain/archive/2010/02/28/108627.html#Feedback0http://www.shnenglu.com/winmain/comments/commentRss/108627.htmlhttp://www.shnenglu.com/winmain/services/trackbacks/108627.html转蝲自:(x)http://data.gameres.com/article.game?id=139036
--------------------------------------

q篇文章U属是去q看郎教授的讲后的一时冲动,陆箋(hu)写了(jin)很久。但很多观点现在看来值得商榷Q可能是当时太激动了(jin)Q就着郎教授的理论往(xin)下分析了(jin)一下。修改的工作量太大也没时间就攑ּ?jin),原样贴出来供大家参考?br>---------------------------------------
产业链战?sh)中的中国游戏?br>
《业链阴谋?br>在万众欢腄北京奥运?x)闭q后不久Q一本名为《业链阴谋》的图书(zhn)?zhn)q入?jng)场Q引发了(jin)一늃潮。郎咸^教授再次向公众传输了(jin)他的新思想Q让因生zd“世界工厂”而无比骄(jing)傲的国h用另一U视角重新看世界Q重新认识中国制造业。随着q底金融啸下南方工厂的大批倒闭?qing)外汇储备的大量贬|q种思想昑־来珍c(din)?br>而与此同Ӟ中国|游业却一枝独UQ在寒冬中逆市(jng)增长Q而且自主研发的市(jng)场占有率辑ֈ59%。Ş势似乎一片大好,情况真的是这样吗?
-------------------------------------------------------------
与制造业的相同点

中国企业家进口机器设备,利用廉h(hun)力_力与原料Q按照外国的配方或技术标准生产大量廉价商品,大部分出口。我们的企业更像是代工厂。而游戏业的情况又怎么样呢Q来看看我们的一天吧?br>在珠三角的代工厂Q工Z按照标准开始生产X-box360L的芯片、主板与外壳Q技术架构与标准是IBM、ATI、SiS联合制定的,时尚的外观是国旧金qAstro Studios和日本大阪的Hers Experimental共同设计的。工厂把成品上交l新加坡公司伟创力、台湑օ司纬创、以?qing)加拿大公司天弘Q最后交l微软验Ӟq往(xin)全世界的销售网炏V?br>在上分公司Q中国员工正忙着lX360游戏《末日战?sh)》制作图像素材,有的负责模型Q有的制作脓(chung)图,有的制作动画?br>在北京某公司的游戏研发项目组Q策划清一色用着Microsoft的Office制作一个个扩展名ؓ(f)Doc、Xls的文ӞE序员(sh)?Microsoft的VisualStudio2005Q以ISO的ISO C为标准,或者直接在买来的Ogre、BigWorld或UE3引擎基础上略加修改,工使用Painter、PS?DSmax不断水U生产出大批素材?br>在上L(fng)某网吧,|游消费者像往(xin)怸h开以Intel、Nvidia芯片为核?国外围配g的电(sh)脑,q入Microsoft?WindowsVista操作pȝQ\由器自动分配?jin)一个符合IPv6标准的IP地址Q消费者用微软的IEq入国发明的InternetQ连接到?sh)信服务商的IBM服务器再q接到目标网站的服务器,不久打开一个国产网游,实际采用?jin)Ogre、BigWorld或UE3引擎+Microsoft的数据库+国外皮?br>
一句话Q我们按照美国标准代工制造了(jin)大量游戏机、按照外国h的要求ؓ(f)ơ世代游戏制作了(jin)很多术素材Q这些g能算入GDP与出口总额中去Q但我们却没有得CQ何实惠,国家没有正式的次世代L?jng)场Q我们的企业无缘?gu)ơ世代。我们用美国的工具软g按照国的技术标准生产了(jin)一大堆国|游Q我们的消费者用着国标准的电(sh)脑玩着国标准的国产网游,我们早已?fn)以为常?br>最早在中国讄研发中心(j)的国际游戏巨头育,最l已中国作为外包基圎ͼ主要是次世代术。中国员工成?jin)外企降低研发成本的重要环节。还有东星、维塔士?EPIC{。品多是家用游戏机的游戏,Ua(b)用于出口Q因为国内没有这个市(jng)场。《生化震荡》《末日战?sh)》等来次世代游戏中出C(jin)国h的n影。以《洛城大N》这ƾX-box游戏ZQ由国总部q行游戏架构与视觉风D计,香港工作室(Enlight Hong Kong StudioQ负责编E与详细术讑֮Q而美术执行部分全部来自大陆工作室QEnlight China StudioQ,包括建模、脓(chung)图、骨骼动Mq场动画制作。也是_(d)中国D存的单机游戏业也是术外包?jin),q一点上是IT民工Q与q东那些造鞋造玩L(fng)工厂没有本质区别Q简直就是殖民地。只剩下大宇{寥寥几家还在苦苦支撑,其他的要么倒闭要么转型为网游?br>q些情况是不正常的。金p事长求伯君说q:(x)“世界上没有哪一个民族愿意把作ؓ(f)信息产业灵魂的Y件业完全徏立在他h的智慧上。全世界优秀软g的决战更是一U文化的撞Q一场智慧的较量Q?#8221;

从技术的角度Ԍ游戏产业铄g与Y件两部分l成Q分片、操作系l、API、引擎与工具、硬件代工与软g外包Q核?j)是摩尔定律。美国掌握着世界g的走向,摩尔定律推动着g的不断升U,也间接推动游戏技术的不断q化Q次世代游戏的出现刺ȀZ升񔼋g或购买新机器Q于是一个Yg互相?j)进的业链形成了(jin)。CSDNC֌有一U观点:(x)软g产业基本形成“三梯?#8221;的国际分工格局Q外国牢牢控制着技术标准,军_技术的未来走向Q攫取高额利润。美国掌握了(jin)最先进的Y件技术,控制着软g开发^台和软g工具Q在全球软g产业链中居于领先CQ如DX11、VS2008?DSMax2009?Office2007。而中国企业在技术竞争力上与外国巨头的差距是来大?jin)?br>中国消费者可以不买国产品牌的?sh)脑Q但却不得不在兼Ҏ(gu)中用Intel的酷?CPUQNvidia的GeForce昑֍Q微软的 WindowsVista。中国玩家可以不玩外国游戏,但国产游戏中已经有不用的是外国的Ogre、BigWorld或UE3引擎。核?j)技术永q操于敌手,我们只是生外皮+l装而已?br>我们的确生活在太q盛世,但也的确生活在没有硝烟的产业链战?sh)之中,无声无息之中已经蕴含了(jin)无限杀机。核?j)技术操于敌手就是中国游戏业与制造业的共性?br>-------------------------------------------------------
与制造业的差?br>
中国C会(x)U学院研I员王立为,在开攄q程中,发展中国家的最大损p?sh)是国外的订单,而是自己的市(jng)源?%的市(jng)场流失对国家发展构成伤宻I过10%构成实质性伤宻I过30%可以造成无法弥补的伤実뀂我们国家的GDP每年都在以两位数的速度递增Q进出口总额屡创新高。但中国q出口总额?60%都来自外资企业或外资控股企业Q其中高U技产品高达80%。国务院研究发展中心(j)的研I报告指出,在中国已开攄产业中,每个产业排名?位的企业几乎都由外资控制Q中?8个主要业中Q外资在21个业中拥有多数资控制权。巨额利润被国外企业攫取Q中国制造业的利润率?%Q严重媄(jing)响中国企业的U篏与再循环能力Q而且严重威胁国家的战略安全。而游戏业的情况与之不同?br>中国游戏业的M是网游,占据?9%。而网怸单机是不同的Q这个市(jng)场暂时不是殖民地。中国网游市(jng)场暂时没有对外开放,而处于政府管制之中,政府是巨大的保护伞Q国家的一些政{限制了(jin)它的发展Q也限制?jin)外资的q入Q所以目前民族业发展较快。GameRES论坛上,有些资深从业者尖锐的指出Q目前民族业处于闭兌守下抢占国内?jng)场的阶Dc(din)?br>在保护伞下,外资难以完全控制产业链,产业价值大部分向本土企业。由于外资不能以M方式参与q营Q只能寻找本土的q营商进行合作,外国研发商的分成比例大约?5%Q所以网游的产值没有完全流向外国,代理型企业的利润率是30%Q自ȝ发的|游公司利润率达?0%以上。在2004q代理盛行的时候,外国游戏一度占据了(jin)?jng)场?0%Q吸C(jin)大量资金。目前自ȝ发占据了(jin)59%Q资金回W的比例来大Q情况对本土有利。即便是?ji)城q样的纯代理型企业,在暴雪的盘剥之下Q三q来通过《魔兽世界》也U篏?0亿资金,保持?jin)充裕的现金,为日后自ȝ发{型奠定了(jin)雄厚的基?br>
产业链也可以分ؓ(f)Q电(sh)信运营商、游戏研发商、运营商、渠道商、媒体。业链的上游是工具与流行内容,其中热门p与文学外资没有控Ӟ反而是国内企业通过收购控制?jin)其中一部分Q如盛大的vҎ(gu)学网Q盛大文学)(j)。外资在工具占优势,掌控?jin)大部分关键基础工具与^収ͼ如WindowsVista?VisualStudio2008、UE3、WACOMl图ѝ酷?、高U服务器Q这些是国内无力掌握的;中游是研发,外国占优势,但由于文化差异,外国游戏在国内的竞争力相对减׃(jin)Q在自主研发能力不断提高的今天,民族企业的对外依赖度大大降低Q代理时的议仯力也相对提高Q可以与Ҏ(gu)q行博弈Q代理难度也相对降低?jin);而下游是q营Q外资无法介入,只能获得一部分分成?br>与此同时Q盛大等公司已经开始整合业链Q如上游的网游引擎、文学网Q中游的工作室ƈ购与合作Q下游的渠道扩张与v外出口。在产业链战?sh)中的战斗力指数正在不断增强。这些优势是外企无法获得的?br>抛开复杂的技术问题,换一个视角,产业链战?sh)的关键在于资金的流向。从资金的角度来看,外国势力在上游赚取了(jin)工具的钱Q在中游获得?jin)一些代理费Q在下游获得?5%的运营分成。所以整体上Q业h(hun)值的六成以上都回到国内,产业链战?sh)中我方占主|有利于民族企业自w的资金U篏与@环,而这恰恰是业实力不断增强的关键。资金大部分向国内是中国游戏业与刉业的最大差异?br>-----------------------------------------------------------
长远发展的隐(zhn)?br>
表面上,中国游戏业取得了(jin)胜利Q但除去政府的保护、国外的引擎与工具之外,又有几分功劳可以归功于自q强大实力呢?
从品牌的角度来看Q中国的知名游戏品牌q是太少Q还有没世界U的游戏大作。这个问题始l难以解冻I而这个问题(sh)解决Q民族网怼业就像是暴发戯(g)不是世界公认的尖游戏商。自ȝ发的瓉有很多。而这几年的《劲舞团》《魔兽世界》代理权的恶性竞争事件恰恰说明了(jin)民族企业的实力薄弱?br>从另一个角度看Q中国IT业已l|?jin),软g业的85%、硬件的大半都已l不属于我们?jin)。我们生存在外国的技术标准之下,处于产业铄下游与外~,南北差异巨大Q不对等。网游市(jng)场的局部胜利不能改变I(y)T?jng)场整体的劣ѝ?br>没有否认q个行业规模很大Q发展迅速,但很多h都认为我们还是个弱国。没有自q核心(j)技术、^台、国际大作、王牌制作h、知名研发团队、大发行商,所以很隄为游戏强国,而只是殖民地或即成为殖民地?br>什么是游戏强国Q日本有着NDS、Wii、PS3q_Q以此^台标准按照标准游戏类型打造的众多标准化王牌游戏,全世界的游戏公司都要跟着q个标准开发ƈ销售品,软硬件共同创造巨大的产倹{制定硬件标准、标准游戏类型,制定规则是一企业的选择Q这U优势是难以在短期赶上的。强国需要长期的渐进的积累,无数l节的锤|大跃q无用。美国日本这些强国用?8q时间才形成目前的局面。中国游戏业才不q?4q_(d)而且发展受到大环境限Ӟ与国外差距巨大?br>
在政府的保护伞下Q民族业获得了(jin)暂时的主导地位。但问题在于Q一旦这个市(jng)场的开攄度扩大,如外资可以以合资公司或独资公司方式参与运营,那么以暴雪的狼子野心(j)来推,整个产业价值流向外国的比例?x)大大提高,民族企业受到极大冲击?br>中国有不业都是在?jng)场的不断开放中被外资控制的Q如化妆品、a(b)料、机械、胶南民族企业的实力q(sh)够强Q就像是孩子与职业招_手对战,败多胜少。从q个角度来看Q网怸与其他行业的情况极ؓ(f)cMQ不同的是这个行业还处于保护伞之下,没有完全开放。但M(x)有开攄一天的?br>中国|游业的发展q几q已l逐渐慢下来了(jin)Q市(jng)模L一天会(x)走向停滞。它不会(x)无限扩张下去Q成熟的|游?jng)场必然是低增长、低利润率与高竞争的。到那个时候,中国游戏业会(x)走向哪里Q?br>
中国的游戏市(jng)ZM国家都不相同Q它?00亿元的网游市(jng)Zؓ(f)表层Q以上千亿的元的家用机、掌机、PC单机C水货、盗版市(jng)Zؓ(f)里层。目前国内企业只能从表层?jng)场赚钱Q而对C?jng)场无能为力。那个地下市(jng)场寄托着玩家对各q_单机游戏的热爱、有限收入的无奈、与对行业现状的妥协Q也象征着未来发展的方向。虽然单机游戏业q转衰Q彻底消亡,但h们的热情发炽烈?br>中国|游业的产值在全球游戏业中之占6%Q我们始l与巨大的家用游戏机与掌机市(jng)场隔l。我们的产业l构是世界上独一无二的中国特色的Q没有哪个国家是如此C赖网游。如今自ȝ发网游的瓉正与单机发展不力的情况密切相养Il验不Q缺乏可以利用的游戏原型Q而只是一H蜂地随大流Q缺乏自q独到思考与创造力?004q匿名h士的一火爆网l引发无数{载的奇文《一o(h)所有游戏圈的兄弟汗颜的文章》中说的已经很透彻?jin)?br>中国|游业能否在未来成ؓ(f)世界W一Q还值得商榷。假设成功了(jin)Q那时中国也未必是游戏强国。因为网游在全球游戏业只是小弟,无法d取代庞大的单机市(jng)场?br>单机游戏如何从如今的术外包转向未来的重建国内单机游戏市(jng)场,杀入国际家用游戏机与掌机市(jng)场,q是未来必然要面临的问题。这也是中国要成Z界公认游戏强国的最大障。未来的产业链上游是游戏基础工具、^台制造、流行内容;中游是各q_各类型游戏研发;下游是销售、运营、培训、游戏衍生业。那时的产业链战?sh)?x)更加_ֽQ中国真正与国际接轨Q在产业链战?sh)中成?f)游戏强国?br>--------------------------------------------------
参考资?br>《业链阴谋》作者:(x)郎咸q?br>《利用外资八思》(来自《瞭望新d刊》)(j)
《一o(h)所有游戏圈的兄弟汗颜的文章》作者:(x)|络匿名人士
《迷茫的E序员和中国软g业》(来自CSDNQ作者:(x)wfwonde (逆风沉)
阿健的动漫游戏教室(来自天(dng)博客Q?br>癑ֺ癄
-----------------------------------------------



Code Knight 2010-02-28 20:21 发表评论
]]>
[转]CEGUI中的汉字昄实现http://www.shnenglu.com/winmain/archive/2010/02/27/108576.htmlCode KnightCode KnightSat, 27 Feb 2010 13:38:00 GMThttp://www.shnenglu.com/winmain/archive/2010/02/27/108576.htmlhttp://www.shnenglu.com/winmain/comments/108576.htmlhttp://www.shnenglu.com/winmain/archive/2010/02/27/108576.html#Feedback0http://www.shnenglu.com/winmain/comments/commentRss/108576.htmlhttp://www.shnenglu.com/winmain/services/trackbacks/108576.html几日前,?nbsp;CEGUI做界面,发现无法应用CEGUI的window中setText()函数直接昄中文。上|google一下,原来l过单的字符转化可以昄中文Q偷着乐,CEGUI太方便了(jin)Q?/p>

 

Ҏ(gu)如下Q引用)(j)Qhttp://blog.csdn.net/kun1234567/archive/2008/04/11/2282761.aspx

CEGUI使用utf8~码格式。这意味着我们可以很简单的显CZ文?/p>

 

1、弄个包含中文的字体Q在q里我借用大多C子里?“CQ?windows/Font/simhei.ttf”文g。把q个文g拯到Datafiles文g夹的Font文g多w?/p>

 

2、随便照着一?.Font文gQ自己写一个simhei.font文g。可以用TXT写,然后保存Q有的朋友说需要保存(sh)ؓ(f)utf8~码格式Q实际上是不需要的?/p>

 

3、同时注意修改你加蝲到程序里的scheme文gQ将里面的字体文件设|成simhei.ttf。你也可以(h)l用FirstWindowq个例子Q这L(fng)话直接修Ҏ(gu)代码里的字体为simhei.tff?/p>

 

4、现在在E序里进行字W编码{换,我拿代码说明问题Q?/p>

 

std::wstring aa = L"123中文abcあいうえ?;

char buff[128] = "";

WideCharToMultiByte( CP_UTF8, 0, aa.c_str(), aa.size(), buff, sizeof(buff), 0, 0);

button1->setText ( CEGUI::String ( CEGUI::utf8* )buff );

 

原理是这L(fng)Q对于utf8来说Q英文字W和ansi~码在内存布局上没什么区别,都是一个UCHAR。但是对于非英文字符Q则是UCHAR+UCHAR+UCHAR。如果我们手工进行编码格式{换,?x)比较?ch)琐?/p>

 

比较h的方法就是,我们先用WCHAR(unicode内存布局,UCHAR+UCHAR+UCHAR+UCHAR)来储存需要显C的字符Ԍ然后调用Win32API来帮我们把宽字符转换成char(多字节字W集内存布局)?/p>

 

q就是基本方法了(jin)Q然后我们可以根据这个{换方针,利用Win32API随意的{换字W编码格式,从而满程序中的各U需求?/p>

 

 

       通过此方法可以显CZ文,q没来得急高兴就发现?jin)第二个问题Q这U方法显CZ文速度太慢Q显C几十个字需要等??U左叻I(j)。难道没有高效的Ҏ(gu)吗?

于是l箋(hu)Google(我很懒,别h能做的事情从来不ȝ(ch)自己Q懒得跟t代?Q结果还真让我找C(jin)两篇相关的文章:(x)一份是千里马肝的《游戏中汉字昄的实C技巧》,另一份是免费打工仔的《让OGRE支持中文》。从中找C(jin)原因Q?/p>

       原来在游戏中Q是点阵字库或tif字体里的文字写进U理Q根据需求脓(chung)到指定的位置。英文的昄非常单,只有26个字母,q再加一些标炏V符号什么的Q用一张位图,可以以显C所有的单词?jin)。而中文要像处理英文那P把所有的汉字都保存在一张位NQ那么每一U字体都要生成一个巨型位图。在 GB2312中,一共有6000多个汉字Q就是?6*16Q据说会(x)?.5MQ(马肝兄说的,我没过Q?/p>

    l箋(hu)GoogleQ也没有扑ֈ解决问题的直接办法,唉,再懒也得自己上阵?jin)?/p>

通过跟踪调试Q发C(jin)问题所在,原来|魁R是他:(x)

 

const FontGlyph *Font::getGlyphData (utf32 codepoint)

{

     if (codepoint > d_maxCodepoint)

         return 0;

 

         if (d_glyphPageLoaded)

         {

              uint page = codepoint / GLYPHS_PER_PAGE;

              uint mask = 1 << (page & (BITS_PER_UINT - 1));

              if (!(d_glyphPageLoaded [page / BITS_PER_UINT] & mask))

              {

                   d_glyphPageLoaded [page / BITS_PER_UINT] |= mask;

                   rasterize (codepoint & ~(GLYPHS_PER_PAGE - 1),

                       codepoint | (GLYPHS_PER_PAGE - 1));

              }

         }

 

         CodepointMap::const_iterator pos = d_cp_map.find (codepoint);

         return (pos != d_cp_map.end()) ? &pos->second : 0;

}

 

原来CEGUIҎ(gu)Unicode字符的编码顺序,为每256个字W分配一张纹理(例如~码0-255存放在纹理一Q编?68-1023 存放在纹理四Q。英文很Ҏ(gu)搞定?jin),那么几个字符一张纹理就够了(jin)Q可中文得靠运气了(jin)Q有时显C几个字p生成几张U理Q还要将每张U理用不需要的盔R字填满,x(chng)伤胦(ch)Q?/p>

发现?jin)问题,我便按照千里马肝的思想对函数进行了(jin)攚w,用的文字攑օ一张纹理中Q因为纹理最大承?56个字Q所以,当汉字超q?56个时Q则不常用的去掉,新的字W写入?/p>

后来我发现汉字的引用没有太多的规律,常用的一千多汉字出现的概率没有那么?zhn)D(废话Q要不怎么是常用呢!Q,没有办法很好地按照用的频率汉字限制在256个字以内Q写q纹理,q(ch)性一旦满?jin)就字全部释放掉,重新写入。(也需有我没找刎ͼq请高手指教Q?/p>

代码如下Q?/p>

const FontGlyph *Font::getGlyphData (utf32 codepoint)

{

     if (codepoint > d_maxCodepoint)

         return 0;

 

     if(codepoint < 256)  //军_保留一张纹理放英文和字W?/p>

     {

         if (d_glyphPageLoaded)

         {

              uint page = codepoint / GLYPHS_PER_PAGE;

              uint mask = 1 << (page & (BITS_PER_UINT - 1));

              if (!(d_glyphPageLoaded [page / BITS_PER_UINT] & mask))

              {

                   d_glyphPageLoaded [page / BITS_PER_UINT] |= mask;

                   rasterize (codepoint & ~(GLYPHS_PER_PAGE - 1),

                       codepoint | (GLYPHS_PER_PAGE - 1));

              }

         }

 

         CodepointMap::const_iterator pos = d_cp_map.find (codepoint);

         return (pos != d_cp_map.end()) ? &pos->second : 0;

     }

     else //昄汉字?/p>

     {

         CodepointMap::const_iterator pos;

 

         pos = d_hz_map.find (codepoint);

 

         if(pos != d_hz_map.end())

         {

              return (pos != d_hz_map.end()) ? &pos->second : 0;

         }

         else

         {

              rasterizeHZ(codepoint);

 

              pos = d_hz_map.find (codepoint);

              return (pos != d_hz_map.end()) ? &pos->second : 0;

         }

     }

}

 

void FreeTypeFont::rasterizeHZ (utf32 codepoint)

{

     int num;

     uint texsize = 512;

 

     if(d_hz_map.size() < 256)

     {

         float adv = d_fontFace->glyph->metrics.horiAdvance * float(FT_POS_COEF);

 

         d_hz_map[codepoint] = FontGlyph (adv);

     }

     else

     {

         d_hz_map.clear();

 

          ImagesetManager::getSingleton ().destroyImageset (hzImageset->getName ());

 

         hzImageset = ImagesetManager::getSingleton ().createImageset (

              d_name + "_auto_glyph_images_" ,

              System::getSingleton ().getRenderer ()->createTexture ());

 

         d_glyphImages.push_back (hzImageset);

 

         float adv = d_fontFace->glyph->metrics.horiAdvance * float(FT_POS_COEF);

 

         d_hz_map[codepoint] = FontGlyph (adv);

     }

 

     CodepointMap::const_iterator hzInter  = d_hz_map.find(codepoint);

 

     if (!hzInter->second.getImage())

     {

         // Render the glyph

         if (FT_Load_Char (d_fontFace, hzInter->first, FT_LOAD_RENDER | FT_LOAD_FORCE_AUTOHINT |

              (d_antiAliased ? FT_LOAD_TARGET_NORMAL : FT_LOAD_TARGET_MONO)))

         {

              std::stringstream err;

              err << "Font::loadFreetypeGlyph - Failed to load glyph for codepoint: ";

              err << static_cast<unsigned int> (hzInter->first);

              err << ".  Will use an empty image for this glyph!";

              Logger::getSingleton ().logEvent (err.str (), Errors);

 

              // Create a 'null' image for this glyph so we do not seg later

              Rect area(0, 0, 0, 0);

              Point offset(0, 0);

              String name;

              name += hzInter->first;

              hzImageset->defineImage(name, area, offset);

              ((FontGlyph &)hzInter->second).setImage(&hzImageset->getImage(name));

         }

         else

         {

              uint glyph_w = d_fontFace->glyph->bitmap.width + INTER_GLYPH_PAD_SPACE;

              uint glyph_h = d_fontFace->glyph->bitmap.rows + INTER_GLYPH_PAD_SPACE;

 

              // Check if glyph right margin does not exceed texture size

              uint x_next = m_nHZX + glyph_w;

              if (x_next > texsize)

              {

                  m_nHZX = INTER_GLYPH_PAD_SPACE;

                   x_next = m_nHZX + glyph_w;

                   m_nHZY = m_nHZYB;

              }

 

              // Check if glyph bottom margine does not exceed texture size

              uint y_bot = m_nHZY + glyph_h;

             

 

              // Copy rendered glyph to memory buffer in RGBA format

              drawGlyphToBuffer (hzmem_buffer + (m_nHZY * texsize) + m_nHZX, texsize);

 

              // Create a new image in the imageset

              Rect area(static_cast<float>(m_nHZX),

                   static_cast<float>(m_nHZY),

                   static_cast<float>(m_nHZX + glyph_w - INTER_GLYPH_PAD_SPACE),

                   static_cast<float>(m_nHZY + glyph_h - INTER_GLYPH_PAD_SPACE));

 

              Point offset(d_fontFace->glyph->metrics.horiBearingX * static_cast<float>(FT_POS_COEF),

                   -d_fontFace->glyph->metrics.horiBearingY * static_cast<float>(FT_POS_COEF));

 

              String name;

              name += hzInter->first;

              hzImageset->defineImage (name, area, offset);

              ((FontGlyph &)hzInter->second).setImage (&hzImageset->getImage (name));

 

              // Advance to next position

              m_nHZX = x_next;

              if (y_bot > m_nHZYB)

              {

                   m_nHZYB = y_bot;

              }

         }

     }

 

     // Copy our memory buffer into the texture and free it

     hzImageset->getTexture ()->loadFromMemory (hzmem_buffer, texsize, texsize, Texture::PF_RGBA);

 

}

 

     OKQ问题搞定,打完收工。试试,效果q(sh)错,可以z洗睡了(jin)。特自q一点体?x)写出来Q给新手提供个捷径,也希望高手批评指教?/p>

Code Knight 2010-02-27 21:38 发表评论
]]>
[转]OGRE新插件PagedGeometry(量场景分页调度)http://www.shnenglu.com/winmain/archive/2010/02/24/108371.htmlCode KnightCode KnightWed, 24 Feb 2010 13:31:00 GMThttp://www.shnenglu.com/winmain/archive/2010/02/24/108371.htmlhttp://www.shnenglu.com/winmain/comments/108371.htmlhttp://www.shnenglu.com/winmain/archive/2010/02/24/108371.html#Feedback0http://www.shnenglu.com/winmain/comments/commentRss/108371.htmlhttp://www.shnenglu.com/winmain/services/trackbacks/108371.html
1,介绍Q?/span>
         

 PagedGeometry?/span>OGRE引擎的一个插Ӟ它对Q无IP(j)大区域的量|格的渲染提供优化策略。它非常适合于稠密的林和室外场景,那里有v量的?wi),草,岩石Q灌木丛{场景对象?/span>

 

2, PagedGeometry

PagedGeometry class

 

      该类负责加蝲那些需要立卻I或很快)(j)可见的场景几何,而不加蝲其他的场景以节约内存I间?/span>PagedGeometry引擎可以通过诸如?rn)态几何,imposters{方法去昄实体对象Q?/span>EntitiesQ。这些方法是与实体和场景相机的距,以及(qing)你的配置相关的?/span>

      寚w面的加蝲是通过用户定义?/span>PageLoader来完成的。这P用户可以~程实现加蝲面Q无论它是来自硬盘(sh)的文ӞE序产生的或是其他地斏V?/span>

 

     GeometryPageManager

     ?/span>PagedGeometrycM使用Q用于管理分页面,在需要的时候做cacheing, deleting{工作。它通过分析摄像d计算面cathe的速度Qƈdelete那些已经l过?jin)设定时间的不可见页面?/span>

调用PagedGeometry::addDetailLevel(), 创徏 GeometryPageManager ?/span>

addDetailLevel() returns a pointer to this page manager, allowing you access to some useful functions, documented below.

cL员函C有些注释?/span>DO NOT USE的,不能被用户用,它们是在PagedGeometry中被使用的?/span>

addDetailLevel()

Adds a detail level to the PagedGeometry object.

PageType 对该detail levelQ用h使用的页面类型。它不是一个函数参敎ͼ而是一个模板参数?/span>

 maxRange q个detail level使用的最大距(摄像机的视距Q?/span>

transitionLength 期望的衰减{变长?/span> - Q可选)(j)

CZQ?/font>

    pagedTrees->addDetailLevel<BatchPage>(100); //Use batched geometry from 0-100

    pagedTrees->addDetailLevel<ImpostorPage>(500); //Use impostors from 100-500

名叫pagedTrees?/span>PagedGeometry 的对象会(x)?/span>0Q?/span>100单位摄像ȝ范围内?/span>batchedQ分批几何,?rn)态几何)(j)Q?/span>100Q?/span>500单位距离范围内?/span>imposters

如果已有的页面类型不合适,用户可以很轻杄d自定义的GeometryPage子类

transitionLength 参数在默认情况下是没有的Q但是用户可以自己添加,它的作用是ɾl节层次转变更^滑。但是注意,使用参数可能?x)是渲染的效率下?/span>10Q-30Q?/span>

3,面cd

Class GeometryPage

如上所_(d)该类是一个虚基类Q用户可以扩展(h)承该cd实现不同的替代被渲染实体的方式,?/span>batchedQ?/span>imposters{。如果你需要其他的面cdQ你可以自己实现一些?/span>

以下是用户必d子类中实现的虚函敎ͼ(x)

virtual void init(SceneManager *mgr, Camera *cam) = 0;

virtual void setRegion(Real left, Real top, Real right, Real bottom) = 0;

virtual void addEntity(Entity *ent, const Vector3 &position, const Quaternion &rotation, const Vector3 &scale, const Ogre::ColourValue &color) = 0;

virtual void build() {}

virtual void removeEntities() = 0;

virtual void setVisible(bool visible) = 0;

virtual void setFade(bool enabled, Real visibleDist, Real invisibleDist) = 0;

virtual void update() {}

以下是页面管理器Q?/span>page managerQ如何去使用上面的函敎ͼ(x)

1Q当PagedGeometry首先create一?/span>GeometryPageQ马上调用它?/span>initQ)(j)Q该函数好像构造函C栗?/span>

2Q准备一个几何页面给待渲染实体,讄面区域?/span>

3Q添加实体对象到该页面,q初始化位置Q方向等?/span>

4Q添加实体到场景中的最后一步。在d完所有实体对象后自动调用?/span>

5Q从面完全删除实体对象?/span>

6Q整个面变(sh)ؓ(f)可见?/span>

7Q设|页面的消减属性?/span>

8Q在帧@环中保证面几何的更新?/span>

class BatchPage

The BatchPage class把实体当作静(rn)态几何体来渲染?/span>

 

?rn)态几何体Q?/span>StaticGeometryQ:(x)在场景中有许多实体是从它们加入场景开始就不会(x)Ud的,如房屋,?wi)等Q?/span>OgreU情冉|供了(jin)StaticGeometryc?/span>,它允怽Ҏ(gu)?/strong>很多物体.q个通常要比手动?/span>SceneNodesd要快多了(jin)?/span>

 

class ImposterPage

the ImpostorPage class.把实体当?/span>impostorsQ一U布告版囑փQ看h像真实的实体Q来渲染

所?/span>pagecd中,q个是最快的Q它使用ImpostorsM替要渲染?/span>entitiesQ这P昑֍只要L染一pd?/span>2d imageQ而不?/span>3d mesh

 

 

class GrassPage

A custom page type designed specifically for use with GrassLoader.

GrassPage面cd是被设计来配?/span>GrassLoader使用?/span>

q种cd是没有做q优化的Q它只是Ҏ(gu)l的entityq行克隆Q然后绑定到一个新的场景节点之上。这意味着性能很差?/span>

4Q?/span>BatchedGeometryQ一U静(rn)态几何的版本

class BatchedGeometry

它是Ogre::StaticGeometry的一个轻量版本?/span>

staticGeometry?/span>ogre提供l用L(fng)Ҏ(gu)染的c,它可以一ơ性渲染那些在场景中保?#8220;?rn)态的”实体Q?/span>entitiesQ,如,房屋Q树(wi){?/span>

它给用户提供多一些的?/span>batch材质{的控制?/span>

class SubBatch: public Ogre::Renderable

subBatchl承?/span>RenderableQ是BatchedGeometry的内部类Q它的构造函C传入BatchedGeometry指针?/span>submesh的指针,该类包含?/span>BatchedGeometry中?/span>

5Q?/span>Loading Entities

class PageLoader

虚基cR用户可以扩展它L供负责加载页面(PageQ的回调函数?/span>

PagedGeometry预装?jin)几U不同的LoaderQ(h)承于PageLoaderQ跟很多实体理器不同的是,PagedGeometry不允许用户一ơ性向objectd所有的entitiesQ由于它是用于大规模的游戏场景,所以它?x)对世界几何q行分页Q然后调度,只加载需要绘制的面?/span>

只要引擎需要确定世界几何的那一块区域需要被加蝲Q就要调?/span>PageLoader的成?/span>loadPage()。在函数中的PageInfol构体,提供?jin)页面的包围体信息。在函数中,用户通过

addEntityQ)(j)来添加实体到该页面中Q还可以定义实体的尺度,位置Q旋转等属性?/span>

当用户创Z(jin)自己?/span>loader对象后,必须其attatch?/span>PagedGeometry对象上去。如下:(x)

pagedGeometry->setPageLoader(yourPageLoader);

 

PageInfo: l构体。提供给PageLoader的有用的面信息。基本的信息是定义被加蝲的区域,q有一些该区域的其他信息?/span>

l构体内包含?jin)一?/span>TBoundQ?/span>typedef Ogre::TRect<Ogre::Real> TBoundsQ,所有在该页面内的实体都必须攄在这个矩形包围体之中?/span>

具体?/span>loadersQ?/span>

Q?/span>1Q?/span>GrassLoader l承?/span>PageLoaderQ用于和PagedGeometry一起生真实的草地场景。所谓真实的草地模拟Q?/span>GrassLoader成员函数addLayerQ)(j)来添加草Q?/span>updateAnimation()来驱动动甅R?/span>

     当用户创Z(jin)Grassloader对象后,必须其attatch?/span>PagedGeometry对象上去。如下:(x)

pagedGeometry->setPageLoader(GrassLoader);

     草地loader在用几何页面类型的时候,被推荐ؓ(f)使用GrassPageQ这L(fng)渲染效率较高Q而采用其他类型则效率很低?/span>

     同时提供?jin)一个数据结构来完全控制Grass的属?/span> class GrassLayerQ它是通过addLayerQ)(j)来添加的Q该cL供了(jin)一pd?#8220;set”Ҏ(gu)Q用于用户配|草地的材质Q密度,大小{属性信息?/span>

 

Q?/span>2Q?/span>TreeLoader2Dl承?/span>PageLoaderQ用于和PagedGeometry一赯易的实现在地形上攄?wi)木的功能?/span>

     使用Ҏ(gu)和前qC_(d)使用ӞaddTreesQ)(j)Ҏ(gu)向场景中d?wi)木。需要注意的是,loader加蝲?wi)木时ƈ不知道该地Ş的高度,而是假设高度?/span>0Q这需要设定获得当前(即给?/span>xQ?/span>z值时Q的地Ş高度?/span>Loader提供?jin)这些方法?/span>

 

Q?/span>3Q?/span>TreeLoader3D?/span>2D的情况差不多Q只是效率大概低40Q左叟?/span>TreeLoader3D树(wi)在内存(sh)打包的效率很高,大约10Bytes一|(wi)Q相当于100万棵?wi)只?/span>9.53m内存I间。这很适用于大规模林的渲染?/span>

     引擎?/span>2DQ?/span>3Dloader提供?jin)一些公用的工具c,?/span>class TreeRefQ以内联函数的性质?/span>loader提供?jin)位|,旋{Q尺寸,方向{的“get”数学q算。?/span>TreeIterator2DQ?span>TreeIterator3D则ؓ(f)loader提供?jin)?wi)指针的操作?/span>



Code Knight 2010-02-24 21:31 发表评论
]]>
[转]OGREҎ(gu)高度囑ֈ建Terrain地Ş程分析http://www.shnenglu.com/winmain/archive/2010/02/24/108370.htmlCode KnightCode KnightWed, 24 Feb 2010 13:30:00 GMThttp://www.shnenglu.com/winmain/archive/2010/02/24/108370.htmlhttp://www.shnenglu.com/winmain/comments/108370.htmlhttp://www.shnenglu.com/winmain/archive/2010/02/24/108370.html#Feedback1http://www.shnenglu.com/winmain/comments/commentRss/108370.htmlhttp://www.shnenglu.com/winmain/services/trackbacks/108370.htmlOGRE可以通过两个接口来生成地形,分别是void TerrainSceneManager::setWorldGeometry( const String& filename )以及(qing)void TerrainSceneManager::setWorldGeometry(DataStreamPtr& stream, const String& typeName )Q两者的Ҏ(gu)区别是一个是传递地形信息文件名一个是传递地形信息数据流Q设计两个接口的目的是可以让用户使用自己的地形信息配|文Ӟ而不必局限于 OGRE定义的地形信息配|文件格式。在分析程之前Q先说明一点,Z(jin)提高渲染性能以及(qing)地Ş查找性能QOGRE把整个地形分成若q个地Ş,每个地Ş又分成?jin)多个地形小块,到最后会(x)把地形页?qing)地形小块tile挂接到场景节点上。以下是生成地Ş的主要流E:(x)

一Q清除地形分U烦(ch)引缓冲及(qing)地Ş分页Q根据地形信息数据流加蝲地Ş信息配置文gQ?/span>

void TerrainSceneManager::loadConfig(DataStreamPtr& stream)Q其先将地Ş配置信息从数据流中逐一d到map中,然后通过void TerrainSceneManager::selectPageSource(const String& typeName,  TerrainPageSourceOptionList& optionList)讄地Ş数据?目前只有高度图数据源)。在地Ş信息配置文g中可以配|多个地形数据源Q然后根据一U数据源cd生成地ŞQ参?typeNameq来指定数据源cdQ目前就是HeightMapQ找到指定的数据源后Q对指定的数据源q行初始化,

 void HeightmapTerrainPageSource::initialise(TerrainSceneManager* tsm,  ushort tileSize, ushort pageSize, bool asyncLoading, TerrainPageSourceOptionList& optionList)。初始化的过E主要是调用void HeightmapTerrainPageSource::loadHeightmap(void)高度图灰度囑փ数据加蝲到内存(sh)Q如果是Raw数据Q就加蝲到mRawData中,否则加蝲到mImage中。整个加载过E其实完成了(jin)两大工作Q首先加载地形配|信息,然后加蝲高度图数据?

二:(x)初始化分U烦(ch)引缓Ԍvoid TerrainSceneManager::initLevelIndexes()Q?

三:(x)void OctreeSceneManager::resize( const AxisAlignedBox &box )

四:(x)讄地Ş材质Qvoid TerrainSceneManager::setupTerrainMaterial(void)Q?

五:(x)讄地Ş分页Q?void TerrainSceneManager::setupTerrainPages(void)

首先创徏一个名为Terrain的场景根节点的子节点

mTerrainRoot = getRootSceneNode() -> createChildSceneNode( "Terrain" );

然后初始化TerrainPage2D mTerrainPagesQ?/span>

最后调?void HeightmapTerrainPageSource::requestPage(ushort x, ushort y)requestPage只支持一个PageQ首先将囑փ数据q行~放

然后调用 “TerrainPageSource::firePageConstructedQ)(j)”通知ListenerQ然后调?#8220;TerrainPage* TerrainPageSource::buildPage(Real*heightData, const MaterialPtr& pMaterial)”创徏一个新的TerrainPage对象?/span>

buildPage()是一个比较核?j)的函数。它首先构造一?TerrainPage对象Q然后创Z个用于容UTerrainPage对象的场景节点:(x)“page->pageSceneNode = mSceneManager->createSceneNode(name);”Q然后根据对地Ş的分Ԍ循环创徏子SceneNodeQƈ且创建子场景节点对应的可渲染体TerrainRenderableQ将该可渲染体attach到这个子节点上。通过 “TerrainRenderable::initialiseQ)(j)”来创建顶Ҏ(gu)据、渲染方式等?

然后调用void TerrainSceneManager::attachPage(ushort pageX, ushort pageZ, TerrainPage* page)加入到mTerrainPages中;

然后在attachPage中调?#8220;mTerrainRoot->addChild(page->pageSceneNode);”加入到SceneGraph中?

注:(x)当前只支持一个PageQ该分页被挂接到一个称谓Terrain的场景节点上Q该场景节点下面又创Z(jin)很多子场景节点,每一个子场景节点对应一个tileQ也是一个独立的可渲染体TerrainRenderable



Code Knight 2010-02-24 21:30 发表评论
]]>
[转] OGRE地Ş配置文g解析http://www.shnenglu.com/winmain/archive/2010/02/24/108369.htmlCode KnightCode KnightWed, 24 Feb 2010 13:30:00 GMThttp://www.shnenglu.com/winmain/archive/2010/02/24/108369.htmlhttp://www.shnenglu.com/winmain/comments/108369.htmlhttp://www.shnenglu.com/winmain/archive/2010/02/24/108369.html#Feedback0http://www.shnenglu.com/winmain/comments/commentRss/108369.htmlhttp://www.shnenglu.com/winmain/services/trackbacks/108369.htmlOGRE通过配置文g生成地ŞQ极大提高(sh)(jin)地Ş生成的灵zL。下面对地Ş配置文g(terrain.cfg)各配|项的意义进行简要分析?/p>

WorldTexture=terrain_texture.jpg  //地ŞU理
DetailTexture=terrain_detail.jpg  //地Şl节U理(相机距离地面很近旉用细节纹?
DetailTile=3                      //l节U理在一个地形小块中的^铺数
PageSource=Heightmap              //高度图数据源
Heightmap.image=terrain.png       //高度囑֐U?灰度图文件名),W合2^n+1
PageSize=513                      //高度囑֤?br>TileSize=65                       //地Ş块大小
MaxPixelError=3                   //军_使用层次l节时充许误?br>PageWorldX=1500                   //地Ş在世界中的范围x方向
PageWorldZ=1500                   //z方向
MaxHeight=100                     //世界中地形最大映高?br>MaxMipMapLevel=5                  //层次l节上限
#VertexNormals=yes                //在缓冲中计算点法线Q计机光照或GPUE序用到时打开
#VertexColors=yes         //在缓冲中讄点颜色Q假如有GPUE序需要时打开
#UseTriStrips=yes                 //对于现在的硬Ӟx(chng)
VertexProgramMorph=yes         //使用点E序q行LOD融合处理
LODMorphStart=0.2                 //LOD融合开始点Q高Q低LOD之间距离之比

下列参数用于提供自己的着色程序时使用Q这?x)提供自己定义的materialQ那么先前定义的
WorldTexture ?DetailTexture的设|不再用到?/p>

MorphLODFactorParamName=morphFactor 
//假设VertexProgramMorph被设为yes,定制的material中包括一个高U顶点程序。它指定?jin)一个顶?br>//E序的参数名Q这个参数用于融合LOD,参数g0Q?Q?表示不调_(d)1表示完全调整C一ULOD
MorphLODFactorParamIndex         //用于materail中包含低U顶点程序的情况Q意义同?br>CustomMaterialName               //指定的materail名字

上述配置文g定义?jin)基于高度图的地形?/p>

q些参数定义可概括ؓ(f)两类QOgre使用W一cM高度图生地?br>mesh与材质?/p>

W二cL定制材质与GPU点E序Q这可以代替ogre自动产生的着色程序?br>另外的说明:(x)
TerrainScenceManager?x)把高度囑ֈ为多个page,每个page由几个tilel成.它们都定义了(jin)在生的mesh中一l构成正方Ş的顶炚w?br>WorldTexture定义的纹理不必与目标地Ş一样大?br>PageWorldXQPageWorldZ可以~放世界中的地Ş?br>MaxHeight 在Y方向~放地Ş?br>DetailTexture 只用一个纹理,如用多层纹理,应该使用自定义materail?br>
从程序加载地?/span>
setWorldGeometry()有重载Ş式,一U用于加载配|文Ӟ另一U我们可在程序中使用Q以
辑ֈ手工加蝲的功能。这里,SceneData?typedef 为std:map,它存储了(jin)如我们在terrain.cfg
中看到那些值对。假设我们已l从某个二进制文件读入我们想要的内容到SceneData中。我们要?br>的就是把d的内容{换成setWorldGeometry()需要的cd?/p>

Code Knight 2010-02-24 21:30 发表评论
]]>
[原]《深度探索C++对象模型》读书笔?/title><link>http://www.shnenglu.com/winmain/archive/2010/02/23/108308.html</link><dc:creator>Code Knight</dc:creator><author>Code Knight</author><pubDate>Tue, 23 Feb 2010 13:37:00 GMT</pubDate><guid>http://www.shnenglu.com/winmain/archive/2010/02/23/108308.html</guid><wfw:comment>http://www.shnenglu.com/winmain/comments/108308.html</wfw:comment><comments>http://www.shnenglu.com/winmain/archive/2010/02/23/108308.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/winmain/comments/commentRss/108308.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/winmain/services/trackbacks/108308.html</trackback:ping><description><![CDATA[1Q用初始化列表初始化参数的序不是Ҏ(gu)参数列表里声明的序Q而是Ҏ(gu)该成员变量在cM声明的顺序决定的?br>et.<br>class A<br>{<br>public:<br>   A();<br>   ~A();<br>private:<br>   int a;<br>   byte b;<br>}<br><br>A::A():b(1),a(b)<br>{<br><br>}<br><br>a的值无法确定,而b?<br><br>2Q在data语义学中<br>扑ֈ?jin)一个一q困扰过我的问题Qȝ得到解答<br>class X;<br>class A:class X;<br>class B:class X;<br>class Y:class A, class B;<br><br>sizeof(X):1<br>sizeof(A):8<br>sizeof(B):8<br>sizeof(Y):12<br><br>~译器对I类?x)做优化l予一个char的大?br>至于A,B ׃有(h)承关pd在虚函数表,size应ؓ(f)5Q在4字节对其的编译器下sizeof?Q当然设定字节对齐ؓ(f)1的话应该? <img src ="http://www.shnenglu.com/winmain/aggbug/108308.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/winmain/" target="_blank">Code Knight</a> 2010-02-23 21:37 <a href="http://www.shnenglu.com/winmain/archive/2010/02/23/108308.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Introduction To Octreeshttp://www.shnenglu.com/winmain/archive/2010/02/23/108306.htmlCode KnightCode KnightTue, 23 Feb 2010 13:18:00 GMThttp://www.shnenglu.com/winmain/archive/2010/02/23/108306.htmlhttp://www.shnenglu.com/winmain/comments/108306.htmlhttp://www.shnenglu.com/winmain/archive/2010/02/23/108306.html#Feedback0http://www.shnenglu.com/winmain/comments/commentRss/108306.htmlhttp://www.shnenglu.com/winmain/services/trackbacks/108306.html
Introduction


Hidden surface removal is among the biggest problems when writing a 3D engine.

I struggled with it since the very beginning of writing 3D engines and still have no satisfactory solution to it. The ideal visibility detection scheme would allow unlimited data, extremely dynamic worlds and would have zero overdraw. The first 3d engine which implements these three demands still has to be written.

The Z buffer for example allows dynamical worlds and even crossing faces, but it suffers from immense overdraw. The BSP-tree on the other hand, if well implemented, has no overdraw at all but needs that much pre-processing that dynamical worlds are a definite nono.

It wasn't until recently i first heard of the octree, and I must admit i was struck by it's simplicity. I never actually implemented this structure and therefore I will present no pseudo code at all. This explanation is merely an attempt to make it more clear to people who have never heard of it. Besides, if you really understand the structure, then implementation is a piece of cake.


The Octree Structure


Our virtual world or level is actually nothing more then a soup of polygons. Some of you people might have thrown in a couple of curves and voxels but most of it will be polygons. Here it is:



Fig 1. Our little level.


In the picture I just built a simple level containing no more than 250 polys. Now imagine a cube surrounding the world like in the next image:



Fig. 2. Our little level surrounded by a cube.


Now it isn't hard to see that this cube can be divided into eight smaller cubes, hence the name octree. Take a look at this picture:



Fig 3. Our little level with the surrounding cube subdivided.


Call the larger cube the parent and the smaller cubes the children. On their turn subdivide each children into eight smaller cubes, and you will notice we are creating a tree where each node has eight children.

There is still one little problem left. When should we stop dividing cubes into smaller ones? There are two possible solutions. The first one is to stop when a cube has some size smaller then a fixed number. The second one is more common. You might have noticed that every child has less polygons then it's parent. The trick is to stop subdividing when the number of polygons in a cube is smaller then some fixed number.


Creating The Octree


Trees are recursion, recursion is trees. It is as simple as that. If you have a correct definition of you cubeNode it is very easy to create an octree recursively. First of all you check all polygons against the boundarys of the cube. This is very simple cause these boundaries are all axis aligned. This means that the cube has six plane equations, which are:

  • 1. X = Q.X
  • 2. Y = Q.Y
  • 3. Z = Q.Z

  • 4. X = Q.X + cubeSize
  • 5. Y = Q.Y + cubeSize
  • 6. Z = Q.Z + cubeSize

    Where Q is the position of one corner of the cube. This are very easy equations and the all parent polygons can very easily be checked against them.

    It could occur that a polygon crosses a cube boundary. Again two possible solution are at hand. First of all we could clip the polygon against the cube, which is simple, because of the axis aligned boundarys. On the other hand we could put the polygon in all cubes it is in. This means that some cubes can contain the same polygons. In order to prevent us from drawing one poly more than one time we should have a flag on each polygon which will be set if the poly is drawn for the first time.

    The implementation of an octree is very straight forward. I haven't done it myself yet, but I will soon. It is all matter of recursion. In order to construct a tree, the first thing you should think of is recursion. Whether we are talking about binary trees, quad trees or octrees, it doesnt matter, just build the darn thing recursively. So have a class definition of one cubeNode and put the creation of the tree in it's constructor. In this constructor you will call the constructor itself for smaller cubes.


  • The Purpose Of The Octree


    An octree is actually nothing more then a data structure. It can be used for very different things. It is not only handy for visibility detection but also for collision detection, realtime shadows and many more things. The most important thing to understand about octrees is that if a parent is not important then it's children aren't either. Let's makes this a little bit more clear with an example.

    We will do this in 2d, which therefore resembles a quadtree, but with some imagination it can very easily be extended to 3d. Here we test the cubes (squares) against the viewing frustrum. Take a look at the next picture:



    Fig 4. An octree from the top and a viewing frustrum.


    In this picture a colored square that has one color was dumped without checking itKs children. As you can see some squares had to be checked all the way to the final node, but some large squares could be dumped at once. The colored squares are the ones that are outside the viewing frustrum and the greyscale ones are the one inside the viewing frustrum. As you can see this is actually a worst case scenario because the viewing frustrum crosses the middle of the surrounding square and therefore all the four children have to be checked.

    You could also apply the octree to many other things. Collision detection for example. Just check in which cube your bounding sphere or box is and you will only have to check against those faces. There are many more examples.


    Conclusion


    There is already a lot written about octrees. I tried to give my view on them in the hope somebody might read this. As you can see octrees are way easier to implement than BSP-trees (although some disagree) while offering a better structure. The main point about an octrees is that when a parent is discarded so are it's children. Actually that is all there is to it.

    Code clean, play Goldeneye and go vegetarian.

    Jaap Suter a.k.a .........

    译文Q?br>1、引aQ?span class=English>IntroductionQ?br>  隐面U除是写3D引擎时候最大的问题?sh)一?br>  Hidden surface removal is among the biggest problems when writing a 3D engine.

      在我?D引擎的开始阶D就开始和它斗争ƈ且一直没有满意的解决Ҏ(gu)。理想的可见(g)方案应当做到允许(使用Q无限的数据、大动态的世界和零重画。第一的3D引擎一直在q求实现q?个要求?br>  I struggled with it since the very beginning of writing 3D engines and still have no satisfactory solution to it. The ideal visibility detection scheme would allow unlimited data, extremely dynamic worlds and would have zero overdraw. The first 3d engine which implements these three demands still has to be written.

      Z buffer允许动态世界以?qing)即使是交叉的面Q但是得忍受大量的重甅R另一斚wQBSP?wi)如果能够被很好的实玎ͼ可以避免重画Q但是它需要大量的预处理计而且不适合动态世界?br>  The Z buffer for example allows dynamical worlds and even crossing faces, but it suffers from immense overdraw. The BSP-tree on the other hand, if well implemented, has no overdraw at all but needs that much pre-processing that dynamical worlds are a definite nono.

      直到最q我W一ơ听说了(jin)八叉?wi)?span id="ltz9lvl" class=English>OctreeQ,我必L认我被它的简易?#8220;狠狠地打?jin)一下儿”。我从来没有真正地去实现q个l构Q因此我不会(x)dC些代码。这个解释只是想让从没有听说q八叉树(wi)的h感到更清晰易懂。如果你真的?jin)解了(jin)这个结构?span id="t9xtndr" class=English>OctreeQ,实现它只是一个小意思?br>  It wasn't until recently i first heard of the octree, and I must admit i was struck by it's simplicity. I never actually implemented this structure and therefore I will present no pseudo code at all. This explanation is merely an attempt to make it more clear to people who have never heard of it. Besides, if you really understand the structure, then implementation is a piece of cake.

    2、八叉树(wi)的结?/strong>Q?span class=English>The Octree StructureQ?br>  我们的实?#8216;世界’或者说是关卡只不过是一些多边Ş。你们或许在其中加入?jin)一些曲面(CurvesQ和VoxelsQ地形实现方法的一U)(j)Q但是大多数也都是多边Ş?br>  Our virtual world or level is actually nothing more then a soup of polygons. Some of you people might have thrown in a couple of curves and voxels but most of it will be polygons. Here it is:

    ?

      ?Q我们设计的型兛_?br>  Fig 1. Our little level.

      在这张图片中我徏立了(jin)一个不过250个多边Ş?#8216;兛_’。现在想象有一个包围了(jin)q个世界的立方体Q像下一张图片那栗?br>  In the picture I just built a simple level containing no more than 250 polys. Now imagine a cube surrounding the world like in the next image:

    ?

      ?Q我们设计的兛_被一个立方体所包围着?br>  Fig. 2. Our little level surrounded by a cube.

      现在不难看出q个立方体可以被八等分ؓ(f)八个些的立方体Q所以才叫八叉树(wi)。看看这张图Q?br>  Now it isn't hard to see that this cube can be divided into eight smaller cubes, hence the name octree. Take a look at this picture:

    ?

      ?Q对围绕着兛_的立方体q行l分?br>  Fig 3. Our little level with the surrounding cube subdivided.

      大点儿的q个立方体被叫做‘父亲’些的立方体叫做‘孩子’。处理每?#8216;孩子’的时候,再ؓ(f)更小的八个立方体Q你?x)发现我们在创徏一个每个节Ҏ(gu)八个子节点(孩子Q的?wi)?br>  Call the larger cube the parent and the smaller cubes the children. On their turn subdivide each children into eight smaller cubes, and you will notice we are creating a tree where each node has eight children.

      q有一个小问题。什么时候我们该l束l分的过E呢Q有两个可行的解x(chng)法。第一个是当一个立方体的尺寸已l比一个预定的固定值小的时候。第二个更普通。你可以注意到每?#8216;孩子’都比他的‘父亲’有更的多边形。这是_(d)(x)当一个立方体包含的多边Ş数量比一个预定的固定值少的时候停止细分?br>  There is still one little problem left. When should we stop dividing cubes into smaller ones? There are two possible solutions. The first one is to stop when a cube has some size smaller then a fixed number. The second one is more common. You might have noticed that every child has less polygons then it's parent. The trick is to stop subdividing when the number of polygons in a cube is smaller then some fixed number.

    3、创建八叉树(wi)Q?span class=English>Creating The OctreeQ?br>  ?wi)是递归的,递归的是?wi)。就那么单。如果你正确的定义了(jin)你的立方体节点,那么递归地创Z个八叉树(wi)是很Ҏ(gu)的。首先,(g)查所有的多边形(多边形上位置最外面的点作ؓ(f)Q立方体的边界。这很简单因为所有边界都是和坐标轴对其的。这意味着立方体有六个q面方程Q分别是Q?br>  Trees are recursion, recursion is trees. It is as simple as that. If you have a correct definition of you cubeNode it is very easy to create an octree recursively. First of all you check all polygons against the boundarys of the cube. This is very simple cause these boundaries are all axis aligned. This means that the cube has six plane equations, which are:
    • 1. X = Q.X
    • 2. Y = Q.Y
    • 3. Z = Q.Z

    • 4. X = Q.X + cubeSize
    • 5. Y = Q.Y + cubeSize
    • 6. Z = Q.Z + cubeSize
      在这里Q是立方体一个顶角的位置。这是个很简单的方程Q而且所有的父亲多边形可以容易地用这些方E来(g)?br>  WhereQ is the position of one corner of the cube. This are very easy equations and the all parent polygons can very easily be checked against them.

      一个多边ŞI过?jin)一个立方体边界q样的事情是?x)发生的。再一ơ,有两个解x(chng)案可用。首先我们可以沿着立方体剪切这个多边ŞQ这也是很简单的Q因为(立方体的Q边界是与坐标u寚w的。还有,我们可以把一个多边Ş攑֜所有它所在的立方体里面。这意味着一些立方体可能包含着同一个多边Ş。ؓ(f)?jin)防止重M个多边ŞQ我们应当在每一个多边Ş上做一个标讎ͼ当多边ŞW一ơ被ȝ时候,讄q个标记Q当然画之前也要(g)查这个标记啦Q不q肯定媄(jing)响效率?br>  It could occur that a polygon crosses a cube boundary. Again two possible solution are at hand. First of all we could clip the polygon against the cube, which is simple, because of the axis aligned boundarys. On the other hand we could put the polygon in all cubes it is in. This means that some cubes can contain the same polygons. In order to prevent us from drawing one poly more than one time we should have a flag on each polygon which will be set if the poly is drawn for the first time.

      实现一个八叉树(wi)是很单明?jin)的事情Q我q没有自己做q,但是我不久会(x)做的。只不过是递归而已。ؓ(f)?jin)构造一个树(wi)Q第一件你该想的事情就是递归。不我们讨论的是二叉、四叉还是八叉树(wi)Q都没有区别Q都是递归的方法。所以定义一个立方体节点的类Q在构造函数里面写上创建树(wi)的代码。在q个构造函数里面,你会(x)调用到更立方体的构造函数?br>  The implementation of an octree is very straight forward. I haven't done it myself yet, but I will soon. It is all matter of recursion. In order to construct a tree, the first thing you should think of is recursion. Whether we are talking about binary trees, quad trees or octrees, it doesnt matter, just build the darn thing recursively. So have a class definition of one cubeNode and put the creation of the tree in it's constructor. In this constructor you will call the constructor itself for smaller cubes.

    4、八叉树(wi)的用?/strong>Q?span class=English>The Purpose Of The OctreeQ?br>  一个八叉树(wi)实际上就是一个数据结构。它可以用做不同的事情。不仅仅对于‘可见(g)?#8217;来说很方便,q有实时阴媄(jing)以及(qing)其它斚w。理解八叉树(wi)q程中最重要的事情是Q如果一?#8216;父亲’节点?#8216;没用’的,那么他的‘孩子’节点也同栗让我们举个例子让它更清楚?br>  An octree is actually nothing more then a data structure. It can be used for very different things. It is not only handy for visibility detection but also for collision detection, realtime shadows and many more things. The most important thing to understand about octrees is that if a parent is not important then it's children aren't either. Let's makes this a little bit more clear with an example.

      我们?D来表C它Q这样就很像一个四叉树(wi)Q但是想象一下它也可以很Ҏ(gu)的扩展到3D上。在q里我们沿着视锥Q?span class=English>viewing frustrumQ检立方体Q正方ŞQ?br>  We will do this in 2d, which therefore resembles a quadtree, but with some imagination it can very easily be extended to 3d. Here we test the cubes (squares) against the viewing frustrum. Take a look at the next picture:

    ?

      ?Q顶部视锥内的八叉树(wi)?br>  Fig 4. An octree from the top and a viewing frustrum.

      在这个图片中Q彩色的正方形是没有Q没必要Q检它?#8216;孩子’的。就像你看到的那样一些正方ŞQ灰色的一些)(j)被检直到最l节点,但是一些大的正方Ş只被涂了(jin)一U颜艌Ӏ那些彩色的正方形就是超Z(jin)视锥范围的,灰色的是在视锥范围内的。就像你看到的那Pq确实是最p糕的一U情况,因ؓ(f)视锥I过?jin)包围正方Ş的中央,所以所有的四个‘孩子’都得被检?br>  In this picture a colored square that has one color was dumped without checking it?children. As you can see some squares had to be checked all the way to the final node, but some large squares could be dumped at once. The colored squares are the ones that are outside the viewing frustrum and the greyscale ones are the one inside the viewing frustrum. As you can see this is actually a worst case scenario because the viewing frustrum crosses the middle of the surrounding square and therefore all the four children have to be checked.

      你可以应用八叉树(wi)到很多别的地斏V例如碰撞检。只(g)查你的碰撞球或者碰撞盒子所在的立方体,而且只需要检那些面。还有更多的例子?br>  You could also apply the octree to many other things. Collision detection for example. Just check in which cube your bounding sphere or box is and you will only have to check against those faces. There are many more examples.

    5、结?/strong>Q?span class=English>ConclusionQ?br>  关于八叉?wi)已l写?jin)很多?jin)。我设法表述自己对它的看法,q且希望有h?x)读到它。就像你看到的那P当提供好的结构的时候,八叉?wi)比BSP?wi)更?gu)实现Q有人持异议Q。主要的一Ҏ(gu)Q当一?#8216;父亲’节点被丢弃的时候,他的‘孩子’节点也同栯丢弃。实际上q就是全部?br>  There is already a lot written about octrees. I tried to give my view on them in the hope somebody might read this. As you can see octrees are way easier to implement than BSP-trees (although some disagree) while offering a better structure. The main point about an octrees is that when a parent is discarded so are it's children. Actually that is all there is to it.
      Code clean, play Goldeneye and go vegetarian. Jaap Suter a.k.a .........



    Code Knight 2010-02-23 21:18 发表评论
    ]]>
    [原]囑Ş学学?fn)笔?(光照着色模?http://www.shnenglu.com/winmain/archive/2010/02/23/108303.htmlCode KnightCode KnightTue, 23 Feb 2010 13:13:00 GMThttp://www.shnenglu.com/winmain/archive/2010/02/23/108303.htmlhttp://www.shnenglu.com/winmain/comments/108303.htmlhttp://www.shnenglu.com/winmain/archive/2010/02/23/108303.html#Feedback0http://www.shnenglu.com/winmain/comments/commentRss/108303.htmlhttp://www.shnenglu.com/winmain/services/trackbacks/108303.html一Q四U光照着色模?/span>

    1Q固定着?span>(constant shading)

        固定着色根本不考虑光照模型Q只是根据多边Ş颜色的烦(ch)引或RGB值绘制它?/span>

    PS:基本已经被游戏淘汎ͼ太简单的着色模?/span>

    2Q恒定着Ԍflat shdingQ?/span>

        对于每个多边形只需要根据一个顶Ҏ(gu)行光照计,然后Ҏ(gu)计算l果Ҏ(gu)个多边Şq行着Ԍq就是恒定着Ԍ也称为面片着?span>(faceted shading)Q对于由q面l成的多边Şq种Ҏ(gu)是可行的Q立方体Q,但对于由曲面l成的多边Şq种着色方式会(x)出现非你惌的结?span>.

    3Q?span>Gougraud着?/span>

      对于点之间的像素值采用两个顶点之间的插D来定Q顶点之间的颜色q渡自然Q渲染效果也比较qx(chng),没有恒定着色那L(fng)兀?/span>

    4Q?span>Phong着?/span>

      ?span>Gougraud着色类|不过优点在于q对每个像素q行?jin)法U的插|对于镜面反射效果比较好?/span>



    Code Knight 2010-02-23 21:13 发表评论
    ]]>
    OCTREE 教程http://www.shnenglu.com/winmain/archive/2010/02/23/108300.htmlCode KnightCode KnightTue, 23 Feb 2010 13:08:00 GMThttp://www.shnenglu.com/winmain/archive/2010/02/23/108300.htmlhttp://www.shnenglu.com/winmain/comments/108300.htmlhttp://www.shnenglu.com/winmain/archive/2010/02/23/108300.html#Feedback0http://www.shnenglu.com/winmain/comments/commentRss/108300.htmlhttp://www.shnenglu.com/winmain/services/trackbacks/108300.html
    对OCTREE的描q?/strong>

      OCTREE 是对3DI间q行划分Q也可以叫空间分剌Ӏ他允许你只对你?D世界中摄象机照射的区域进行作甅R他也能用于冲突(g)。下面讲一下ؓ(f)什么要q行I间分割。假设你建立?jin)一个游戏世界,q个世界有超q?00Q?00个多边Ş要画。如果你建立一个@环ƈ传递这些多边ŞQ那速度是很慢的。即使你有一块很好的昄卡,他也?x)有很大的麻烦(ch)。但是玩你游戏的玩家的显C卡不会(x)过300$。有没有一U方法只渲染摄象机看见的多边形?那就是美丽的OCTREE。他允许你快速的扑ֈ你要渲染的多边Ş?br>

    OCTREE是怎样工作?/strong>

      OCTREE工作在立方体中。最初,OCTREE从根接点开始,q个Ҏ(gu)点对齐于立方体中整个世界Q水qx(chng)场景的axis中心(j)Uѝ因此,把我们的整个世界惌成一个不可见的立方体?br> 


      现在Ҏ(gu)点存储了(jin)世界中的全部点。这是,他还是不能给我们M好处Q因Zq(sh)(x)L有的东西。我们想把这个接点分?个部分。一ơ,我们划分Ӟ?个立方体包含那最初的Ҏ(gu)点的立方体。那意味着?个立方体在上面,4个立方体在下面。请看下图:(x)


      C图中黄色轮廓U没有?br>  我们刚刚把这个世界分?个部分。想象一下如果我们有2Q?Q?个部分,我们的世界将是怎样Q我们的摄象机在世界的中_(d)向着后面靠右的角落。如果你看这些线Q你注意到在OCTREE?个结点中的第4个。这些结点包?个后面的和底结炏V这意味着我们只用d储在q些l点中的点?/font>


      我们如何(g)出我们要画的结点?如果你学q破片拣选(frustum culling),q将是很单的。你能得到这些破片的大小q检每个结点,看他是否被截断或在你的视觉破片中。有一个关于破片拣选的教程?a >http://www.gametutorials.com. 如果一个立方体截断破片Q我们就画q些l点。在q个例子中,我们切的数量是我们需要画?0%。记住,q只是我们世界中的一个部分。部分越多,我们将精。当?dng)我们不?x)需要太多的炏V下面,我们来看一下下面的图:(x)


      在上面这q图中,你将发现许多的不同。这个例子中Q不是在原始?个立方体的每一个结点中建立8个新的立方体。原始的8个结点的和底面没有l分。你L把一个结点分?个或更多的结点,但是Q如果在q个面没有三角Ş可以存储Q我们将忽视q个l点q不l他分配内存。如果我们进一步的l分Q更多的l点Ş成原始的世界。如果我们变换到另一个部分,那立方体相似的变换。ؓ(f)?jin)说明这一点,L(fng)图:(x)


      在图中,有两个球Q但是方向相反。注意左边的部分Q他那世界分成2个结点,不是8个。这是因为球只要2个结炏V请看右边的球是不是和左边的很相伹{这q图告诉我们Q只昄需要的部分l点。如果没有三角Ş占用I间Q结点将不会(x)建立?br>

    何时停止l分

      现在Q我们明白了(jin)如何l分Q但是我们也需要知道怎样停止l分。有许多的方法:(x)
      1。如果当时的三角形数量少于我们定义的最大的三角形数量,我们可以停止l分当前的结炏VD个例子,我们定义三角形的最大数量ؓ(f)100。这意味着我们在细分结点之前,要检一下当前三角Ş的L量是否小于或{于我们定义的最大数量,然后再做军_。如果数量少于或{于Q我们将停止l分q指定这些三角Ş到那个结炏V请注意我们从不指定M三角形到Ml点Q除非他是末l点。如果我们划分一个结点,我们不能存储三角形到那个l点Q但是可以存储在他的子结Ҏ(gu)他们的子l点中,甚至C们的子中Q等{。当我们复习(fn)?jin)怎样?C?wi)后Q将?x)有更多的?jin)解?br>
      2。另一个方法是在停止细分时Q看我们是否l分的数目是否超q了(jin)l分的标准。例如,我们可以先徏立细分的标准?0Q如果细分的数量大于q个标准Q我们将停止q指定这些在立方体中q个面的点到那个结炏V当我们?#8220;大于q个标准”意味着l分的数量有11个?br>
      3。最后的Ҏ(gu)是看l点数是否超q结点变量定义时的倹{例如,我们讄l点变量的gؓ(f)500。每ơ,我们建立一个结点,相应的结Ҏ(gu)增加1。然后在我们每次建立另一个结Ҏ(gu)Q检一下我们当前的l点数是否超q结点变量。如果结Ҏ(gu)?01Q我们将不会(x)l分q个l点Q但是指定他的当前顶点给他。我自己?1?的方法,但是1?也很好,因ؓ(f)你可以测试不同的l分的标准?br>
     
    怎样画OCTREE

      OCTREE建立后,我们可以画我们需要的l点。那些立方体不是全部包含在我们的视觉中的Q只有一部分。这是我们Z么要计算每个l点的三角Ş的数量,如果我们只需要一个结点中的一部分Q这h们就不需要画成千上万个三角Ş。我们从根目录开始画OCTREE。对于每个结炚w存储着一个中?j)点。这是非常好的,比如在下面这个函CQ?br>
      //q个函数取走立方体(XQYQZQ的中心(j)点和他的大小Qwidth/2)
      bool CubeInFrustum(float x,float y,float z,float size);

      q个函数q回true or false,是由立方体是否在破片中决定的。如果立方体在破片中Q我们将(g)所有他的结点,看他们是否在破片中,否则我们忽U树(wi)中的整个分枝。当我们得到?jin)破片中的结点,但是没有Ml点在他下面。我们想ȝ点存储在末l点中。记住,只有末结Ҏ(gu)点存储。看下面的图Q?/font>


      有阴q立方体是在破片中。白色的立方体不是在破片中。这里显CZ(jin)l分?层?br>

    OCTREE 中的冲突

      OCTREE 不是用于渲染Q但是用于冲H检很好。随着游戏的发展,冲突(g)也在改变,你将不得不在游戏世界中运用自q式(g)你的角色或目标是否冲突。下面是一些冲H检的例子Q?br>  1。你徏立一个函数允怽转?DI间中的点到你的OCTREEq返回在q个点周围的点。你{递的那个Ҏ(gu)你的角色和目标的中心(j)炏V这虽然可以工作一端时_(d)但如果这个点靠近一个立方体的边时呢Q你的角色或目标可能和另一个立方体的顶点相冲突。ؓ(f)?jin)解册个问题,你将做一些事情。你可以转递角?目标的半径或一定的I间Q然后检半径或一定的I间是否和周围的l点相冲H。这׃的角?目标的Ş状决定。下面是一些典型的函数Q?br>
      //q个函数取走角色/目标QXQYQZQ的中心(j)点ƈq回靠近他的点
      CVector3 *GetVerticesFromPoint(float x,float y,float z);

      //q个函数取走角色/目标QXQYQZQ的中心(j)点和半径Q然后返回和他冲H的l点中的点
      CVector3 *GetVerticesFromPointAndRadius(float x,float y,float z,float radius);

      //q个函数取走角色/目标QXQYQZQ的中心(j)点和立方体的大小Q然后返回和他冲H的l点中的点
      CVector3 *GetVerticesFromPointAndCube(float x,float y,float z,float size);

      我相信你有更好的Ҏ(gu)快速的(g),在这里只是给你一点基?br>

    ȝ

      q篇教程只是l你讲截如何建立自己的OCTREE。关于这文章中的代码在www.gametutorials.comQ我希望q篇文章对你有用?br>

    中文译者:(x)antking
    http://akinggame.gameres.com
    q篇文章的英文版?a >http://www.gametutorials.com/Tutorials/OpenGL/Octree.htm

    Ben Humphrey (DigiBen)
    Game Programmer
    DigiBen@GameTutorials.com
    Co-Web Host of www.GameTutorials.com



    Code Knight 2010-02-23 21:08 发表评论
    ]]>
    total commader插g~写http://www.shnenglu.com/winmain/archive/2010/02/19/108069.htmlCode KnightCode KnightFri, 19 Feb 2010 06:53:00 GMThttp://www.shnenglu.com/winmain/archive/2010/02/19/108069.htmlhttp://www.shnenglu.com/winmain/comments/108069.htmlhttp://www.shnenglu.com/winmain/archive/2010/02/19/108069.html#Feedback0http://www.shnenglu.com/winmain/comments/commentRss/108069.htmlhttp://www.shnenglu.com/winmain/services/trackbacks/108069.html      新的一q_(d)要开始工作了(jin)Q今天看看自q?sh)脑Q感觉好乱,x(chng)所有的资料全扔qTotal commander里,也想写一些插件来做一些额外的工作Q比如把?sh)?jing)音乐打上tag或写上评论待以后方便查看{,先存?sh)文章,以后有空的时候动手做q些事情的时候也许有用?br>
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////华丽分割U?br>      应nevermind版主之约Q写?strong style="BACKGROUND-COLOR: rgb(153,255,153); COLOR: black">插g
    开发的一个GuildQ简单介l了(jin)如何为TC开发一?strong style="BACKGROUND-COLOR: rgb(153,255,153); COLOR: black">插g
    以及(qing)插g的基本工作过E,仅仅是一个入门介l,详细的编E细节需要从|上下蝲帮助Q下面文章中都给Z(jin)下蝲地址?br>
    首先声明Q本文撰写背景是TC 6.03aQ?.5?x)加入新?strong style="BACKGROUND-COLOR: rgb(153,255,153); COLOR: black">插g内容Q但估计向下兼容应该是没有问题的?br>众所周知QTC?strong style="BACKGROUND-COLOR: rgb(153,255,153); COLOR: black">插g现在分ؓ(f)3c,Lister插gQ?wlxQ、FileSystem插gQ?wfxQ和Packer插gQ?wcxQ(另外q有传说?.5新加的Content插gQ?wdxQ,现在q(sh)见庐q面目Q先按下不表Q。尽扩展名I上?jin)不同的马甲Q但其本质都是一L(fng)Q都是Windows的DLL动态链接库Q我们需要做的仅仅是按照TC的规范,实现其给定的DLL接口函数Q最后把 dll扩展名改成相应扩展名׃事大吉了(jin)Q用不同的扩展名,只不q其容易区分而已Q?br>
    1. 开发方法、环境和工具
    如前所qͼTC插g本质上都是Windows的DLL动态链接库Q其开发方法和普通的DLLE序开发ƈ没有什么不同,M一个可用来开发DLL的环境和工具都可以用来开发TC插g?br>因此Q写TC插g首先得熟(zhn)DLL?strong style="BACKGROUND-COLOR: rgb(255,153,153); COLOR: black">~写Q更高(sh)点的要求是熟(zhn)一些常用的Windows APIQ对于一个程序员老手来说应该是很Ҏ(gu)的事情,而用什么开发环境和工具都是ơ要的。但是对于新手,W者推荐用VC或者Delphi?strong style="BACKGROUND-COLOR: rgb(255,153,153); COLOR: black">~写Q一斚w的原因是TC作者提供的函数头文件声明只有C/C++和PascalQ可以省却改写成别的语言的麻?ch);另一斚w原因是TC作者给的帮助、例子,甚至|上公开源码?strong style="BACKGROUND-COLOR: rgb(153,255,153); COLOR: black">插g大都是基于此两种环境的,而有一个可参考的源码例子能在很大E度上提?strong style="BACKGROUND-COLOR: rgb(255,153,153); COLOR: black">~写帮助。另外由于TC作者提供的例子QVC环境下)(j)已经搭徏起了(jin) 插g的整个框Ӟ我们甚至可以直接在此例子上修改开发?br>
    Lister插g的官Ҏ(gu)码例子:(x)http://ghisler.fileburst.com/lsplugins/listplugsample.zip?br>FS插g的官Ҏ(gu)码例子:(x)http://ghisler.fileburst.com/fsplugins/sampleplugin.zip?br>其它W??strong style="BACKGROUND-COLOR: rgb(153,255,153); COLOR: black">插g的源码例子可以从以下各个插g站点扑ֈQ?br>http://www.ghisler.com/plugins.htm
    http://www.totalcmd.net
    http://clubtotal.free.fr

    2. Lister 插g
    首先说明一下Lister插g的工作过E:(x)默认快捷键情况下Q当在TC中对一个文件按下F3或者Ctrl+Q的时候,TC?x)检查wincmd.ini中[ListerPlugins]一节,以下是个例子Q?br>[ListerPlugins]
    0=%COMMANDER_PATH%\plugins\Imagine\Imagine.wlx
    0_detect="MULTIMEDIA"
    1=%COMMANDER_PATH%\plugins\FlashView\FlashView.wlx
    1_detect="([0]="F" & [1]="W" & [2]="S")|([0]="C" & [1]="W" & [2]="S")"

    TC?x)顺序检查该节中每个插g对应的x_detect字段Q该字段实际上是一个逻辑判断表达式,如果此表辑ּl果为真QTC׃(x)Load?strong style="BACKGROUND-COLOR: rgb(153,255,153); COLOR: black">插gq调用其ListLoad函数Q否则检查下一?strong style="BACKGROUND-COLOR: rgb(153,255,153); COLOR: black">插g。如?strong style="BACKGROUND-COLOR: rgb(153,255,153); COLOR: black">插g对应的x_detect字段Ҏ(gu)׃存在QTC?x)??strong style="BACKGROUND-COLOR: rgb(153,255,153); COLOR: black">插g的ListGetDetectString函数Q如果此函数存在QTC?x)将函数的返回结果保存在x_detect字段中再(g)查,如果此函C然不存在Q则TCq接调?strong style="BACKGROUND-COLOR: rgb(153,255,153); COLOR: black">插g的ListLoad函数。最后,如果调用?jin)ListLoad函数Q还要判断该 函数的返回|如果该值是一个Windows句柄Q则插g调用成功Q若q回gؓ(f)0QNULLQ,则调用失败,l箋(hu)(g)查下一?strong style="BACKGROUND-COLOR: rgb(153,255,153); COLOR: black">插g?br>
    Lister插g的详l接口函Cl可以从|上下到Qhttp://ghisler.fileburst.com/lsplugins/listplughelp1.2.zip?br>
    实际上,Lister插g必需的函数只有ListLoad一个,它是插g的核?j)实现函数?strong style="BACKGROUND-COLOR: rgb(153,255,153); COLOR: black">插g必须在此函数中读入文件内容,创徏一个窗口ƈ昄文g内容Q最后返回这个窗口的句柄QLister?x)获得ƈSubclass该句柄,q在Lister内显C?br>
    其余的接口函数都是可选函敎ͼ但其中有两个比较重要的函敎ͼ(x)ListGetDetectString和ListCloseWindowQ这两个函数与ListLoad一h成了(jin)插g的主q部分?br>
    ListGetDetectString虽然是可选函敎ͼ但是我强烈徏议实现这个函敎ͼq对Lister的效率有很大的媄(jing)响。从Lister工作q程可以看出Q这个函C仅是?strong style="BACKGROUND-COLOR: rgb(153,255,153); COLOR: black">插gW一ơ被调用时才被调用,功能是返回一个检字W串以填写x_detec t字段Q在此之后,Lister都将只检查此字段以决定是否调?strong style="BACKGROUND-COLOR: rgb(153,255,153); COLOR: black">插g。因此,一个好的检字W串可以让Listerq速判?strong style="BACKGROUND-COLOR: rgb(153,255,153); COLOR: black">插g是否适用于显C文Ӟ如果没有q个QLister每次昄文g都将不得不把插g一个个都Loadq来、分配空间、调用ListL oadQ直到找C个合适的Q这个速度可是偏离?jin)Lister快速查看的本意。例如:(x)(g)字W串?#8220;ext="HTM" | ext="HTML"”Q这时TC只需要根据文件扩展名是否是htm或html可以直接判断该插g是否适合Q而无需dM文gQ这是Z么在插g众多的时候,Lister仍然能很快显C的原因。当?dng)在某些情况下Q确实难以给Z个合适的(g)字W串Q这p求ListL oad函数在文件类型判断上的速度应该可能快?br>
    ListColseWindow是在用户关闭Lister或在Lister中显C另一个文件时被调用,如果此函C存在QLister直接调用DestroyWindow()关闭插gH口。通常情况下,我们需要在q里做窗口关闭时的善后工作,包括释放 资源{等?br>
    除以?个函数外Q其它的几个可选函数都涉及(qing)一些具体的附加功能Q取决于具体需求?br>
    2. FileSystem插g
    与Lister插g不同Q当用户安装一个FS插gӞ?strong style="BACKGROUND-COLOR: rgb(153,255,153); COLOR: black">插g׃(x)被第一ơLoadq来Qƈ调用FsGetDefRootName以获?strong style="BACKGROUND-COLOR: rgb(153,255,153); COLOR: black">插g名称Q也是该FS根目录的名字Q如果这个函C存在QTC?x)直接用wfx文g的名字做插g名称Q去掉文件扩展名Q?Q该名称?x)保存在wincmd.ini文g[FileSystemPlugins]一节,下面是个例子Q?br>[FileSystemPlugins]
    Linux-drives=%COMMANDER_PATH%\plugins\ex2fs\ex2fs.wfx
    Calendar=%COMMANDER_PATH%\plugins\calendar\calendar.wfx
    Shared files=%COMMANDER_PATH%\plugins\netmon\NetMon.wfx
    q样Q当用户q入|上dӞTC不需要Load插g可以把所?strong style="BACKGROUND-COLOR: rgb(153,255,153); COLOR: black">插g列出来,插g只有在用戯图进入FS插g目录时才真正被Loadq来?br>
    大致l构上,FS插g需要提供的接口函数与一个真正文件系l的基本函数有些cM。其必需的函数有4个:(x)FsInit、FsFindFirst、FsFindNext?FsFindCloseQ是不是看了(jin)很眼熟,和qx(chng)列D一个目录下所有文件所用的函数 l构一栗顾名思义QFsInit是用?strong style="BACKGROUND-COLOR: rgb(153,255,153); COLOR: black">插g初始化的函数Q同时TC?x)传l?strong style="BACKGROUND-COLOR: rgb(153,255,153); COLOR: black">插g3个TC提供lFS插g调用的callback函数地址Q下面会(x)介绍Q;FsFindFirst和FsFindNext用于列D一个目录下所有的文gQFsFindClose?于终止FsFindFirst/FsFindNext的文件列举。有?jin)?个函敎ͼ构成了(jin)最的FS插gQ就可以览F(tun)S插g的各个目录了(jin)?br>
    有了(jin)文g目录l构后,到?jin)根据需要提供各U文件功能的时候了(jin)Q包括删除文件FsDeleteFileQ删除目录FsRemoveDirQ徏立目?FsMkDirQ执行文件FsExecuteFileQ设|文件属性FsSetAttrQ设|文件时间Fs SetTimeQ拷贝文件FsGetFile/FsPutFile/FsRenMovFile。大致上都和普通文件操作功能差不多Q需要说明的是拷贝文Ӟ׃FS插g的特D性,拯文g分成?U情况:(x)FsGetFile是从FS中往(xin)本地盘拯QFsPutFile是从本地盘往(xin)FS拯QFsRenMovFile?在FS内部拯、移动或重命名文件?br>
    此外Q根据FS插g的需要,TCq提供了(jin)3个callback函数以供其调用:(x)
    1) ProgressProcQ用于显CZ个进度条Q例如拷贝文件时的进度条?
    2) LogProcQ用于显CFTP工具栏,插g可以在工h中显Clog信息Qƈ写入log文g。如果显CZ(jin)FTP工具栏,点击“断开q接”按钮时还调?strong style="BACKGROUND-COLOR: rgb(153,255,153); COLOR: black">插g的FsDisconnect函数?br>3) RequestProcQ用于显CZ个输入对话框Q例如要求用戯入用户名和密码等{?br>
    最后,FS插gq可以实C个函数FsStatusInfoQ如果这个函数被实现QTC在调?strong style="BACKGROUND-COLOR: rgb(153,255,153); COLOR: black">插g的Q何函敎ͼ除了(jin)FsInit和FsDisconnectQ之前和之后都将调用此函敎ͼ以方?strong style="BACKGROUND-COLOR: rgb(153,255,153); COLOR: black">插g释放资源{等操作?br>
    FS插g的详l接口函Cl可以从|上下蝲Qhttp://ghisler.fileburst.com/fsplugins/fspluginhelp1.3.zip?br>
    2. FileSystem插g
    与Lister插g不同Q当用户安装一个FS插gӞ?strong style="BACKGROUND-COLOR: rgb(153,255,153); COLOR: black">插g׃(x)被第一ơLoadq来Qƈ调用FsGetDefRootName以获?strong style="BACKGROUND-COLOR: rgb(153,255,153); COLOR: black">插g名称Q也是该FS根目录的名字Q如果这个函C存在QTC?x)直接用wfx文g的名字做插g名称Q去掉文件扩展名Q?Q该名称?x)保存在wincmd.ini文g[FileSystemPlugins]一节,下面是个例子Q?br>[FileSystemPlugins]
    Linux-drives=%COMMANDER_PATH%\plugins\ex2fs\ex2fs.wfx
    Calendar=%COMMANDER_PATH%\plugins\calendar\calendar.wfx
    Shared files=%COMMANDER_PATH%\plugins\netmon\NetMon.wfx
    q样Q当用户q入|上dӞTC不需要Load插g可以把所?strong style="BACKGROUND-COLOR: rgb(153,255,153); COLOR: black">插g列出来,插g只有在用戯图进入FS插g目录时才真正被Loadq来?br>
    大致l构上,FS插g需要提供的接口函数与一个真正文件系l的基本函数有些cM。其必需的函数有4个:(x)FsInit、FsFindFirst、FsFindNext?FsFindCloseQ是不是看了(jin)很眼熟,和qx(chng)列D一个目录下所有文件所用的函数 l构一栗顾名思义QFsInit是用?strong style="BACKGROUND-COLOR: rgb(153,255,153); COLOR: black">插g初始化的函数Q同时TC?x)传l?strong style="BACKGROUND-COLOR: rgb(153,255,153); COLOR: black">插g3个TC提供lFS插g调用的callback函数地址Q下面会(x)介绍Q;FsFindFirst和FsFindNext用于列D一个目录下所有的文gQFsFindClose?于终止FsFindFirst/FsFindNext的文件列举。有?jin)?个函敎ͼ构成了(jin)最的FS插gQ就可以览F(tun)S插g的各个目录了(jin)?br>
    有了(jin)文g目录l构后,到?jin)根据需要提供各U文件功能的时候了(jin)Q包括删除文件FsDeleteFileQ删除目录FsRemoveDirQ徏立目?FsMkDirQ执行文件FsExecuteFileQ设|文件属性FsSetAttrQ设|文件时间Fs SetTimeQ拷贝文件FsGetFile/FsPutFile/FsRenMovFile。大致上都和普通文件操作功能差不多Q需要说明的是拷贝文Ӟ׃FS插g的特D性,拯文g分成?U情况:(x)FsGetFile是从FS中往(xin)本地盘拯QFsPutFile是从本地盘往(xin)FS拯QFsRenMovFile?在FS内部拯、移动或重命名文件?br>
    此外Q根据FS插g的需要,TCq提供了(jin)3个callback函数以供其调用:(x)
    1) ProgressProcQ用于显CZ个进度条Q例如拷贝文件时的进度条?
    2) LogProcQ用于显CFTP工具栏,插g可以在工h中显Clog信息Qƈ写入log文g。如果显CZ(jin)FTP工具栏,点击“断开q接”按钮时还调?strong style="BACKGROUND-COLOR: rgb(153,255,153); COLOR: black">插g的FsDisconnect函数?br>3) RequestProcQ用于显CZ个输入对话框Q例如要求用戯入用户名和密码等{?br>
    最后,FS插gq可以实C个函数FsStatusInfoQ如果这个函数被实现QTC在调?strong style="BACKGROUND-COLOR: rgb(153,255,153); COLOR: black">插g的Q何函敎ͼ除了(jin)FsInit和FsDisconnectQ之前和之后都将调用此函敎ͼ以方?strong style="BACKGROUND-COLOR: rgb(153,255,153); COLOR: black">插g释放资源{等操作?br>
    FS插g的详l接口函Cl可以从|上下蝲Qhttp://ghisler.fileburst.com/fsplugins/fspluginhelp1.3.zip?

    Code Knight 2010-02-19 14:53 发表评论
    ]]>地Ş昄?/title><link>http://www.shnenglu.com/winmain/archive/2010/02/05/107307.html</link><dc:creator>Code Knight</dc:creator><author>Code Knight</author><pubDate>Fri, 05 Feb 2010 13:27:00 GMT</pubDate><guid>http://www.shnenglu.com/winmain/archive/2010/02/05/107307.html</guid><wfw:comment>http://www.shnenglu.com/winmain/comments/107307.html</wfw:comment><comments>http://www.shnenglu.com/winmain/archive/2010/02/05/107307.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/winmain/comments/commentRss/107307.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/winmain/services/trackbacks/107307.html</trackback:ping><description><![CDATA[  <img border=0 src="http://www.shnenglu.com/images/cppblog_com/winmain/tlscene.jpg"> <img src ="http://www.shnenglu.com/winmain/aggbug/107307.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/winmain/" target="_blank">Code Knight</a> 2010-02-05 21:27 <a href="http://www.shnenglu.com/winmain/archive/2010/02/05/107307.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>QT记之在VS2005中用QThttp://www.shnenglu.com/winmain/archive/2010/01/31/106885.htmlCode KnightCode KnightSun, 31 Jan 2010 06:44:00 GMThttp://www.shnenglu.com/winmain/archive/2010/01/31/106885.htmlhttp://www.shnenglu.com/winmain/comments/106885.htmlhttp://www.shnenglu.com/winmain/archive/2010/01/31/106885.html#Feedback0http://www.shnenglu.com/winmain/comments/commentRss/106885.htmlhttp://www.shnenglu.com/winmain/services/trackbacks/106885.html    如何在Windowsq_下用QT开发?
        一Q下载SDK?br>       请去官网(QT被NOKIA收购Q貌g用协议更宽松?jin)?j)下蝲win版本的QTSDK包。(地址如不知请癑ֺGOOGLE之)(j)
        二,讄开发环境相兛_?br>       pȝ环变QPATH下加入:(x)(yourqtinstallpath)\bin
                     d新的环境变量,名字?QMAKESPEC",gؓ(f)"win32-msvc2005".
           VS2005环境Qinclude和lib分别包含qt的include目录和qt的lib目录
        ? ~译你所需要的QT Lib
          通过"开?菜单 -> "Microsoft Visual Studio 2005" -> "Visual Studio Tools", q行命o(h)行(勿用cmdQ找不到nmake)
          (yourqtinstallpath)>configure -no-stl -no-dsp -vcproj
          待QMake完成 l箋(hu)单的敲入nmake卛_Q等待编译吧Q?br>    ?创徏QT工程 helloworld
           有三U办法把QT代码生成为VS工程
           1Q用qmake,如代码在C盘(sh)
           C:\> qmake -project -t vcapp -o projectname.pro
           C:\> qmake
           2Q编写pro工程文g。如果是商业版的׃用了(jin)。具体可以参考帮助文档qmake。新事本文gQ文件名修改为hello.proQ文件名没有 Ҏ(gu)要求哈;输入

            SOURCES +=main.cpp
            CONFIG +=qt

            ok 保存?/p>

            打开命o(h)行,切换目录到hello.cpp所在目录。生成Makefile文gQ输入:(x)

        qmake -o Makefile hello.pro Q?

        接下来生成项目文?vcproj文g?

        qmake -tp vc -o hello.vcproj hello.pro

       3Q直接?span class=ColorResultsClass highlight="true" realoffset="1237" alpha-value="20">Qt Visual Studio Integration v1.2.2 for.VS.2003.2005插g(详见http://blog.csdn.net/znf19850924/archive/2008/01/16/2047373.aspx)

        需要配|?span class=ColorResultsClass highlight="true" realoffset="1384" alpha-value="20">如下Q?/strong>
             "Tools" -> "Options" -> "Qt" -> "Builds", d我们刚才~译?span class=ColorResultsClass highlight="true" realoffset="1405" alpha-value="20">Qt代码,名字?Qt 4.3.2", 路径?yourqtinstallpath)

         启动一个新的工E?
             选择"Qt projects" -> "Qt Application"cd,输入工程名字,单击OK.

         双击工程文g里面?test.ui",马上出现?jin)所见及(qing)所得的H体~辑?在上面添加一个按?

         双击按钮,产生相应的消息响应函?

         d头文?
             #include <QMessageBox>

             在函数void Test::on_pushButton_clicked()体内d如下代码:
             QMessageBox box(this);
             box.setText("Haha, hit me.");
             box.exec();

        
           PS:另外可以直接使用QTSDK自带安装的QTCreate来进行QT工程Q在安装好SDK后不需要进行Q何配|就能够q行DEMOq看到效果,可能自n已经配置好,但是如何引入到VS中,暂时q(sh)知道Q没有研I?br>

    Code Knight 2010-01-31 14:44 发表评论
    ]]>
    W一个场?/title><link>http://www.shnenglu.com/winmain/archive/2010/01/15/105785.html</link><dc:creator>Code Knight</dc:creator><author>Code Knight</author><pubDate>Fri, 15 Jan 2010 15:51:00 GMT</pubDate><guid>http://www.shnenglu.com/winmain/archive/2010/01/15/105785.html</guid><wfw:comment>http://www.shnenglu.com/winmain/comments/105785.html</wfw:comment><comments>http://www.shnenglu.com/winmain/archive/2010/01/15/105785.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/winmain/comments/commentRss/105785.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/winmain/services/trackbacks/105785.html</trackback:ping><description><![CDATA[<p>           qԌ整了(jin)半个月ȝZ(jin)天龙的第一个场景:(x)林。天下武功出林... <br></p> <p><img src="http://www.shnenglu.com/images/cppblog_com/winmain/tianlong1.JPG" border=0><br></p> <p><img src="http://www.shnenglu.com/images/cppblog_com/winmain/tianlong2.JPG" border=0><br></p> <p><br>U理好像q有些问?...<br><br></p> <img src ="http://www.shnenglu.com/winmain/aggbug/105785.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/winmain/" target="_blank">Code Knight</a> 2010-01-15 23:51 <a href="http://www.shnenglu.com/winmain/archive/2010/01/15/105785.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OGRE贴花分类http://www.shnenglu.com/winmain/archive/2010/01/14/105618.htmlCode KnightCode KnightWed, 13 Jan 2010 16:03:00 GMThttp://www.shnenglu.com/winmain/archive/2010/01/14/105618.htmlhttp://www.shnenglu.com/winmain/comments/105618.htmlhttp://www.shnenglu.com/winmain/archive/2010/01/14/105618.html#Feedback0http://www.shnenglu.com/winmain/comments/commentRss/105618.htmlhttp://www.shnenglu.com/winmain/services/trackbacks/105618.html法线贴花Q根据所在位|的法线自动调整贴花朝向Q不要求紧脓(chung)Q?/p>

    模型贴花Q根据脓(chung)花所在的|格自动生成模型Q一般脓(chung)图)(j)

    投媄(jing)贴花Q利用投q理的方式实现的脓(chung)花(frustumQ?/p>

    |格贴花Q创建指定大的|格贴花Q然后自动调整网格的位置QmeshQ脓(chung)图)(j)




    Code Knight 2010-01-14 00:03 发表评论
    ]]>
    ?/title><link>http://www.shnenglu.com/winmain/archive/2009/12/29/104407.html</link><dc:creator>Code Knight</dc:creator><author>Code Knight</author><pubDate>Tue, 29 Dec 2009 13:54:00 GMT</pubDate><guid>http://www.shnenglu.com/winmain/archive/2009/12/29/104407.html</guid><wfw:comment>http://www.shnenglu.com/winmain/comments/104407.html</wfw:comment><comments>http://www.shnenglu.com/winmain/archive/2009/12/29/104407.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.shnenglu.com/winmain/comments/commentRss/104407.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/winmain/services/trackbacks/104407.html</trackback:ping><description><![CDATA[<img src="http://www.shnenglu.com/images/cppblog_com/winmain/screenshot_2.png" border="0"><img src="http://www.shnenglu.com/images/cppblog_com/winmain/screenshot_1.png" border="0"><br> <img src ="http://www.shnenglu.com/winmain/aggbug/104407.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/winmain/" target="_blank">Code Knight</a> 2009-12-29 21:54 <a href="http://www.shnenglu.com/winmain/archive/2009/12/29/104407.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OGRE记http://www.shnenglu.com/winmain/archive/2009/12/28/104319.htmlCode KnightCode KnightMon, 28 Dec 2009 15:15:00 GMThttp://www.shnenglu.com/winmain/archive/2009/12/28/104319.htmlhttp://www.shnenglu.com/winmain/comments/104319.htmlhttp://www.shnenglu.com/winmain/archive/2009/12/28/104319.html#Feedback0http://www.shnenglu.com/winmain/comments/commentRss/104319.htmlhttp://www.shnenglu.com/winmain/services/trackbacks/104319.html2,node的默认position是原?br>3,材质脚本中定义的E序D中的source文g名后~必须与定义的shader文gcd匚w?br>如:(x)
    vertex_program Ogre/CelShadingVP1 hlsl
    {
        source Example_CelShading1.hlsl
        entry_point main_vp
        target vs_2_0
    }
    注意target是hlsl中独?cg中是profile,且参C?br>4QPlugin_CgProgramManager_d.dll 插g一定要有cg.dll配合
    5QOGRE不支持的中文路径用下面解冻I(x)
    setlocale(LC_ALL, "chinese-simplified");
    记得d完资源要q原
    6Q?nbsp;   Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups()一定要在rendersystem初始化完毕才能调用。也是在root的createRenderWindow 之后
    7Q想要你的OIS中的mouse何keboard响应你得记得在frameStarted 中每ơ去capture;
    记得?nbsp;          
    mKeyboard = static_cast<OIS::Keyboard*>(mInputManager->createInputObject(OIS::OISKeyboard, true));
    mMouse = static_cast<OIS::Mouse*>(mInputManager->createInputObject(OIS::OISMouse, true));
    之后
    mMouse->setEventCallback(this);
    mKeyboard->setEventCallback(this);






    Code Knight 2009-12-28 23:15 发表评论
    ]]>
    þAV| ޹˾þһWWW| þþþAV| ǾþþƷ| seguiþùƷ| þþþùһ| ޹Ʒþþѿ| 99ξþþŷƷվ | ҹƷþ| þҹ1000ϼ| 2021ٸþþþþþþþ| ҹþþþƷӰԺ| ھƷþþþþþcoent| Ʒþþþþ| ҹƷþþþþž| ƷþþþþĻ| 99þþþƷѹۿ| ɫۺϾþ88ɫۺ | Ʒþۺ| 2020þþƷۺһ| Ʒ99Ʒþ| ľƷþþþ| þ99Ʒ鶹| 97þþƷһ| þþAVҰ| þӰԺþ㽶߿ۿ| ݺɫþۺ| Ʒþþþþþþ | þݺҹҹ| ɫվþþþۺywww| 99þۺϹƷ| ƷŮþþþAV | 7777Ʒ˾þþô߽| þþƷav٤| þѾƷһ| þ޹Ʒһ| 99þþþƷѹۿ| ݺݺɫۺϾþ| ޳ɫwwwþվҹ| Ů޾Ʒþþۺ| 99þۺϹƷ|