<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-777077092642445515</id><updated>2011-04-22T03:45:42.218+08:00</updated><category term='ShatteredRuby'/><category term='OGRE'/><category term='Math'/><category term='Kirikiri'/><category term='EeePC'/><category term='Python-Ogre'/><category term='OpenGL'/><category term='Erlang'/><category term='TJS'/><title type='text'>大鳥考古學</title><subtitle type='html'>封存舊文章的地方</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://birdy-party.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://birdy-party.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Mr. BigCat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>31</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-777077092642445515.post-5198724065866622017</id><published>2008-09-15T23:32:00.000+08:00</published><updated>2008-09-15T23:33:17.598+08:00</updated><title type='text'>封存網誌</title><content type='html'>這個網誌將不再更新，僅用於封存以前的文章，也不再提供留言功能。之前的文章我僅挑了些可能有用的出來，其他的都刪掉了。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/777077092642445515-5198724065866622017?l=birdy-party.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://birdy-party.blogspot.com/feeds/5198724065866622017/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=777077092642445515&amp;postID=5198724065866622017' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/5198724065866622017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/5198724065866622017'/><link rel='alternate' type='text/html' href='http://birdy-party.blogspot.com/2008/09/blog-post.html' title='封存網誌'/><author><name>Mr. BigCat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-777077092642445515.post-7500225416080247722</id><published>2008-09-15T22:36:00.000+08:00</published><updated>2008-09-15T22:37:45.571+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Erlang'/><title type='text'>以Erlang實作Port Mapping</title><content type='html'>最近又開始在閒暇時看Erlang的東西....&lt;br /&gt;練習寫了一些簡單的東西，如這個映射TCP Port的程式 (將本地port映設到其他host的port)&lt;br /&gt;例如 tcp_bridge:start("ptt.cc", 23, 1000) 後， telnet localhost:1000就會連到ptt bbs&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/10871.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;其實上面的實作碼潛藏著一些問題，但是當作一個telnet的跳版已經夠用了。&lt;br /&gt;這個邏輯以Erlang實作算是相當精簡的。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/777077092642445515-7500225416080247722?l=birdy-party.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://birdy-party.blogspot.com/feeds/7500225416080247722/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=777077092642445515&amp;postID=7500225416080247722' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/7500225416080247722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/7500225416080247722'/><link rel='alternate' type='text/html' href='http://birdy-party.blogspot.com/2008/09/erlangport-mapping.html' title='以Erlang實作Port Mapping'/><author><name>Mr. BigCat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-777077092642445515.post-5938511658743251276</id><published>2008-08-20T22:36:00.000+08:00</published><updated>2008-09-15T22:36:43.939+08:00</updated><title type='text'>Boost 1.36.0 Released</title><content type='html'>&lt;a href="http://www.boost.org/users/news/version_1_36_0"&gt;Boost 1.36.0 Released&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;增加了四個Library&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt;Unordered&lt;br /&gt;我覺得這是最簡單實用的一個Library&lt;br /&gt;長久以來，C++ STL都缺乏了Hash容器的支持&lt;br /&gt;std::tr1目前還很少compiler內建支援&lt;br /&gt;在VC可用stdext::unordered_set(map)，但非標準，portability差&lt;br /&gt;&lt;br /&gt;boost這次納入了unordered_set, unordered_map&lt;br /&gt;遵循standard library命名的概念，類別名稱描述介面不描述實作&lt;br /&gt;其實骨子裡就是HashSet和HashMap，介面相容於tr1&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Accumulators，簡單的統計用工具&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Unit&lt;br /&gt;號稱Zero-overhead dimensional analysis and unit/quantity manipulation and conversion&lt;br /&gt;(其實就是在compile-time做掉檢查)&lt;br /&gt;大量使用MPI及template metaprogramming。&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Exception&lt;br /&gt;這我沒仔細看....&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;另外已存在的Library也有很多的更新，改變最大的應該是ASIO。例如支持Windows下透過IOCP存取named pipe，剛好最近有要寫一些IPC的東西，之後應該會看一下ASIO這方面是否變利。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/777077092642445515-5938511658743251276?l=birdy-party.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/5938511658743251276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/5938511658743251276'/><link rel='alternate' type='text/html' href='http://birdy-party.blogspot.com/2008/08/boost-1360-released.html' title='Boost 1.36.0 Released'/><author><name>Mr. BigCat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-777077092642445515.post-564614463892886757</id><published>2008-08-03T00:33:00.001+08:00</published><updated>2008-09-26T00:34:58.194+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EeePC'/><title type='text'>Linux+EeePC? It’s not easy….</title><content type='html'>&lt;p&gt;這篇要講的是「&lt;a onclick="javascript:pageTracker._trackPageview('/outgoing/eeepc.asus.com/tw/');" href="http://eeepc.asus.com/tw/"&gt;EeePC&lt;/a&gt; Linux版不適合給不懂電腦的人使用」…&lt;/p&gt; &lt;p&gt;華碩一開始在出產7吋的EeePC時，對EeePC有這樣的定位：&lt;br /&gt;「Easy to play, easy to work, easy to learn」&lt;sup&gt;&lt;a href="http://blog.gaaga.net/archives/215#footnote_0_215" id="identifier_0_215" class="footnote-link footnote-identifier-link" title="參考此網頁的標題"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;br /&gt;「EeePC不是PC、不是筆記型電腦」&lt;br /&gt;當時EeePC的規格低，運算能力較差&lt;br /&gt;官方只有搭載Xandros Linux的作業系統，而沒有MS Windows的版本&lt;/p&gt; &lt;p&gt;EeePC具備有無線上網、文書、撥放DVD及特定格式的影片….等功能….&lt;br /&gt;官方也僅止於保證這些功能可以正確運作而已，確實不到一般筆電的所有功能。&lt;br /&gt;但是這樣C/P值不錯的硬體，落到電腦玩家的手上，&lt;br /&gt;網路上開始流傳「解放EeePC的實力」的方法&lt;br /&gt;例如安裝LazyEeePC、使用Debian的套件庫、在7″ EeePC上灌Windows XP等等…&lt;/p&gt; &lt;p&gt;後來隨著8.9″及10″的EeePC上市&lt;br /&gt;EeePC也開始同時販售Linux和Windows版&lt;br /&gt;無論從價位或者效能來看&lt;br /&gt;似乎再也沒有人能說EeePC不是筆電、只是玩具&lt;/p&gt; &lt;p&gt;價位落在13K~19K間的新型EeePC，大家應該會期待他能夠做到筆電能做的大部份功能&lt;br /&gt;如果使用Windows，應該是沒問題的&lt;br /&gt;可是Linux版的功能卻沒有跟上硬體的演進，內建的功能依然相當簡陋&lt;br /&gt;當然，網路上有很多非官方的教學，教人如何擴充EeePC Linux的功能&lt;br /&gt;但是我必需指出，這些教學的內容相當不easy，也不一定在每個版本上的EeePC上能夠正常工作&lt;br /&gt;甚至，對Linux有一定概念的人，也不一定能解決每一個遇到的問題。&lt;/p&gt; &lt;p&gt;以下是我使用EeePC 901 + Linux所遇到的問題…&lt;/p&gt; &lt;p&gt;&lt;strong&gt;多媒體撥放&lt;/strong&gt;&lt;br /&gt;DVD的方面&lt;br /&gt;原本EeePC內建的SMPlayer+MPlayer組合可以正確的撥放&lt;/p&gt; &lt;p&gt;EeePC並沒有內建rmvb的解碼器&lt;br /&gt;網路上有一個lazyeeepc的懶人包，可以幫我們安裝一些EeePC Linux版上好用的工具&lt;br /&gt;包括了rmvb的解碼器，讓我們可以直接用MPlayer撥放rmvb檔案&lt;/p&gt; &lt;p&gt;安裝了LazyEeePC之後，試著撥放rmvb影片看看&lt;br /&gt;結果聲音和影像都停格的慘不忍睹&lt;/p&gt; &lt;p&gt;在網路上找到一些文章，說這是因為LazyEeePC安裝的是RealPlayer 9的codec&lt;br /&gt;如果安裝了RealPlayer 10或11的Linux版，就可以順暢的撥放影片&lt;br /&gt;於是我試著裝了這兩個版本….不管那一個版本&lt;br /&gt;一開始撥放影片時程式就會馬上當掉&lt;br /&gt;後來發現是XVideo的問題，關掉XVideo就可以撥放，但仍然有非常嚴重的停格現像&lt;/p&gt; &lt;p&gt;後來又無意間找到一篇教學….&lt;br /&gt;在SMPlayer中將影像輸出裝置設成X11&lt;br /&gt;音訊輸出裝置設成ALSA&lt;br /&gt;RMVB就可以很順暢的撥放了….&lt;/p&gt; &lt;p&gt;一切事情解決了嗎？還沒有&lt;br /&gt;在這個環境下，我試著用MPlayer撥放DVD，結果卻會當機！&lt;br /&gt;以有其他人和我遇到同樣的問題。&lt;br /&gt;經過交叉測試之後，發現不管是Debian或者XEPC套件庫的MPlayer，都無法在我的電腦上正常撥放DVD&lt;/p&gt; &lt;p&gt;&lt;strong&gt;無線網路&lt;/strong&gt;&lt;br /&gt;Xandros管理無線網路的GUI相當簡陋&lt;br /&gt;(我沒在有NB上跑過Linux, 不清楚他是不是直接拿debian的套件來用)&lt;br /&gt;做連線/斷線動作時，有時會跳出視窗顯示ifconfig等指令的執行過程，有時不會顯示&lt;br /&gt;有時連不上網路時，也不會顯示錯誤訊息&lt;br /&gt;另外，我找不到如何在UI中直接調整認證方式為Shared key..&lt;br /&gt;在使用Shared Key認證方式時，好像唯有打指令設定一途&lt;/p&gt; &lt;p&gt;&lt;strong&gt;其他Linux Distribution&lt;/strong&gt;&lt;br /&gt;EeePC內建的Xandros功能明顯不足，或許有人會想要使用其他版本的Linux&lt;br /&gt;但目前並沒有一個Linux Distribution對EeePC有完整的支援&lt;br /&gt;&lt;a onclick="javascript:pageTracker._trackPageview('/outgoing/www.eeebuntu.org/');" href="http://www.eeebuntu.org/"&gt;eeebuntu&lt;/a&gt;, &lt;a onclick="javascript:pageTracker._trackPageview('/outgoing/wiki.eeeuser.com/ubuntu:eeexubuntu:home');" href="http://wiki.eeeuser.com/ubuntu:eeexubuntu:home"&gt;eeexubuntu&lt;/a&gt;這兩個專案，都還不能支援EeePC的所有硬體&lt;br /&gt;PCMan等人開發的&lt;a onclick="javascript:pageTracker._trackPageview('/outgoing/lxde.org/');" href="http://lxde.org/"&gt;LXDE&lt;/a&gt;目前尚不支援EeePC 901&lt;/p&gt; &lt;p&gt;&lt;strong&gt;結語&lt;/strong&gt;&lt;br /&gt;本人並非微軟的愛好者。&lt;br /&gt;我也相當遵敬、感謝lazyeeepc, LXDE, eeebuntu, eeeXubuntu的開發者。&lt;/p&gt; &lt;p&gt;我也可以想像，應該護有人跳出來說我資料找的不足。&lt;br /&gt;在那裡有解決我遇到問題的方法。&lt;br /&gt;但我必需指出，目前在EeePC上，Windows XP的支援性、易用性比Windows好的多。&lt;br /&gt;對一個自認對Linux有一定程度了解的人，花兩個晚上還搞不定多媒體、無線網路。&lt;br /&gt;這些東西使用Windows XP+MPlayer, KLite等免費軟體，幾分鐘就可以設定完閉。&lt;/p&gt; &lt;p&gt;對有一定Linux知識的玩家來說，Linux或許是你的好選擇。&lt;br /&gt;但若你是要推薦給不太會用電腦的長輩、朋友、或是不想花太多時間調整系統。&lt;br /&gt;我想「EeePC上Linux其實比Windows還簡單易用」這句話離限實還有一大段距離&lt;br /&gt;如果你不想花一堆時間解決系統的問題，拿8G MLC硬碟去換XP的正版授權，我想是值得的。&lt;/p&gt; &lt;p&gt;最後，以上是我在2008/7月的使用心得。&lt;br /&gt;這篇文章應具有時效性。&lt;br /&gt;我也期待開源社群的活躍，或許有朝一日Linux會比Window還要Easy to use…&lt;/p&gt; &lt;hr /&gt; Footnotes：&lt;ol class="footnotes"&gt;&lt;li id="footnote_0_215" class="footnote"&gt;參考&lt;a onclick="javascript:pageTracker._trackPageview('/outgoing/event.asus.com/eeepc/microsites/color/en/specs.html');" href="http://event.asus.com/eeepc/microsites/color/en/specs.html"&gt;此網頁&lt;/a&gt;的標題 [&lt;a href="http://blog.gaaga.net/archives/215#identifier_0_215" class="footnote-link footnote-back-link"&gt;up&lt;/a&gt;]&lt;/li&gt;&lt;/ol&gt;                             &lt;!-- You can start editing here. --&gt;   &lt;h4 id="comments"&gt;4 Responses to “Linux+EeePC? It’s not easy….”&lt;/h4&gt;    &lt;ol class="commentlist"&gt;&lt;li class="alt" id="comment-994"&gt;    &lt;div class="cmtinfo"&gt;&lt;cite&gt;songsongboy&lt;/cite&gt;&lt;em&gt;on 05 Aug 2008 at 2:07 am &lt;/em&gt;&lt;/div&gt;       &lt;p&gt;聽起來真是恐怖…連你都覺得難用的話 Orz&lt;/p&gt; &lt;p&gt;不過是資工學生的就該買 Linux 版阿 XD (&lt;= 偏見)&lt;/p&gt; &lt;p&gt;反正現在也沒錢買這種東西,相信等我有錢時情況應該會好很多…吧?&lt;/p&gt;       &lt;/li&gt;&lt;li class="" id="comment-1026"&gt;    &lt;div class="cmtinfo"&gt;&lt;cite&gt;大鳥&lt;/cite&gt;&lt;em&gt;on 09 Aug 2008 at 11:46 am &lt;/em&gt;&lt;/div&gt;       &lt;p&gt;你什麼時候留言的….&lt;br /&gt;我過了好幾天看到&lt;br /&gt;我WP的E-mail通知功能好像有點問題 Orz&lt;/p&gt;       &lt;/li&gt;&lt;li class="" id="comment-1184"&gt;    &lt;div class="cmtinfo"&gt;&lt;cite&gt;玉子@香港&lt;/cite&gt;&lt;em&gt;on 29 Aug 2008 at 2:42 am &lt;/em&gt;&lt;/div&gt;       &lt;p&gt;咁 你一定要去呢度至得了,問 asus 係無用的, 佢地 d 技術人員一點都唔 pro, 夠胆同我講話 eeepc 目前係無任何 player 可以 support 到佢, 點知唔夠一個鐘我就搵到呢個網站, 我試過睇 rmvb, 不錯, 都幾流暢, 睇過呢個網站後, 包你愛上你的 eeepc.&lt;/p&gt; &lt;p&gt;讓Eee PC內建的影音播放器支援rmvb&lt;br /&gt;&lt;a onclick="javascript:pageTracker._trackPageview('/outgoing/blog.yam.com/tad0616/article/12306274');" href="http://blog.yam.com/tad0616/article/12306274" rel="nofollow"&gt;http://blog.yam.com/tad0616/article/12306274&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Eee PC改造手冊&lt;br /&gt;&lt;a onclick="javascript:pageTracker._trackPageview('/outgoing/blog.yam.com/BlogIndex.php?BLOG_ID=tad0616&amp;amp;CATEGORY_ID=1626347');" href="http://blog.yam.com/BlogIndex.php?BLOG_ID=tad0616&amp;amp;CATEGORY_ID=1626347" rel="nofollow"&gt;http://blog.yam.com/BlogIndex.php?BLOG_ID=tad0616&amp;amp;CATEGORY_ID=1626347&lt;/a&gt;&lt;/p&gt;       &lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/777077092642445515-564614463892886757?l=birdy-party.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://birdy-party.blogspot.com/feeds/564614463892886757/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=777077092642445515&amp;postID=564614463892886757' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/564614463892886757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/564614463892886757'/><link rel='alternate' type='text/html' href='http://birdy-party.blogspot.com/2008/08/linuxeeepc-its-not-easy.html' title='Linux+EeePC? It’s not easy….'/><author><name>Mr. BigCat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-777077092642445515.post-5932283042530240569</id><published>2008-07-19T22:39:00.002+08:00</published><updated>2008-09-15T23:29:15.898+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Math'/><title type='text'>一段愛與極座標系統的故事</title><content type='html'>被標題騙進來的人....這是數學文章不是愛情故事 XD&lt;br /&gt;&lt;br /&gt;前陣子在同學Honda的BBS個版上看到一個關於笛卡兒的故事。其實這個故事源自於網路流傳，出處已經不詳了 (記得很久以前曾經看過不同的版本) ，在這裡引述一下....&lt;br /&gt;&lt;blockquote&gt;十七世紀出生於法國的笛卡兒是第一個發現直角坐標的人，這對後人的貢獻相當大，可惜一生窮困潦倒。&lt;br /&gt;一直到52歲，仍一直默默無名。當時法國正流行黑死病，笛卡兒不得不逃離，流浪到瑞典當乞丐。&lt;br /&gt;&lt;br /&gt;某天，他在市場乞討時，有一群少女經過，&lt;br /&gt;其中一名少女發現他的口音不像是瑞典人，她對笛卡兒非常好奇，於是上前問他：&lt;br /&gt;&lt;br /&gt;「你從哪來的啊?」&lt;br /&gt;&lt;br /&gt;「法國。」&lt;br /&gt;&lt;br /&gt;「你是做什麼的啊?」&lt;br /&gt;&lt;br /&gt;「我是數學家。」&lt;br /&gt;&lt;br /&gt;這名少女叫克麗絲汀，18歲，是位公主，她和其它女孩不同，&lt;br /&gt;克麗絲汀不喜歡文學，而是熱衷數學。&lt;br /&gt;當她聽到笛卡兒說明身份後，感到相當大的興趣，於是把笛卡兒邀請回宮。&lt;br /&gt;&lt;br /&gt;笛卡兒就成了她的數學老師，將一生的研究傾囊相授，&lt;br /&gt;而克麗絲汀的數學也日益進步，直角坐標當時也只有笛卡兒這對師生才懂。&lt;br /&gt;&lt;br /&gt;後來，他們之間產生了不一樣的情愫，發生喧騰一時的師生戀。&lt;br /&gt;然而這件事傳到國王耳中，讓國王相當憤怒！下令將笛卡兒處死，克麗絲汀以自縊相逼，&lt;br /&gt;國王害怕寶貝女兒真的會想不開，於是...將笛卡兒放逐回法國，也將克麗絲汀軟禁。&lt;br /&gt;&lt;br /&gt;笛卡兒一回到法國沒多久就染上黑死病，躺在床上奄奄一息。&lt;br /&gt;笛卡兒不斷地寫信到瑞典給克麗絲汀，都被國王攔截沒收。&lt;br /&gt;克麗絲汀也就不曾收到過笛卡兒寫來的信...&lt;br /&gt;&lt;br /&gt;就在笛卡兒快要死去的時候，他寄出了第13封信，當他寄出去沒多久後就氣絕身亡。&lt;br /&gt;這封信的內容只有短短的一行...&lt;br /&gt;&lt;br /&gt;r = a(1-sinθ)&lt;br /&gt;&lt;br /&gt;國王攔截到這封信後拆開看，發現並不是一如往常的情話。&lt;br /&gt;於是找來城裡所有科學家來研究，但都沒有任何人能夠解開。&lt;br /&gt;國王心想...反正笛卡兒就快要死了，而且公主被軟禁時都悶悶不樂，便把信交給克麗絲汀。&lt;/blockquote&gt;&lt;br /&gt;故事暫停一下。&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;br /&gt;前陣子在PTT程設版看到有人問這樣的問題：&lt;br /&gt;&lt;blockquote&gt;請問版上大大   我現在有一張image(方形)&lt;br /&gt;想把他 warping  成環型(甜甜圈)&lt;br /&gt;網路上沒看到相似的方法&lt;br /&gt;不知道版上的高手有沒有任何想法呢&lt;br /&gt;可以提供給小弟&lt;/blockquote&gt;&lt;br /&gt;&lt;a href="http://zh.wikipedia.org/w/index.php?title=%E6%9E%81%E5%9D%90%E6%A0%87%E7%B3%BB&amp;amp;variant=zh-hant"&gt;極座標系統(Polar coordinate system)&lt;/a&gt;是解決這個問題的一個快速途徑。下圖 ((圖片引用自&lt;a href="http://zh.wikipedia.org/w/index.php?title=Image:CircularCoordinates.png&amp;amp;variant=zh-hant" target="_blank"&gt;維基共享資援&lt;/a&gt;)) 是極座標系統的一個範例。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ZNCDOmrFXjs/SM5-gbJqk8I/AAAAAAAAAME/dNBau6SJ-iM/s1600-h/circularcoordinates-300x247.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_ZNCDOmrFXjs/SM5-gbJqk8I/AAAAAAAAAME/dNBau6SJ-iM/s400/circularcoordinates-300x247.png" alt="" id="BLOGGER_PHOTO_ID_5246269711442416578" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;極座標系統定義一個中心點O，並且以與中心點的距離r，以及夾角θ，定位平面上的任何一個點。&lt;br /&gt;&lt;br /&gt;極座標系統 (r, θ) 和我們更熟知的直角座標系 (x,y) 間，可以下列公式轉換：&lt;br /&gt;&lt;br /&gt;[tex]x = r cos \theta[/tex]&lt;br /&gt;[tex]y = r sin \theta[/tex]&lt;br /&gt;記得這是理組高中數學的內容....&lt;br /&gt;&lt;br /&gt;這樣對我們先前提到的問題有什麼幫助呢？&lt;br /&gt;&lt;br /&gt;讓我們想想，怎樣在極座標系上，表示半徑為10的圓？&lt;br /&gt;[tex]r = 10[/tex]&lt;br /&gt;怎樣在極座標系上，表示一個內圈半徑為10，外圈半徑為15的環？&lt;br /&gt;[tex]10 &amp;lt; r &amp;lt; 15[/tex]&lt;br /&gt;&lt;br /&gt;要怎麼把一個矩型的圖片Wrap(變型)到一個環上，答案就呼之欲出了。&lt;br /&gt;&lt;br /&gt;令&lt;br /&gt;(x,y)為原圖上的座標&lt;br /&gt;(x',y')為目的圖上的座標 (使用直角座標系，x軸向右，y軸向上)&lt;br /&gt;(r,θ)為目的圖上的極標&lt;br /&gt;(w,h)為原圖上的寬及高&lt;br /&gt;R&lt;sub&gt;1&lt;/sub&gt;為環內圈半徑，R&lt;sub&gt;2&lt;/sub&gt;為環的寬度&lt;br /&gt;&lt;br /&gt;讓我們觀查一下這組等式：&lt;br /&gt;[tex] r = \frac{y}{h} \times R_{2} + R_{1} [/tex]&lt;br /&gt;[tex] \theta = \frac{x}{w} \times 2\pi [/tex]&lt;br /&gt;&lt;br /&gt;第一式讓y值越高時，r越大，距離原點越遠&lt;br /&gt;第二式讓原圖的x座標轉變為目的圖的θ角，達成繞原點一週&lt;br /&gt;&lt;br /&gt;但電腦在運算時，最直觀的方法是用點陣圖來處理。&lt;br /&gt;所以我們最好把找到給定(x', y')，找到(x,y)的公式。&lt;br /&gt;因此，將上述等式移項&lt;br /&gt;&lt;br /&gt;[tex]x = \theta \times \frac{w}{2\pi} [/tex]&lt;br /&gt;[tex] y = (r-R_{1}) \times \frac{h}{R_{2}} [/tex]&lt;br /&gt;&lt;br /&gt;配合&lt;br /&gt;&lt;br /&gt;[tex]x' = r cos \theta[/tex]&lt;br /&gt;[tex]y' = r sin \theta[/tex]&lt;br /&gt;&lt;br /&gt;便可以(x',y')反查(x,y)&lt;br /&gt;&lt;br /&gt;讓我們直接看看實作出來的效果&lt;br /&gt;假設這是原圖(點擊放大) ((這是Gun and roses樂團Paradise City的第一句歌詞)) ：&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ZNCDOmrFXjs/SM5-nDVNK8I/AAAAAAAAAMM/vs0l5TVyZF8/s1600-h/src.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_ZNCDOmrFXjs/SM5-nDVNK8I/AAAAAAAAAMM/vs0l5TVyZF8/s400/src.png" alt="" id="BLOGGER_PHOTO_ID_5246269825307454402" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;經過上述公式映射後會變成&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ZNCDOmrFXjs/SM5-ua8MXCI/AAAAAAAAAMU/hePC_k4HjLg/s1600-h/res0.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_ZNCDOmrFXjs/SM5-ua8MXCI/AAAAAAAAAMU/hePC_k4HjLg/s400/res0.png" alt="" id="BLOGGER_PHOTO_ID_5246269951904078882" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;看起來怪怪的應該是我沒有做Anti-aliasing。我用Matlab實作的程式碼置於文末，取樣時我是用nearest point，有興趣的人可以試著改成bilinear interpolation看看。&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;br /&gt;回到笛卡兒的故事吧....&lt;br /&gt;&lt;blockquote&gt;當克麗絲汀收到這封信時，雀躍無比，她很高與她的愛人還是想念她。&lt;br /&gt;她立刻動手研究這行字的秘密。沒多久就解出來了，用的就是「直角坐標圖」....&lt;br /&gt;&lt;br /&gt;當   θ=0度時，r=a(1-0)=a&lt;br /&gt;θ=90度時，r=a(1-1)=0&lt;br /&gt;θ=180度時，r=a(1-0)=a&lt;br /&gt;θ=270度時，r=a(1+1)=2a，&lt;br /&gt;&lt;br /&gt;其中a為四截距的比值，再將所有的點連接起來...就是有名的心臟線&lt;/blockquote&gt;&lt;br /&gt;這是網路流傳文章的全文....可是看來他用的是極座標系統，與直角座標系並沒有直接的關係啊。&lt;br /&gt;&lt;br /&gt;先不管這個，我們試著把這張圖畫出來吧，使用matlab是很簡單的..&lt;br /&gt;&lt;pre lang="matlab"&gt;close all; figure;&lt;br /&gt;n = 10000;&lt;br /&gt;a = 10;&lt;br /&gt;X = zeros(n, 1);&lt;br /&gt;Y = zeros(n, 1);&lt;br /&gt;i = 0;&lt;br /&gt;for theta = linspace(0, 2*pi, n+1)&lt;br /&gt;i = i + 1;&lt;br /&gt;r = a * ( 1 - sin(theta) );&lt;br /&gt;X(i) = r * cos(theta);&lt;br /&gt;Y(i) = r * sin(theta);&lt;br /&gt;end&lt;br /&gt;line(X,Y);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ZNCDOmrFXjs/SM5-1FyFAvI/AAAAAAAAAMc/prPrzUuy1IY/s1600-h/heart.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_ZNCDOmrFXjs/SM5-1FyFAvI/AAAAAAAAAMc/prPrzUuy1IY/s400/heart.png" alt="" id="BLOGGER_PHOTO_ID_5246270066483593970" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;原來這張圖代表了笛卡兒對於公主的愛意啊....&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strike&gt;至於這個故事的真實性，我想本來就是漏洞百出的，如果有興趣的話，這邊&lt;a href="http://www.shs.edu.tw/works/essay/2006/10/2006103019250542.pdf"&gt;有人考據過了&lt;/a&gt;。我想，故事有趣就好，這時候真相可能不是那麼重要吧....XD&lt;/strike&gt;如果有興趣，可以參考&lt;a href="http://catsense17.wordpress.com/2008/07/23/%E6%84%9B%E8%88%87%E6%A5%B5%E5%BA%A7%E6%A8%99%E7%B3%BB%E7%B5%B1%E7%9A%84%E9%80%86%E8%BD%89/"&gt;這篇文章&lt;/a&gt;。&lt;br /&gt;&lt;br /&gt;最後，我們可以用上面的方法，把一張矩型的圖片Wrap到一個心型的環上嗎？&lt;br /&gt;原本的等式是&lt;br /&gt;[tex]x = \theta \times \frac{w}{2\pi} [/tex]&lt;br /&gt;[tex] y = (r-R_{1}) \times \frac{h}{R_{2}} [/tex]&lt;br /&gt;我們簡單的以&lt;br /&gt;[tex]R_{1} = a \times ( 1 - sin\theta ) [/tex]&lt;br /&gt;代入即可得到&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ZNCDOmrFXjs/SM5-5v-lEgI/AAAAAAAAAMk/sH2SkueuJ34/s1600-h/res1.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_ZNCDOmrFXjs/SM5-5v-lEgI/AAAAAAAAAMk/sH2SkueuJ34/s400/res1.png" alt="" id="BLOGGER_PHOTO_ID_5246270146529792514" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;看起來怪怪的，圖片被太過扭曲了。至於為什麼會這樣，答案就留給有興趣的讀者自己找尋吧...&lt;br /&gt;&lt;br /&gt;附上本文所用到的源碼及圖片，很久沒寫Matlab了，很多地方都沒寫好。&lt;a href="http://blog.gaaga.net/wp-content/uploads/2008/07/heart.zip"&gt;[Link]&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/777077092642445515-5932283042530240569?l=birdy-party.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://birdy-party.blogspot.com/feeds/5932283042530240569/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=777077092642445515&amp;postID=5932283042530240569' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/5932283042530240569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/5932283042530240569'/><link rel='alternate' type='text/html' href='http://birdy-party.blogspot.com/2008/07/blog-post.html' title='一段愛與極座標系統的故事'/><author><name>Mr. BigCat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_ZNCDOmrFXjs/SM5-gbJqk8I/AAAAAAAAAME/dNBau6SJ-iM/s72-c/circularcoordinates-300x247.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-777077092642445515.post-128121807909638834</id><published>2008-07-19T00:36:00.000+08:00</published><updated>2008-09-26T00:37:04.068+08:00</updated><title type='text'>輕省筆電  無責任Survey</title><content type='html'>之前提到我想買輕省筆電 (我定位為：價位20K以下，重量1.5Kg以下的筆電) 。我針對目前的資訊做了一些調查。我主要是想拿來文書、上網，偶爾寫小程式，調查的方向偏向CPU運算、省電能力優秀的筆電。其實我對於這方面資訊也不甚了解，如果內容有所謬誤歡迎幫忙更正。&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;可以先參考&lt;a href="http://www.mobile01.com/topicdetail.php?f=159&amp;amp;t=646860"&gt;8.9"以上 輕省筆電規格大對決&lt;/a&gt;這篇文章的表格。這張表列出了Asus EeePC, MSI Wind, HP2133, Acer AspireOne, Gigabyte M912這幾款筆電。幾乎包括了目前市面上所有的輕省筆電，我只知道漏掉了一個日本工人舍KJS系列的。&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;   &lt;li&gt;Acer AspireOne最先出局，他的MLC硬碟在Mobile01已經慢到哀鴻遍野了。&lt;/li&gt;&lt;br /&gt;   &lt;li&gt;HP2133省電能力低落，出局。原裝附3 cell電池，但換成6 cell後省電能力仍不如Atom系列的CPU&lt;/li&gt;&lt;br /&gt;   &lt;li&gt;Gigabyte M912...似乎是廠商延後出貨，目前還買不到，所以不考慮 =.=&lt;/li&gt;&lt;br /&gt;   &lt;li&gt;工人舍...CPU能力輸Intel Atom一截，出局。&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;刪到現在，還剩Asus EeePC系列和MSI Wind系列。我先關於整理一些筆電規格的知識。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;硬碟&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;在硬碟的規格會看到一些專有名詞：HDD, SSD, MLC, SLC&lt;br /&gt;稍微解釋一下&lt;br /&gt;&lt;br /&gt;簡單說，所謂HDD就是一般的硬碟，用一個讀取頭去讀取磁盤上的資訊。&lt;br /&gt;而SSD (固態硬碟) 就是像隨身碟那樣，沒有磁盤與讀取頭。&lt;br /&gt;&lt;br /&gt;HDD和SSD各有優劣&lt;br /&gt;HDD的優點為容量大 (或者說比較便宜，相同價錢可以買到較大空間的硬碟)，速度較快。&lt;br /&gt;但缺點是較為不耐震耐摔，可以想像在不斷震動的情況下，讀取頭較為容易損壞。&lt;br /&gt;&lt;br /&gt;SSD的優點是耐震耐摔 (震動對他幾乎沒有影響) 適合在車上使用，省電、靜音 (不會有硬碟讀取的聲音)&lt;br /&gt;雖然他耐摔，但其壽命和HDD相比，他能接受的寫入次數是比較少的。&lt;br /&gt;但也不用太過擔心，參考一下&lt;a href="http://angusdev.mysinablog.com/index.php?op=ViewArticle&amp;amp;articleId=1109068" target="_blank"&gt;這篇文章&lt;/a&gt;。 (雖然我覺得他的計算方法不盡正確)&lt;br /&gt;我想，只要不要使用太常讀寫硬碟的軟體(如P2P)，正常的使用就好了吧。&lt;br /&gt;&lt;br /&gt;SSD又有分SLC和MLC兩種&lt;br /&gt;SLC價錢高、速度快、壽命長&lt;br /&gt;MLC價錢低、速度快、壽命短&lt;br /&gt;&lt;br /&gt;輕省筆電為了壓低售價，通常是SLC及MLC混用&lt;br /&gt;像是EeePC 901 XP版就是以4G SLC當作系統碟，8G MLC當作第二顆硬碟。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;CPU&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;我所列出的EeePC和MSI Wind，只剩兩種CPU：Intel Celeron 900及Intel Atom 1.6G&lt;br /&gt;簡單的說，這兩顆的運算能力是差不多的，但Atom比Celeron更省電，似乎也比較不會發熱。&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;其他的東西就比較直觀了。&lt;br /&gt;&lt;br /&gt;螢幕大小EeePC 900, 901是8.9"，MSI U90是9"，EeePC 1000和MSI U100是10"。&lt;br /&gt;&lt;br /&gt;聽說EeePC 901的鍵盤比一些其他的9"筆電要難打。我這幾天和同事借來試打，一開始是很不習慣，練了幾天之後覺得還好，只是要用特殊的姿勢，想要把字打快的話手會很痠。這個建議想要買的人多去試打看看 @@"&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;strong&gt;EeePC已知問題篇&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;EeePC大概是最紅的輕省筆電，我在Mobile01及ptt看到不少討論，我搜集了一下目前問題出現率的前三名。&lt;br /&gt;&lt;br /&gt;第三名：EeePC 9xx及1000H型，喇叭會出現雜音。&lt;br /&gt;這似乎是Driver或Firmware的問題。有些人會碰到有些人不會，有人說重灌Driver可以解決。這個問題的解決進度不明，但我相信不是重大的問題。&lt;br /&gt;&lt;br /&gt;第二名：EeePC 9xx型，插著SD卡開機會當機。&lt;br /&gt;這是BIOS的問題，已確認解決，更新BIOS後就沒問題了。&lt;br /&gt;&lt;br /&gt;第一名：常看到「要放棄EeePC去買Wind」這種標題的文章，讓我很緊張的點進去看，想說EeePC是不是有什麼重大缺失。結果這些文章清一色在抱怨&lt;span style="color:red;"&gt;某些型號的EeePC太難買了&lt;/span&gt;。主要都是Linux版的買不到，像是20G SSD的EeePC 901 Linux版，目前聽說廠商只出貨過兩次。還有EeePC 1000型 (非1000H型) ，預定六月上市，七月連影子都沒有。據傳是Intel Atom CPU以及電池的材料缺貨所致。&lt;br /&gt;結果這些文章都不是對EeePC本身的抱怨，而是太想買EeePC抱怨買不到 @@&lt;br /&gt;&lt;br /&gt;Well, 這是目前對於EeePC的Survey，看來沒有太大的問題。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;MSI Wind已知問題篇&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Wind系列我就沒有那麼仔細的調查。&lt;br /&gt;目前最聽說最大的問題就是重量設計不良，螢幕角度開太大會造成重心不穩，不小心的話會整個NB向後倒。&lt;br /&gt;&lt;br /&gt;另外就是也聽說喇叭會出現有雜音的問題。&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;br /&gt;目前還在觀望中，最可能買的是901 Linux版吧，雖然目前還沒有貨&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/777077092642445515-128121807909638834?l=birdy-party.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://birdy-party.blogspot.com/feeds/128121807909638834/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=777077092642445515&amp;postID=128121807909638834' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/128121807909638834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/128121807909638834'/><link rel='alternate' type='text/html' href='http://birdy-party.blogspot.com/2008/07/survey.html' title='輕省筆電  無責任Survey'/><author><name>Mr. BigCat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-777077092642445515.post-485508336329366870</id><published>2008-07-15T00:38:00.001+08:00</published><updated>2008-09-26T00:40:26.466+08:00</updated><title type='text'>Blogger新提供XML匯入匯出功能</title><content type='html'>&lt;a href="http://bloggerindraft.blogspot.com/2008/06/new-feature-import-and-export.html"&gt;Blogger於六月已經開始提供了XML匯入匯出的功能&lt;/a&gt;&lt;br /&gt;網路上也有些中文的試用報告，如：&lt;a href="http://joshnote.blogspot.com/2008/07/blogger-in-draftimportexport.html"&gt;Josh's Note: 來試試新玩意之六，Blogger in Draft：Import/Export&lt;/a&gt;&lt;br /&gt;這部份我就不多說了。&lt;br /&gt;&lt;br /&gt;本站之前提供了一個&lt;strike&gt;問題百出的&lt;/strike&gt;Blog搬家工具 - BlogTrans。&lt;br /&gt;這個工具搬家到Blogger，最大的限制就是每天只能匯入五十篇，以及匯入留言時會有些問題。&lt;br /&gt;&lt;br /&gt;Blogger提供的這個新功能，匯出的XML檔基本上是Atom格式，但有的地方必需符合Blogger自己的規格。&lt;br /&gt;一個重要的地方是：這個功能可以匯入留言，也沒有一天五十篇的限制。&lt;br /&gt;所以要是我們摸透了他的XML格式，就有希望利用這個功能，做為將其他Blog資料 (例如無名) 匯入Blogger的方便跳版。&lt;br /&gt;&lt;br /&gt;稍微看了一下他的格式，基本上每篇文章的結構是這樣&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;entry&amp;gt;&lt;br /&gt;  &amp;lt;id&amp;gt;tag:blogger.com,1999:blog-1.post-1&amp;lt;/id&amp;gt;&lt;br /&gt;  &amp;lt;published&amp;gt;2008-07-14T08:49:00.004-07:00&amp;lt;/published&amp;gt;&lt;br /&gt;  &amp;lt;updated&amp;gt;2008-07-14T08:56:06.128-07:00&amp;lt;/updated&amp;gt;&lt;br /&gt;  &amp;lt;category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/blogger/2008/kind#post'/&amp;gt;&lt;br /&gt;  &amp;lt;category scheme='http://www.blogger.com/atom/ns#' term='Label2'/&amp;gt;&amp;lt;category scheme='http://www.blogger.com/atom/ns#' term='Label1'/&amp;gt;&lt;br /&gt;  &amp;lt;title type='text'&amp;gt;Test1&amp;lt;/title&amp;gt;&lt;br /&gt;  &amp;lt;content type='html'&amp;gt;Test12&amp;lt;/content&amp;gt;&lt;br /&gt;  &amp;lt;link rel='alternate' type='text/html' href='http://test0012463.blogspot.com/2008/07/test1_9163.html' title='Test1'/&amp;gt;&lt;br /&gt;  &amp;lt;link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3196312873051422574/posts/default/3405625350671241273'/&amp;gt;&lt;br /&gt;  &amp;lt;author&amp;gt;&lt;br /&gt;      &amp;lt;name&amp;gt;大宅鳥&amp;lt;/name&amp;gt;&lt;br /&gt;      &amp;lt;uri&amp;gt;http://abcde.com&amp;lt;/uri&amp;gt;&lt;br /&gt;      &amp;lt;email&amp;gt;12345@msn.com&amp;lt;/email&amp;gt;&lt;br /&gt;  &amp;lt;/author&amp;gt;&lt;br /&gt;&amp;lt;/entry&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;如果要用程式生成這樣的格式，有幾點要注意的：&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt; 最重要的一點，id tag似乎只能是tag:blogger.com,1999:blog-12345.post-23456這樣的格式，但裡面的數字不管填什麼，匯入時都沒有問題&lt;/li&gt;&lt;br /&gt; &lt;li&gt; 已經存在的欄位不要空著。Author裡的name, uri, email其實都沒有作用，但不打的話就會發生錯誤。&lt;/li&gt;&lt;br /&gt; &lt;li&gt; Comment的部份好像複雜一些，我還沒有摸清他的規則。&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;目前只研究到這樣。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/777077092642445515-485508336329366870?l=birdy-party.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://birdy-party.blogspot.com/feeds/485508336329366870/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=777077092642445515&amp;postID=485508336329366870' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/485508336329366870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/485508336329366870'/><link rel='alternate' type='text/html' href='http://birdy-party.blogspot.com/2008/07/bloggerxml.html' title='Blogger新提供XML匯入匯出功能'/><author><name>Mr. BigCat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-777077092642445515.post-8803942957010076107</id><published>2007-11-16T00:45:00.000+08:00</published><updated>2008-09-26T00:45:48.089+08:00</updated><title type='text'>台大教授的程式作業批改系統</title><content type='html'>不知道有沒有人對YouTube上的一首曖昧改編版有印像 (曾經被PO在ptt上面)&lt;br /&gt;&lt;br /&gt;&lt;object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" width="425" height="355"&gt;&lt;param name="width" value="425"&gt;&lt;param name="height" value="355"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;param name="src" value="http://www.youtube.com/v/QX2-9fS5TBY&amp;amp;rel=1"&gt;&lt;embed type="application/x-shockwave-flash" width="425" height="355" wmode="transparent" src="http://www.youtube.com/v/QX2-9fS5TBY&amp;amp;rel=1"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;笑點可能要修過程式設計課的人才會懂..&lt;br /&gt;&lt;br /&gt;我有在ptt2潛水看台大兩位資工系教授的個人版。其中一位教授稱他的程式作業叫『使徒』(於是學生們就得擊敗眾多的使徒 XDXD)&lt;br /&gt;&lt;br /&gt;那位教授也開發了一個web-based的程式批改系統(像是ACM judge)，叫做『批改娘』。&lt;br /&gt;『批改娘』的系統好像常常被助教惡搞，於是今天在版上就看到了這樣的畫面&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/10329904@N02/2035748187/" class="tt-flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2217/2035748187_a9c4cf15f3.jpg" alt="ä½¿å¾�" border="0" height="482" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;真是有趣的教授和助教啊....XD 有興趣的話前往ptt2應該不難找到那個版&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/777077092642445515-8803942957010076107?l=birdy-party.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://birdy-party.blogspot.com/feeds/8803942957010076107/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=777077092642445515&amp;postID=8803942957010076107' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/8803942957010076107'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/8803942957010076107'/><link rel='alternate' type='text/html' href='http://birdy-party.blogspot.com/2007/11/blog-post.html' title='台大教授的程式作業批改系統'/><author><name>Mr. BigCat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2217/2035748187_a9c4cf15f3_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-777077092642445515.post-7336988917531213770</id><published>2007-11-12T22:28:00.004+08:00</published><updated>2008-09-15T23:31:28.499+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Math'/><title type='text'>Monte Carlo integration (蒙地卡羅積分)</title><content type='html'>蒙地卡羅積分是一個能夠求積分近似值的方法。這個方法應該有很多應用吧，我印像最深刻的是影像合成中的ray tracing演算法(可用於計算一個點受到的照度)。因為學弟的論文可能會用到這個方法，我曾經學過但是有點忘了，而且竟然找不太到中文的資源，所以復習一下順便做一下筆記。&lt;br /&gt;&lt;br /&gt;假設有一個對x的定積分式&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ZNCDOmrFXjs/SM58Y-cRPdI/AAAAAAAAAL0/nMYnJhYS848/s1600-h/tex1.gif"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_ZNCDOmrFXjs/SM58Y-cRPdI/AAAAAAAAAL0/nMYnJhYS848/s400/tex1.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5246267384453479890" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;如下圖，如果f為折線的函式，則黃色區塊的面積即為自0到1積分的結果。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/10329904@N02/868828597/" class="tt-flickr"&gt;&lt;img border="0" width="200" src="http://farm2.static.flickr.com/1298/868828597_94553a67c5_o.png" alt="monte1" height="200" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;當然，我們很容易可以利用三角形面積公式，或者對f求定積分，而算出黃色區域的面積。然而，假設我們沒有這樣的先備知識，或者黃色區域的面積是難以求得的，那要怎麼辦呢？&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;跟據&lt;a href="http://en.wikipedia.org/wiki/Monte_Carlo_method"&gt;Monte Carlo method&lt;/a&gt;的想法，我們可以在包函定積分區域的一個範圍內，均勻取n個點。假設n=100, 且我們取的範圍是&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ZNCDOmrFXjs/SM58eq_ouJI/AAAAAAAAAL8/1PrGl4_I_Qk/s1600-h/tex2.gif"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_ZNCDOmrFXjs/SM58eq_ouJI/AAAAAAAAAL8/1PrGl4_I_Qk/s400/tex2.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5246267482312325266" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/10329904@N02/868828603/" class="tt-flickr"&gt;&lt;img border="0" width="200" src="http://farm2.static.flickr.com/1006/868828603_70cda7718c_o.png" alt="monte2" height="200" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;令[tex]n^*[/tex]為落在黃色區域內的點數，V為隨機取點的區域面積，而I為黃色區域面積，我們可以求得I的近似值。&lt;br /&gt;[tex]I \approx \frac{n^*}{n}V[/tex]&lt;br /&gt;&lt;br /&gt;這個應該很容易可以理解，我們在面積為1的區域中，隨機取了1000個點，若有502個點落在黃色區域中，我們可以估計黃色區域的面積近似於0.502。理論上n的數字越大，這個近似值會越準。但是上述的方法太慢了，利用高中數學就可以想到一個更快的方法 :)&lt;br /&gt;&lt;br /&gt;令&lt;br /&gt;[tex]g(x) = \left\{\begin{array}{ll}&lt;br /&gt;1 &amp;amp; \textrm{,if x is in the domain of f(x)} \\&lt;br /&gt;0 &amp;amp; \textrm{,else}&lt;br /&gt;\end{array}&lt;br /&gt;\right .[/tex]&lt;br /&gt;則&lt;br /&gt;&lt;br /&gt;[tex]I = \int_a^bg(x)f(x)dx = \frac{1}{v}\int_a^bg(x)f(x)Vdx[/tex]&lt;br /&gt;&lt;br /&gt;令&lt;br /&gt;[tex]h(x) = f(x)g(x)[/tex]&lt;br /&gt;&lt;br /&gt;跟隨上面的推導，可以得到&lt;br /&gt;[tex]I \approx \frac{1}{n} \sum_{i}^{n}h(x_i) = \frac{V}{n} \sum_{i}^{n}f(x_i)[/tex]&lt;br /&gt;&lt;br /&gt;用一個很簡單的例子舉例，下圖 ((本圖取自英文維基百科&lt;a href="http://en.wikipedia.org/wiki/Image:Integral_approximations.svg"&gt;此處&lt;/a&gt;))大家應該都覺得很眼熟，因為國高中的數學課本就出現過了。要估計一個函數所積分成的面積，我們可以在函數上取一些sample點，然後用sample點的高度和，乘上每個sample的平均寬度，就是這個區域面積的沽計值。事實上Monte Carlo integration就是基於這個想法。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/10329904@N02/868938803/" class="tt-flickr"&gt;&lt;img border="0" width="240" src="http://farm2.static.flickr.com/1283/868938803_e1fc5ccfb4_m.jpg" alt="monte3" height="239" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;不僅止於此，這個方法還可以應用到較高維度的空間中。假設f的定議域由x,y...等多個變數所組成。則f的積分值可定義為：&lt;br /&gt;&lt;br /&gt;[tex]I = \int_{x_l}^{x_u} \int_{y_l}^{y_u} f(x, y, \ldots) \, dx \, dy \ldots =\int_{V}f(x, y, \ldots) \, dx \, dy \ldots[/tex]&lt;br /&gt;&lt;br /&gt;同樣的&lt;br /&gt;[tex]I \approx V \cdot \langle f \rangle = \frac{V}{n} \sum_{i}^n f(x_i)[/tex]&lt;br /&gt;只是此處V可能為取樣的體積(或超體積hypervolume)。這樣的方法比前一個方法可以少取樣一個維度，很明顯的可以加快演算法的運算速度。&lt;br /&gt;&lt;br /&gt;Monte Carlo integration的方法是無法保證其誤差的error bound的，這一點可以很容易的觀查到。我們僅對空間做一些隨機取樣的動作，甚至不需要知道函數的細節，只要給與input能求的output就好了。因此，如果函數中有一個特別突出的區間，只要取樣點沒有落在那個區間上，就會造成很大的誤差。一般來說，要將誤差縮小n倍，則需要將sample點的數量乘上n平方倍。&lt;br /&gt;&lt;br /&gt;在實作上，Monte Carlo integration還可以有不同的變化。例如在偵測到variance較大的區間，可以增加sample的密度以提高準確率等...&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;參考資料：&lt;br /&gt;&lt;ul&gt; &lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Monte_Carlo_integration"&gt;Wikipedia: Monte Carlo integration&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.taygeta.com/rwalks/node5.html"&gt;Taygeta: Monte Carlo integration&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.wretch.cc/blog/glCheng&amp;amp;article_id=3431370"&gt;Math、Science &amp;amp; Arts - [MATH] Monte Carlo Method 蒙地卡羅法則&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/777077092642445515-7336988917531213770?l=birdy-party.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/7336988917531213770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/7336988917531213770'/><link rel='alternate' type='text/html' href='http://birdy-party.blogspot.com/2007/11/monte-carlo-integration.html' title='Monte Carlo integration (蒙地卡羅積分)'/><author><name>Mr. BigCat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_ZNCDOmrFXjs/SM58Y-cRPdI/AAAAAAAAAL0/nMYnJhYS848/s72-c/tex1.gif' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-777077092642445515.post-5630661639211066052</id><published>2007-10-02T22:31:00.000+08:00</published><updated>2008-09-15T22:32:20.684+08:00</updated><title type='text'>下載檔案如何不造成lag?</title><content type='html'>&lt;a href="http://www.flickr.com/photos/10329904@N02/1472045602/" class="tt-flickr"&gt;&lt;/a&gt;&lt;a href="http://www.flickr.com/photos/10329904@N02/1472045602/" class="tt-flickr"&gt;&lt;/a&gt; 前言：這篇想要寫的盡量簡單易懂，所以用了一些技術上不太正確的譬喻，高手看到請鞭小力一點。 &lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;劇情：小明在外租屋，房東家裡裝了一條ADSL網路，免費分給各位房客用。小明的朋友阿喵架了一個FTP站，在上面放了一些電影。有一天，小明在阿喵的FTP上抓電影時，房東的兒子打網路遊戲突然變的很不順，下達一個攻擊指令後過三秒才會有反應。房東的兒子和房東說了這樣的情況，於是房東就把房客們的網路線拔掉了...如果有在網路上下載檔案(FTP, BT, eMule)的人，應該常常會有這種經驗...打BBS或網路遊戲突然變的很lag(指網路回應時間很慢)。要怎麼避免這種狀況呢？&lt;a name='more'&gt;&lt;/a&gt; &lt;hr /&gt;武器一：使用ping來判斷目前網路lag的狀況要怎樣判斷目前的網路連外有多lag呢？最簡單的方法就是使用ping。ping的原理很簡單，就是去計算一個封包(訊息)傳到另一台電腦，再傳回來的時間。這裡通常ping你所使用的ISP的gateway或網頁，就可以知道目前網路的lag狀態了。&lt;br /&gt;&lt;br /&gt;前面那段看不懂沒關係，我舉個更簡單的例子... &lt;br /&gt;&lt;blockquote&gt;小明的電腦：Hinet網頁主機，聽到請快回答！&lt;br /&gt;Hinet網頁主機：收到收到&lt;br /&gt;小明的電腦：嗯嗯，我收對方的回應了，一共經過了30ms (毫秒)&lt;/blockquote&gt;&lt;br /&gt;這就是ping所做的事。30ms包括了兩段的時間：小明的電腦傳訊息給hinet的時間，以及Hinet回訊息到小明的電腦收到的時間。一般來說，Hinet的ADSL用戶在網路順暢的情況下會看到8~30ms的。&lt;br /&gt;&lt;br /&gt;在Windows下使用ping很簡單。按開始=&amp;gt;執行=&amp;gt;ping -t &lt;a href="http://www.hinet.net/"&gt;http://www.hinet.net/&lt;/a&gt; 就會開始不停的ping...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/10329904@N02/1472045602/"&gt;&lt;img border="0" width="500" src="http://farm2.static.flickr.com/1264/1472045602_835bba8b16.jpg" alt="ping" height="328" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;中間那個time=23ms，就是RTT，一般都會在30以下。如果房東的兒子是在玩一般的網路RPG，ping在200ms以下應該沒什麼感覺，200~400ms應該是感覺稍微不順。所以只要設法讓ping不要爆掉，房東就不會來拔你的網路線了喔。&lt;br /&gt;&lt;br /&gt;武器二：Windows下的流量限制軟體 (如NetLimiter)&lt;br /&gt;&lt;br /&gt;一般的P2P程式(如BT, eMule)都會提供流量限制的功能。然而提供流量限制功能的FTP軟體似乎就很少見。這個時候就要靠其他的軟體來控制流量囉。像是NetLimiter就是一套不錯的軟體。我手邊沒有灌NetLimiter的機器，所以沒辦法寫出詳細的文圖教學。有興趣的可以去看看&lt;a href="http://fun.idv.tw/fun/2006/11/post_15.html"&gt;別人寫的教學&lt;/a&gt;，學會怎樣控制上傳和下傳的頻寬。&lt;br /&gt;&lt;br /&gt;注意！一般ADSL的上傳及下載頻寬是不一樣的。如果你的下載瀕寬是1MBPS，這不是說你每秒可以抓1MB的東西喔....因為所謂BPS是Bit per second，也就是每秒可以傳輸多少Bit。然而我們通常用Byte的單位來計算檔案大小，而1byte等於8bits。總而言之，把你租用的ADSL線路的頻寬數字除以八就對了。下載1MBPS的ADSL，要是你每秒抓超過0.125MB，也就是128KB的資料的話，就會非常容易lag。&lt;font color="#ff0000"&gt;結論：把你的頻寬除以八，你設定的上傳/下載頻寬決不可以超過這個數字。 &lt;/font&gt;&lt;br /&gt;&lt;br /&gt;不過這招用在多人分用網路的時候就沒用了，除非大家約定好用的頻寬不超過多少，否則就只好試著調整上/下傳頻寬(在p2p軟體內調、或者用NetLimiter調)，直到ping值在可以接受的範圍內為止。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/777077092642445515-5630661639211066052?l=birdy-party.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://birdy-party.blogspot.com/feeds/5630661639211066052/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=777077092642445515&amp;postID=5630661639211066052' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/5630661639211066052'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/5630661639211066052'/><link rel='alternate' type='text/html' href='http://birdy-party.blogspot.com/2007/10/lag.html' title='下載檔案如何不造成lag?'/><author><name>Mr. BigCat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm2.static.flickr.com/1264/1472045602_835bba8b16_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-777077092642445515.post-1000609789131709794</id><published>2007-10-02T22:30:00.000+08:00</published><updated>2008-09-15T22:31:22.315+08:00</updated><title type='text'>Wordpress忘記密碼的解決方法</title><content type='html'>此處指自己架的wordpress，並非&lt;a href="http://blog.gaaga.net/wp-admin/wordpress.com"&gt;wordpress.com&lt;/a&gt;提供的service。&lt;br /&gt;&lt;br /&gt;第一種方法：在login畫面點選forget password，會寄送一封信到你的信箱，附帶一個可以更改密碼的link，但要是這方法失效的話...&lt;br /&gt;&lt;br /&gt;進phpmyadmin，修改wp_users table，將使用者的密碼欄位清空 (原本會看到一串16進位的數字)，打上新的密碼，並點選MD5。phpmyadmin會幫你把密碼用MD5 hash後存入資料庫，收工。&lt;br /&gt;&lt;br /&gt;事實上sql指令夠熟的話，直接去console下sql...&lt;br /&gt;&lt;code&gt;&lt;br /&gt;UPDATE `xxx_blog`.`wp_users` SET `user_pass` = MD5( 'password' ) WHERE `wp_users`.`ID` =2 ;&lt;/code&gt;&lt;br /&gt;參考&lt;a href="http://codex.wordpress.org/Resetting_Your_Password"&gt;http://codex.wordpress.org/Resetting_Your_Password&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/777077092642445515-1000609789131709794?l=birdy-party.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://birdy-party.blogspot.com/feeds/1000609789131709794/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=777077092642445515&amp;postID=1000609789131709794' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/1000609789131709794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/1000609789131709794'/><link rel='alternate' type='text/html' href='http://birdy-party.blogspot.com/2007/10/wordpress.html' title='Wordpress忘記密碼的解決方法'/><author><name>Mr. BigCat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-777077092642445515.post-4032875326252730768</id><published>2007-03-19T11:35:00.000+08:00</published><updated>2007-03-19T11:38:23.576+08:00</updated><title type='text'>遊戲中常見的幾種音樂格式</title><content type='html'>這篇是貼我自己以前寫的文章。&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;介紹這些格式的文章應該不少，但我想大多過於專業&lt;br /&gt;我試著用自己的話，盡量簡單地描述四種遊戲最常見的音樂格式&lt;br /&gt;&lt;br /&gt;&lt;ol type="1"&gt;&lt;li&gt;&lt;span style="color:Red;"&gt;MIDI&lt;/span&gt;：通常副檔名為mid，MIDI是Music Instrument Digital Interface的簡寫&lt;br /&gt;特色是檔案很小，非常小&lt;br /&gt;&lt;br /&gt;簡單的這麼解釋好了：&lt;br /&gt;&lt;br /&gt;mid檔就像是樂譜，記錄著「第5.02秒鋼琴要彈下sol、第6.31秒吉他要彈下ra」這樣的資訊&lt;br /&gt;然而mid檔裡本身並沒有吉他、鋼琴的音色。這也就是為何mid檔案小的原因&lt;br /&gt;&lt;br /&gt;那當我們的電腦撥放mid檔時，怎麼知道吉他、鋼琴的音色呢？&lt;br /&gt;這是因為mid檔通常遵守一種叫「General MIDI」的格式&lt;br /&gt;「樂器1」表示鋼琴、「樂器25」表示尼龍弦的古典吉他&lt;br /&gt;然而我們的音效卡上有一個「MIDI音源器」，負責按照這些樂器編號，把聲音撥放出來&lt;br /&gt;(當然有軟體音源這個例外，但不在此討論)&lt;br /&gt;&lt;br /&gt;單純使用mid檔的話有一些限制&lt;br /&gt;&lt;br /&gt;&lt;ol type="a"&gt;&lt;li&gt;音色是看使用者電腦上的音源，不同的電腦撥放出來的效果可能會不同&lt;br /&gt;(大部份的人應該都是爛爛的AC97音效卡)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;音色有限，只有General MIDI提供的音色 (我記得是128種，不知道有沒有記錯)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;效果有限，沒辦法自由的調整迴音、各種效果(equalizer, echo, reverb, flanger等....多不勝數)&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:Red;"&gt;Wave&lt;/span&gt;：通常副檔名為wav&lt;br /&gt;特色是檔案很大，非常大&lt;br /&gt;&lt;br /&gt;大家可以把他想像成忠實的把聲音記錄下來的檔案格式&lt;br /&gt;&lt;br /&gt;音質最好，所以花費的空間多&lt;br /&gt;(大家可以把他想像成圖檔中的bmp檔)&lt;br /&gt;&lt;br /&gt;許多商業遊戲都是用CD音軌的方式來儲存音樂&lt;br /&gt;CD音軌其實也是屬於Wave的無失真儲存方式&lt;br /&gt;(CD音軌的資訊其實就等於Sample rate=44,100Hz 雙聲道的Wave檔)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;很常見的編曲方式就是：使用MIDI編曲軟體+自己的軟/硬體音源 =&amp;gt; 混音成wave檔&lt;br /&gt;&lt;br /&gt;然後再看要不要做壓縮之類的&lt;br /&gt;和單純使用General MIDI比起來，這樣可以使用很多種的效果，處理上也有很大的彈性&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Wave和以下的mp3, ogg...等真正儲存聲音的，通稱為數位音訊檔&lt;br /&gt;接下來只是把Wave壓縮過的格式，我就不詳細介紹了&lt;br /&gt;主要的目的只是跟大家講數位音訊和mid檔之間的差別&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:Red;"&gt;mp3&lt;/span&gt;：&lt;br /&gt;相信大家都很熟悉吧 XD&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;mp3是將wave失真壓縮(註)後的一種格式&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:Red;"&gt;ogg&lt;/span&gt;：&lt;br /&gt;可以參考&lt;a href="http://zh.wikipedia.org/w/index.php?title=Ogg_Vorbis&amp;amp;variant=zh-tw" target="_blank"&gt;維基百科: Ogg Vorbis&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;一樣是失真壓縮&lt;br /&gt;據說同樣壓縮比下的音質比mp3還好，我自己倒是沒試過&lt;br /&gt;在一般使用者間這個格式還是沒有比mp3被廣為使用&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;註：失真壓縮&lt;br /&gt;失真壓縮就是指在壓縮的過程中，損失一些原有的資訊&lt;br /&gt;&lt;br /&gt;舉大家比較熟悉的圖片來說，bmp就好像wav的角色&lt;br /&gt;png,gif就是一種非失真壓縮(畫質不會變差)，jpg就是失真壓縮&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/777077092642445515-4032875326252730768?l=birdy-party.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://birdy-party.blogspot.com/feeds/4032875326252730768/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=777077092642445515&amp;postID=4032875326252730768' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/4032875326252730768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/4032875326252730768'/><link rel='alternate' type='text/html' href='http://birdy-party.blogspot.com/2007/03/blog-post.html' title='遊戲中常見的幾種音樂格式'/><author><name>Mr. BigCat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-777077092642445515.post-7950945379626648374</id><published>2007-03-08T15:23:00.000+08:00</published><updated>2008-11-13T18:19:30.573+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenGL'/><title type='text'>GLUT+Code::Blocks+Mingw環境設定</title><content type='html'>&lt;a href="http://en.wikipedia.org/wiki/OpenGL_Utility_Toolkit"&gt;GLUT&lt;/a&gt;....不介紹了，反正就是OpenGL的一些Toolkit，讓programmer避免處理low level的視窗控制。&lt;br /&gt;&lt;br /&gt;其實我滿推薦寫程式的人不要「只」用微軟的IDE。之前看到某位網友抱怨，他們學校沒有正版的VC教育版，老師還要求要用VC寫作業。多推廣一下免費開源的IDE不是很好嗎？&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;Code::Blocks+Mingw的安裝可以參考&lt;a href="http://birdy-party.blogspot.com/2007/02/ogre-mingw-codeblocks.html"&gt;這篇&lt;/a&gt;，如果不是要跑OGRE的話，直接去&lt;a href="http://www.codeblocks.org/downloads.shtml"&gt;官網下載區&lt;/a&gt;抓安裝包應該比較簡單 (with Mingw compiler的)。&lt;br /&gt;&lt;br /&gt;原本的GLUT Windows Binary和Mingw似乎不太相容，請抓&lt;a href="http://mywebpage.netscape.com/PtrPck/glut.htm"&gt;GLUT for Mingw32&lt;/a&gt;，隨便解壓到一個目錄(我放在Mingw下)，就可以了。&lt;br /&gt;&lt;br /&gt;預備動作就這麼簡單 (不過我灌時試GLUT library試了一陣子，才發現要抓Mingw版的) ，進到Code::Block，New project -&gt; GLUT project -&gt; 到GLUT's location時輸入你安裝GLUT的位置。&lt;br /&gt;&lt;br /&gt;這樣開好專案後會出現template的範例程式，compile&amp;run看看...&lt;br /&gt;&lt;code&gt;C:\codeblock\GLUTMingw32\include\GL\glut.h:45: error: redeclaration of C++ built-in type `short'&lt;/code&gt;&lt;br /&gt;疑...不知道怎麼回事的error，但我們見招拆招一下&lt;br /&gt;方法一: 修改範例程式，再include之前加上&lt;code&gt;#   define _WCHAR_T_DEFINED&lt;/code&gt;&lt;br /&gt;方法二: 修改glyt.h第45行，將&lt;code&gt;typedef unsigned short wchar_t;&lt;/code&gt;這行給註解掉&lt;br /&gt;&lt;br /&gt;兩者任做一項，這樣就可以run囉...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ZNCDOmrFXjs/Re_hS4TDGEI/AAAAAAAAAFI/qbNWSD8dVYs/s1600-h/GLUT.PNG"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_ZNCDOmrFXjs/Re_hS4TDGEI/AAAAAAAAAFI/qbNWSD8dVYs/s400/GLUT.PNG" alt="" id="BLOGGER_PHOTO_ID_5039494222517049410" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/777077092642445515-7950945379626648374?l=birdy-party.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://birdy-party.blogspot.com/feeds/7950945379626648374/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=777077092642445515&amp;postID=7950945379626648374' title='3 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/7950945379626648374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/7950945379626648374'/><link rel='alternate' type='text/html' href='http://birdy-party.blogspot.com/2007/03/glutcodeblocksmingw.html' title='GLUT+Code::Blocks+Mingw環境設定'/><author><name>Mr. BigCat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_ZNCDOmrFXjs/Re_hS4TDGEI/AAAAAAAAAFI/qbNWSD8dVYs/s72-c/GLUT.PNG' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-777077092642445515.post-3518031743213207580</id><published>2007-02-21T11:11:00.000+08:00</published><updated>2007-02-21T14:52:20.540+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TJS'/><category scheme='http://www.blogger.com/atom/ns#' term='Kirikiri'/><title type='text'>TJS特訓99解說篇</title><content type='html'>&lt;a href="http://birdy-party.blogspot.com/2007/02/tjs99.html"&gt;上一篇&lt;/a&gt;忘了說，我的架構主要是參考這篇&lt;a href="http://homepage1.nifty.com/gutchie/kirikiri_kag/tjs_game002.html"&gt;TJS實作教學的&lt;/a&gt;。&lt;br /&gt;&lt;br /&gt;先講一下類別的設計：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;MovingObject：所有戰場上會移動的物件，Player及Enemy的父類別&lt;/li&gt;&lt;li&gt;Player：玩家自機，畫面上那個藍點&lt;/li&gt;&lt;li&gt;Enemy：敵機，不停撞過來的那些小紅點&lt;/li&gt;&lt;li&gt;GameMaster：管理整個遊戲的迴圈與邏輯&lt;/li&gt;&lt;li&gt;GameWindow：遊戲視窗&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:180%;"&gt;GameWindow類別&lt;/span&gt;&lt;br /&gt;作用其實很簡單&lt;br /&gt;&lt;ul&gt;&lt;li&gt;建立一個視窗，設定大小為400x400。&lt;/li&gt;&lt;li&gt;建立一個Layer，該視窗的主要圖層。&lt;/li&gt;&lt;li&gt;然後建立一個GameMaster物件，就這樣。接下來遊戲的進行都交給GameMaster控制。&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:180%;"&gt;GameMaster類別&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;建立fore(前景)圖層，所有遊戲的物件都畫在這個圖層上。&lt;/li&gt;&lt;li&gt;建立玩家物件及99個敵人物件，敵人物件用一個陣列(Array)存放。&lt;/li&gt;&lt;li&gt;建立一個Timer，每25ms呼叫一次 (理想狀態下40fps)，負責玩家、敵機的移動、碰撞判定。&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:180%;"&gt;MovingObject類別&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;之前說過這個範例不要想用到圖檔，所以我們使用正方形來表示自機與子彈。size是邊長，color是顏色&lt;/li&gt;&lt;li&gt;繼承Layer物件，建構時將自己放在fore這個圖層上&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:180%;"&gt;Enemy類別&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;建構時指定顏色(子彈是紅色)及邊長。&lt;/li&gt;&lt;li&gt;init函式負責初始化敵機 (在畫面的邊緣出現，向畫面內非)&lt;/li&gt;&lt;li&gt;check_bound函式負責檢查敵機是否出界了，如果是的話，呼叫init來重置敵機。&lt;/li&gt;&lt;li&gt;update函式負責敵機的移動&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:180%;"&gt;Player類別&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;建構時指定顏色(藍色)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;update函式負責移動，使用System.getKeyState()來判斷方向鍵是否已被按下。&lt;/li&gt;&lt;/ul&gt;我就不一行一行的講解程式碼了，有興趣的話可以留言討論。&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;延伸練習：這只是個小小範例，我的code有滿多問題的，如果你想練習的話...&lt;br /&gt;&lt;ol&gt;&lt;li&gt;我忘了寫Player出界的判定，請補上&lt;/li&gt;&lt;li&gt;碰撞判定的公式其實是不對的，你發現了嗎？請修正&lt;/li&gt;&lt;li&gt;Frame穩速的機制是否有比使用Timer還要好的方式呢？&lt;/li&gt;&lt;li&gt;敵機移動的速度目都只是整數，請修改init函式讓敵機的移動速度不要那麼規律。&lt;/li&gt;&lt;li&gt;找找看還有沒有其他bug吧 :)&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/777077092642445515-3518031743213207580?l=birdy-party.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://birdy-party.blogspot.com/feeds/3518031743213207580/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=777077092642445515&amp;postID=3518031743213207580' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/3518031743213207580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/3518031743213207580'/><link rel='alternate' type='text/html' href='http://birdy-party.blogspot.com/2007/02/tjs99_21.html' title='TJS特訓99解說篇'/><author><name>Mr. BigCat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-777077092642445515.post-3099891242123617159</id><published>2007-02-20T21:47:00.000+08:00</published><updated>2008-11-13T18:19:30.742+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TJS'/><category scheme='http://www.blogger.com/atom/ns#' term='Kirikiri'/><title type='text'>吉里吉里TJS特訓99</title><content type='html'>特訓99是數年前在巴哈姆特kuso版看到的一個遊戲，規則很簡單：「閃避畫面上的99顆子彈，看你可以撐幾秒」自從看到了這個遊戲之後，每到一個可以寫遊戲的環境，我都把他當hello, world來寫了，幫助熟悉整個程式環境。(印像中寫過C++/DirectDraw, J2SE, J2ME on 手機, VisualBasic, Ruby/RPG Maker XP還有什麼忘了)&lt;br /&gt;&lt;br /&gt;剛剛把試著用吉里吉里的TJS寫了一下，心得...喵的文件有夠不完整，要到處翻來翻趣，有的地方乾脆去template裡直接看他怎麼寫的比較快。寫出來就這樣囉：&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ZNCDOmrFXjs/Rdr9QLUuNiI/AAAAAAAAAEk/zwfuol9K2Wk/s1600-h/99.PNG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; cursor: pointer;" src="http://3.bp.blogspot.com/_ZNCDOmrFXjs/Rdr9QLUuNiI/AAAAAAAAAEk/zwfuol9K2Wk/s400/99.PNG" alt="" id="BLOGGER_PHOTO_ID_5033613987899389474" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;不停的閃子彈閃到死吧 XD&lt;br /&gt;&lt;ul&gt;&lt;li&gt;其實code寫的很差，我只是一直翻文件然後找出一個能寫出來的方法而已。很多地方應該可以再修正的。碰撞判定的公式其實也是錯的，可是我懶得改了，可以跑就好了啦，只是做個小範例而已 @@&lt;br /&gt;&lt;/li&gt;&lt;li&gt;為了簡化範例，被擊中game over時就直接跳出遊戲了 (好我懶得做game over畫面了 XD)&lt;/li&gt;&lt;li&gt;為了簡化範例所以沒有貼圖，都是用方塊表示。這樣只需要把程式複置貼上就可以跑囉&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;把以下程式複置貼到startup.tjs (原本的程式清掉) 即可&lt;br /&gt;&lt;code&gt;&lt;br /&gt;class MovingObject extends Layer{&lt;br /&gt;  var master;&lt;br /&gt;  var size;&lt;br /&gt;  var color;&lt;br /&gt;  &lt;br /&gt;  function MovingObject(gm, window, parent) {&lt;br /&gt;    super.Layer(window, parent);&lt;br /&gt;    master = gm;&lt;br /&gt;    visible = true;&lt;br /&gt;    setSize(size, size);&lt;br /&gt;    fillRect(0, 0, size, size, color);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class Enemy extends MovingObject {&lt;br /&gt;  var vx, vy;&lt;br /&gt;  function Enemy(gm, window, parent) {&lt;br /&gt;    size = 6;&lt;br /&gt;    color = 0xffff0000;&lt;br /&gt;    super.MovingObject(gm, window, parent);&lt;br /&gt;    init();&lt;br /&gt;  }&lt;br /&gt;  function init() {&lt;br /&gt;    var side = Math.floor(Math.random()*4);&lt;br /&gt;    switch (side) {&lt;br /&gt;    case 0:&lt;br /&gt;      top = 0;&lt;br /&gt;      left = Math.floor(Math.random()*400);&lt;br /&gt;      vx = Math.floor(Math.random()*5)-2;&lt;br /&gt;      vy = Math.floor(Math.random()*2)+1;&lt;br /&gt;      break;&lt;br /&gt;    case 1:&lt;br /&gt;      top = 400;&lt;br /&gt;      left = Math.floor(Math.random()*400);&lt;br /&gt;      vx = Math.floor(Math.random()*5)-2;&lt;br /&gt;      vy = -Math.floor(Math.random()*2)-1;&lt;br /&gt;      break;&lt;br /&gt;    case 2:&lt;br /&gt;      left = 0;&lt;br /&gt;      top = Math.floor(Math.random()*400);      &lt;br /&gt;      vy = Math.floor(Math.random()*5)-2;&lt;br /&gt;      vx = Math.floor(Math.random()*2)+1;&lt;br /&gt;      break;&lt;br /&gt;    default:&lt;br /&gt;      left = 400;&lt;br /&gt;      top = Math.floor(Math.random()*400);&lt;br /&gt;      vy = Math.floor(Math.random()*5)-2;&lt;br /&gt;      vx = -Math.floor(Math.random()*2)-1;            &lt;br /&gt;      break;&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  function check_bound() {&lt;br /&gt;    if (top&amp;gt;-5&amp;&amp;top&amp;lt;405&amp;&amp;top&amp;gt;-5&amp;&amp;top&amp;lt;405)&lt;br /&gt;      return;&lt;br /&gt;    init();&lt;br /&gt;  }&lt;br /&gt;  function update() {&lt;br /&gt;    top += vy;&lt;br /&gt;    left += vx;&lt;br /&gt;    check_bound();&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class Player extends MovingObject {&lt;br /&gt;  function Player(gm, window, parent) {&lt;br /&gt;    size = 10;&lt;br /&gt;    color = 0xff0000ff;&lt;br /&gt;    super.MovingObject(gm, window, parent);&lt;br /&gt;    top = left = 200;&lt;br /&gt;  }&lt;br /&gt;  function update() {&lt;br /&gt;    var speed = 2;&lt;br /&gt;    if (System.getKeyState(VK_DOWN))&lt;br /&gt;      top += speed;&lt;br /&gt;    if (System.getKeyState(VK_UP))&lt;br /&gt;      top -= speed;&lt;br /&gt;    if (System.getKeyState(VK_LEFT))&lt;br /&gt;      left -= speed;&lt;br /&gt;    if (System.getKeyState(VK_RIGHT))&lt;br /&gt;      left += speed;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class GameMaster {&lt;br /&gt;  var window;&lt;br /&gt;  var parent;&lt;br /&gt;  var fore;&lt;br /&gt;  &lt;br /&gt;  var player;&lt;br /&gt;  var enemies;&lt;br /&gt;&lt;br /&gt;  var timer1;&lt;br /&gt;&lt;br /&gt;  function GameMaster(win, par) {&lt;br /&gt;    window = win;&lt;br /&gt;    parent = par;&lt;br /&gt;    &lt;br /&gt;    fore = new Layer(win, par);&lt;br /&gt;&lt;br /&gt;    with (fore) {&lt;br /&gt;      .visible = true;&lt;br /&gt;      .setSize(400, 400);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    timer1 = new Timer(onTimer1, "");&lt;br /&gt;    timer1.interval = 25;&lt;br /&gt;    timer1.enabled = true;&lt;br /&gt;    &lt;br /&gt;    player = new Player(this, window, fore);&lt;br /&gt;    &lt;br /&gt;    enemies = [];&lt;br /&gt;    for (var i=0; i&amp;lt;99; ++i) {&lt;br /&gt;      enemies.add(new Enemy(this, window, fore));&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;  }&lt;br /&gt;  function onTimer1() {&lt;br /&gt;    player.update();&lt;br /&gt;    for (var i=0; i&amp;lt;enemies.count; ++i) {&lt;br /&gt;      var e = enemies[i];&lt;br /&gt;      e.update();&lt;br /&gt;      if (Math.abs(e.top-player.top)&amp;lt;10&amp;&amp;Math.abs(e.left-player.left)&amp;lt;10)&lt;br /&gt;        window.close();&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class GameWindow extends Window {&lt;br /&gt;  var master;&lt;br /&gt;&lt;br /&gt;  function GameWindow() {&lt;br /&gt;&lt;br /&gt;    super.Window();&lt;br /&gt;    &lt;br /&gt;    add(new Layer(this, null));&lt;br /&gt;    primaryLayer.setSize(400, 400);&lt;br /&gt;    setInnerSize(400, 400);&lt;br /&gt;&lt;br /&gt;    caption = "特訓99";&lt;br /&gt;    visible = true;&lt;br /&gt;    &lt;br /&gt;    master = new GameMaster(this, primaryLayer);&lt;br /&gt;  }&lt;br /&gt;  function finalize() {&lt;br /&gt;    super.finalize();&lt;br /&gt;  }&lt;br /&gt; function action(ev) { }&lt;br /&gt;}&lt;br /&gt;var win = new GameWindow();&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;解說篇....下次再說吧 XD&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/777077092642445515-3099891242123617159?l=birdy-party.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://birdy-party.blogspot.com/feeds/3099891242123617159/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=777077092642445515&amp;postID=3099891242123617159' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/3099891242123617159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/3099891242123617159'/><link rel='alternate' type='text/html' href='http://birdy-party.blogspot.com/2007/02/tjs99.html' title='吉里吉里TJS特訓99'/><author><name>Mr. BigCat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_ZNCDOmrFXjs/Rdr9QLUuNiI/AAAAAAAAAEk/zwfuol9K2Wk/s72-c/99.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-777077092642445515.post-4607133250130909625</id><published>2007-02-16T21:58:00.000+08:00</published><updated>2007-02-16T22:06:37.733+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ShatteredRuby'/><category scheme='http://www.blogger.com/atom/ns#' term='OGRE'/><title type='text'>初探Shattered Ruby(4) - 結論</title><content type='html'>前四篇對於Shattered Ruby似乎是貶多於褒，但其實我覺得這東西還是滿有趣的。有很多implement的功能是這裡沒提到的，大家可以詳閱&lt;a href="http://wiki.shatteredruby.com/index.php?title=Main_Page"&gt;Wiki&lt;/a&gt;及&lt;a href="http://www.shatteredruby.com/api_docs/index.html"&gt;RDoc&lt;/a&gt;。其實他們已經做了很多了....&lt;br /&gt;&lt;br /&gt;說實話，我沒看過一個工具建構以3D介面為基楚的遊戲那麼容易的，這應該是他最大的優點吧。要是目前這個專案還有人持續在maintain，那我應該毫不考慮的繼續玩下去。&lt;br /&gt;&lt;br /&gt;Shattered Ruby中的設計流程其實很高階，我們可以看到Tutorial幾乎都是用DSL的方式在寫作。但根據抽象滲漏法則，當專案被擴大的時候不知道會不會遇到麻煩...&lt;br /&gt;&lt;br /&gt;好啦，Shattered Ruby就寫到這囉，我應該短期之內不會再碰他了。有什麼意見的話也歡迎提出來吧 :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/777077092642445515-4607133250130909625?l=birdy-party.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://birdy-party.blogspot.com/feeds/4607133250130909625/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=777077092642445515&amp;postID=4607133250130909625' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/4607133250130909625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/4607133250130909625'/><link rel='alternate' type='text/html' href='http://birdy-party.blogspot.com/2007/02/shattered-ruby4.html' title='初探Shattered Ruby(4) - 結論'/><author><name>Mr. BigCat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-777077092642445515.post-386194162556391756</id><published>2007-02-16T21:40:00.000+08:00</published><updated>2008-11-13T18:19:30.840+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ShatteredRuby'/><category scheme='http://www.blogger.com/atom/ns#' term='OGRE'/><title type='text'>初探Shattered Ruby(3) - 回到舊版本玩Example</title><content type='html'>我們可以看到Shattered Ruby Wiki首頁上有好幾個Tutorial&amp;Example，但除了第一個之外，其他都不能在最新的版本上跑。如果我們要快速的玩玩看Example的話(不想去改code)，可能回到舊版本是比較快的選擇。&lt;br /&gt;&lt;br /&gt;我們以&lt;a href="http://wiki.shatteredruby.com/index.php?title=Tetris"&gt;俄羅斯方塊&lt;/a&gt;為例吧....先把他解壓到某個地方，然後我們開始裝0.3.3版的Shattered Ruby&lt;br /&gt;&lt;br /&gt;首先為了避免混淆，我們先將舊版本的ShatteredRuby全都反安裝。執行&lt;br /&gt;&lt;code&gt;&lt;br /&gt;C:\temp\mygame&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;gem uninstall shattered*&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Select RubyGem to uninstall:&lt;br /&gt;1. shattered-0.4.0.1&lt;br /&gt;2. shattered_ogre-0.4-windows&lt;br /&gt;3. shattered_pack-0.4.0.1&lt;br /&gt;4. shattered_support-0.4.0.1&lt;br /&gt;5. &lt;span style="color: rgb(255, 0, 0);"&gt;All versions&lt;/span&gt;&lt;br /&gt;&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;5&lt;/span&gt;&lt;br /&gt;Successfully uninstalled shattered version 0.4.0.1&lt;br /&gt;Successfully uninstalled shattered_ogre version 0.4&lt;br /&gt;Successfully uninstalled shattered_pack version 0.4.0.1&lt;br /&gt;Successfully uninstalled shattered_support version 0.4.0.1&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;然後再安裝0.3.3版的ShatteredRuby，可能又需要一些時間，因為另一個revision的DLL必需重新下載一次，安裝方式如下：&lt;br /&gt;&lt;code&gt;&lt;br /&gt;C:\temp\mygame&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;gem install -y shattered -v 0.3.3&lt;/span&gt;&lt;br /&gt;Bulk updating Gem source index for: http://gems.rubyforge.org&lt;br /&gt;Bulk updating Gem source index for: http://gems.rubyforge.org&lt;br /&gt;Select which gem to install for your platform (i386-mswin32)&lt;br /&gt;1. shattered_ogre 0.4 (windows)&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt; 2. shattered_ogre 0.3.3 (windows)&lt;/span&gt;&lt;br /&gt;3. Cancel installation&lt;br /&gt;&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;2&lt;/span&gt;&lt;br /&gt;Bulk updating Gem source index for: http://gems.rubyforge.org&lt;br /&gt;Bulk updating Gem source index for: http://gems.rubyforge.org&lt;br /&gt;Successfully installed shattered-0.3.3&lt;br /&gt;Successfully installed shattered_ogre-0.3.3-windows&lt;br /&gt;Successfully installed shattered_pack-0.4.0.1&lt;br /&gt;Successfully installed shattered_support-0.4.0.1&lt;br /&gt;下略&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;這樣就裝好了....但我們執行tetris時卻會發生錯誤....經過一連串的試誤，我發現在gemspec中這樣定義：shattered 0.3.3版需要shattered_pack及shattered_support0.3.3「以上」的版本。但事實上是不相容的。所以我們必需手動移除，再灌正確的版本。 (如果你熟希gems的話，你可以一開始就灌正確的版本，這樣比較快)&lt;br /&gt;&lt;br /&gt;執行這四行吧：&lt;br /&gt;&lt;code&gt;&lt;br /&gt;gem uni shattered_support -i&lt;br /&gt;gem uni shattered_pack -i&lt;br /&gt;gem i shattered_support -v 0.3.3&lt;br /&gt;gem i shattered_pack -v 0.3.3&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;事情還沒結束，還要上wiki的補丁。見&lt;a href="http://wiki.shatteredruby.com/index.php?title=Tetris#A_Confession.21"&gt;A Confession&lt;/a&gt;這段。 (我試過了，上面手動灌0.3.3版和這個補丁兩者都是必需的，缺一不可，當初gemspec沒寫好的關係 Orz)&lt;br /&gt;&lt;br /&gt;再跑一次tetris的script/runner&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ZNCDOmrFXjs/RdWmTf7sM5I/AAAAAAAAAD0/16oUBr_CKds/s1600-h/Tetris.PNG"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_ZNCDOmrFXjs/RdWmTf7sM5I/AAAAAAAAAD0/16oUBr_CKds/s400/Tetris.PNG" alt="" id="BLOGGER_PHOTO_ID_5032111012575982482" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;好啦....終於成功了....真累....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/777077092642445515-386194162556391756?l=birdy-party.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://birdy-party.blogspot.com/feeds/386194162556391756/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=777077092642445515&amp;postID=386194162556391756' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/386194162556391756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/386194162556391756'/><link rel='alternate' type='text/html' href='http://birdy-party.blogspot.com/2007/02/shattered-ruby3-example.html' title='初探Shattered Ruby(3) - 回到舊版本玩Example'/><author><name>Mr. BigCat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_ZNCDOmrFXjs/RdWmTf7sM5I/AAAAAAAAAD0/16oUBr_CKds/s72-c/Tetris.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-777077092642445515.post-8188365691963029674</id><published>2007-02-16T21:12:00.000+08:00</published><updated>2008-11-13T18:19:30.996+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ShatteredRuby'/><category scheme='http://www.blogger.com/atom/ns#' term='OGRE'/><title type='text'>初探Shattered Ruby(2) - Follow the first tutorial</title><content type='html'>如果你玩過rails，你大概一秒鐘就可以知道shatter所產生的每個目錄的功用。不知道也沒關係，一開始我們需要注意的目錄其實很少：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;app：整個遊戲的主程式都在這裡面&lt;/li&gt;&lt;li&gt;config：一些設定檔&lt;/li&gt;&lt;li&gt;script：一些ruby的script，runner可以啟動遊戲、generate可以幫助產生程式碼等等...&lt;/li&gt;&lt;/ul&gt;接下來就請跟著官網wiki的&lt;a href="http://wiki.shatteredruby.com/index.php?title=Your_First_Moves"&gt;Your first move&lt;/a&gt;這篇教學做吧。&lt;br /&gt;&lt;code&gt;ruby script/generate state observation&lt;/code&gt;&lt;br /&gt;與rails一樣，這個框架有內建一些generator幫助產生程式碼。他的概念大概是整個遊戲會在不同的state間轉換(state machine)，每個state會有不同的input/output。現在我們產生了一個名為observation的state。但現在還不能執行，因為還沒有指定初始狀態。請照wiki上的步驟修改config/environment.rb (哇咧，連這個也要取和rails一樣的名字)&lt;br /&gt;&lt;br /&gt;執行&lt;code&gt;ruby script/runner&lt;/code&gt;吧，程式順利啟動了，雖然因為我們沒在場景上放上任何物件，所以畫面是一片全黑的，但至少應該可以順利執行了。&lt;br /&gt;&lt;br /&gt;接下來，跟著教學做吧...&lt;code&gt; ruby script/generate actor dirty_ruby&lt;/code&gt;&lt;br /&gt;我們可以看到程式又自動產生了一堆檔案。跟著Wiki上的教學修改ObservationState物件，我們可以看到這是一個Domain Specific Language應用的例證...code真是有夠簡單的 :) 注意因為最新版的generator有問題，可能會當機，請參閱wiki的說明從範例source code中得到正確的mesh檔。&lt;br /&gt;&lt;br /&gt;接下來我就不詳細講，跟著wiki跑完這個簡單的tutorial並沒有問題。你應該可以得到一個旋轉的紅寶石，並且可以控制他左右移動。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ZNCDOmrFXjs/RdWyrf7sM7I/AAAAAAAAAEM/jlKrY4J_N_s/s1600-h/ruby.PNG"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_ZNCDOmrFXjs/RdWyrf7sM7I/AAAAAAAAAEM/jlKrY4J_N_s/s400/ruby.PNG" alt="" id="BLOGGER_PHOTO_ID_5032124619032376242" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;注意一點：我覺得這裡的View並不是MVC架構中的View，反而比較像是Data Model(定義了物件的mesh和行為)。如果你本來懂MVC架構，這可能是比較容易混淆的地方。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/777077092642445515-8188365691963029674?l=birdy-party.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://birdy-party.blogspot.com/feeds/8188365691963029674/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=777077092642445515&amp;postID=8188365691963029674' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/8188365691963029674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/8188365691963029674'/><link rel='alternate' type='text/html' href='http://birdy-party.blogspot.com/2007/02/shattered-ruby2-follow-first-tutorial.html' title='初探Shattered Ruby(2) - Follow the first tutorial'/><author><name>Mr. BigCat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_ZNCDOmrFXjs/RdWyrf7sM7I/AAAAAAAAAEM/jlKrY4J_N_s/s72-c/ruby.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-777077092642445515.post-4129701893744460893</id><published>2007-02-16T19:46:00.000+08:00</published><updated>2007-02-16T21:11:45.334+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ShatteredRuby'/><category scheme='http://www.blogger.com/atom/ns#' term='OGRE'/><title type='text'>初探Shattered Ruby(1) - 簡介&amp;安裝&amp;Getting Start</title><content type='html'>之前在&lt;a href="http://birdy-party.blogspot.com/2007/02/ogre-language-binding.html"&gt;OGRE language binding&lt;/a&gt;中曾經稍微提到過&lt;a href="http://www.shatteredruby.com/"&gt;Shattered Ruby&lt;/a&gt;，實在是對他滿好奇的，所以今天就抓下來玩了一下。還滿有趣的，但不是每件事都那麼美好：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;先說優點，玩起來真的很像在用Ruby on Rails寫網頁，操作有夠簡單，很少的程式碼就可以寫出一個小遊戲。&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Shattered Ruby已經快要半年沒有更新了，根據&lt;a href="http://weblog.shatteredruby.com/"&gt;官方blog&lt;/a&gt;的說法，開發人員有其他事情在忙著。&lt;/li&gt;&lt;li&gt;有些功能在最新版本(0.4)反而無法使用，作者在wiki上說很快就會修正，但很久沒動靜了。另外，Wiki上很多tutorial及example並不能在最新版本上跑，document is out of date.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Lack of support，開發人員不知道什麼時候才會回來，搞不好一輩子都不會開發了，除非你有自己去延續開發的心理準備，否則...XD&lt;/li&gt;&lt;li&gt;Python-OGRE裡至少有提供了ODE, OgreNewt這些物理引擎的介面。如果在Shattered Ruby做碰撞判定，你不是要自己寫native binding，不然就是要拿慢到要死的Ruby去計算？ (我是Ruby的擁護者，但Ruby的長處絕不在物理運算 XD)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;目前看起來，做做小遊戲可以，拿來開發中大型遊戲還差的遠。所以我大概分成三篇稍微介紹一下Shattered Ruby就會結束了。&lt;br /&gt;&lt;br /&gt;Shattered Ruby的安裝其實很簡單。首先你要先裝好Ruby及RubyGems (RubyGems是Ruby的套件管理系統)。在Windows系統下最方便的方法就是直接安裝&lt;a href="http://rubyforge.org/projects/rubyinstaller/"&gt;Ruby One-click Installer&lt;/a&gt;就好了。&lt;br /&gt;&lt;br /&gt;安裝好之後，進入命令提示字元，輸入&lt;br /&gt;&lt;code&gt;gem i -y shattered&lt;/code&gt;&lt;br /&gt;他就會自動幫你下載/安裝好。台灣最近連RubyForge的速度好像變慢了些，下載的過程中包括了OGRE, mingw, DirectX的DLL檔，所以可能需要比較久的時間，請耐心等候。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;OK...Let's getting start&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;先建立一個空目錄，然後進到命令提示字元，切換到該目錄下...如：&lt;br /&gt;&lt;code&gt;&lt;br /&gt;cd \&lt;br /&gt;mkdir temp&lt;br /&gt;cd temp&lt;br /&gt;shattered mygame&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;最後一行是幫你建立一個遊戲專案目錄，讓我們看看裡面有什麼&lt;br /&gt;&lt;code&gt;&lt;br /&gt;C:\temp&amp;gt;dir mygame&lt;br /&gt;磁碟區 C 中的磁碟沒有標籤。&lt;br /&gt;磁碟區序號:  1CD9-4BA7&lt;br /&gt;&lt;br /&gt;C:\temp\mygame 的目錄&lt;br /&gt;&lt;br /&gt;2007/02/16  下午 04:57    &amp;lt;DIR&amp;gt;          .&lt;br /&gt;2007/02/16  下午 04:57    &amp;lt;DIR&amp;gt;          ..&lt;br /&gt;2007/02/16  下午 05:01    &amp;lt;DIR&amp;gt;          app&lt;br /&gt;2007/02/16  下午 04:59    &amp;lt;DIR&amp;gt;          config&lt;br /&gt;2007/02/16  下午 04:57    &amp;lt;DIR&amp;gt;          doc&lt;br /&gt;2007/02/16  下午 04:57    &amp;lt;DIR&amp;gt;          log&lt;br /&gt;2007/02/16  下午 04:57               454 Rakefile&lt;br /&gt;2007/02/16  下午 04:57               905 README&lt;br /&gt;2007/02/16  下午 04:57    &amp;lt;DIR&amp;gt;          script&lt;br /&gt;2007/02/16  下午 04:57    &amp;lt;DIR&amp;gt;          test&lt;br /&gt;2007/02/16  下午 04:57    &amp;lt;DIR&amp;gt;          vendor&lt;br /&gt;              2 個檔案           1,359 位元組&lt;br /&gt;              9 個目錄   7,678,304,256 位元組可用&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;有用過Ruby on rails的人應該都看的出來，這架構明顯是抄rails的吧 XD 只是一個用來寫網頁一個用來寫遊戲。&lt;br /&gt;&lt;br /&gt;到這裡...簡介與安裝就結束囉。我們下篇繼續&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/777077092642445515-4129701893744460893?l=birdy-party.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://birdy-party.blogspot.com/feeds/4129701893744460893/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=777077092642445515&amp;postID=4129701893744460893' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/4129701893744460893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/4129701893744460893'/><link rel='alternate' type='text/html' href='http://birdy-party.blogspot.com/2007/02/shattered-ruby1-start.html' title='初探Shattered Ruby(1) - 簡介&amp;安裝&amp;Getting Start'/><author><name>Mr. BigCat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-777077092642445515.post-9171765370131747972</id><published>2007-02-15T00:23:00.000+08:00</published><updated>2007-02-15T00:24:33.303+08:00</updated><title type='text'>(閒聊)在blogspot貼程式</title><content type='html'>不知道什麼狀況會造成縮排的空格全部不見 (好像要到撰寫模式才會，但大部份狀況下又都不會)。對於python尤其可怕，這是我唯一一個用過的語言用縮排做blocking的....Orz&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/777077092642445515-9171765370131747972?l=birdy-party.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://birdy-party.blogspot.com/feeds/9171765370131747972/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=777077092642445515&amp;postID=9171765370131747972' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/9171765370131747972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/9171765370131747972'/><link rel='alternate' type='text/html' href='http://birdy-party.blogspot.com/2007/02/blogspot.html' title='(閒聊)在blogspot貼程式'/><author><name>Mr. BigCat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-777077092642445515.post-3977492440416104645</id><published>2007-02-14T23:42:00.000+08:00</published><updated>2007-02-14T23:51:57.816+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python-Ogre'/><category scheme='http://www.blogger.com/atom/ns#' term='OGRE'/><title type='text'>OGRE初學筆記--以Python為例  索引篇</title><content type='html'>原本只是想把筆記整理一下而已，根本沒有想過會寫到那麼詳細...在將近12小時之內打了十篇文章，連我自己都嚇了一跳。&lt;br /&gt;&lt;br /&gt;其實我自己也是OGRE初學者，對Python的也是很不熟(我是Ruby的愛用者)。很可能會有錯誤，也請大家幫忙指教。這些筆記和原本的Wiki相比少了很多東西，建議大家還是詳閱Wiki比較好。希望大家有了這些中文筆記，能夠比較快上手一些。&lt;br /&gt;&lt;ul class="posts"&gt;&lt;li&gt;&lt;a href="http://birdy-party.blogspot.com/2007/02/whats-ogre.html"&gt;What's OGRE?&lt;/a&gt;：OGRE簡介&lt;/li&gt;&lt;li&gt;&lt;a href="http://birdy-party.blogspot.com/2007/02/ogre-mingw-codeblocks.html"&gt;OGRE + MinGW + Code::Blocks 安裝&lt;/a&gt;：C++的環境設定&lt;/li&gt;&lt;li&gt;&lt;a href="http://birdy-party.blogspot.com/2007/02/ogre-language-binding.html"&gt;OGRE language binding&lt;/a&gt;：用Ruby, Python寫OGRE&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://birdy-party.blogspot.com/2007/02/python-ogre.html"&gt;Python-Ogre安裝&lt;/a&gt;：超簡單的安裝說明 :)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://birdy-party.blogspot.com/2007/02/ogre-tutorial.html"&gt;寫在Python-OGRE Tutorial前面&lt;/a&gt;：寫Tutorial的環境設定步驟&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://birdy-party.blogspot.com/2007/02/python-ogre-tutorial-1.html"&gt;Python-Ogre Tutorial 1&lt;/a&gt;：SceneNode, Entity&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://birdy-party.blogspot.com/2007/02/python-ogre-tutorial-1-2.html"&gt;Python-Ogre Tutorial 1-2&lt;/a&gt;：續上篇，座標系統、旋轉&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://birdy-party.blogspot.com/2007/02/python-ogre-tutorial-2.html"&gt;Python-Ogre Tutorial 2&lt;/a&gt;：攝影機、光源、陰影&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://birdy-party.blogspot.com/2007/02/python-ogre-tutorial-3.html"&gt;Python-Ogre Tutorial 3&lt;/a&gt;：地型、天空、霧&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://birdy-party.blogspot.com/2007/02/python-ogre-tutorial-4.html"&gt;Python-Ogre Tutorial 4&amp;amp;5&lt;/a&gt;：有寫跟沒寫一樣，不用看了 XD&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;近期應該會再補上OIS輸入、使用py2exe發佈遊戲....今天實在太累了，到此為止囉。&lt;br /&gt;&lt;br /&gt;就這樣囉，之前研究一陣子的東西，今天有空一次把他寫出來，超累的....祝大家去死去死節快樂 XD&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/777077092642445515-3977492440416104645?l=birdy-party.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://birdy-party.blogspot.com/feeds/3977492440416104645/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=777077092642445515&amp;postID=3977492440416104645' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/3977492440416104645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/3977492440416104645'/><link rel='alternate' type='text/html' href='http://birdy-party.blogspot.com/2007/02/ogre-python.html' title='OGRE初學筆記--以Python為例  索引篇'/><author><name>Mr. BigCat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-777077092642445515.post-1456999480473528655</id><published>2007-02-14T22:22:00.000+08:00</published><updated>2007-02-14T23:41:30.596+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python-Ogre'/><category scheme='http://www.blogger.com/atom/ns#' term='OGRE'/><title type='text'>Python-Ogre Tutorial 4&amp;5</title><content type='html'>請先閱讀「&lt;a href="http://birdy-party.blogspot.com/2007/02/ogre-tutorial.html"&gt;寫在OGRE Tutorial前面&lt;/a&gt;」，本文假設您的目錄配置都和我一樣。&lt;br /&gt;本文參考&lt;a href="http://www.ogre3d.org/wiki/index.php/PyOgre_Beginner_Tutorial_4"&gt;PyOgre Beginner Tutorial 4&lt;/a&gt;, &lt;a href="http://www.ogre3d.org/wiki/index.php/PyOgre_Beginner_Tutorial_5"&gt;PyOgre Beginner Tutorial 5&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;為什麼要把這兩個tutorial合起來呢？這兩篇講的是OGRE Input，但是OGRE內建的Input是不被推薦使用的，所以我並不想詳談。&lt;br /&gt;&lt;br /&gt;簡單的說，教學四講的是unbuffered input，在迴圈中不斷的去polling有沒有輸入事件發生。教學五講的是buffered input，比較像event-driven的感覺，Listener Pattern有寫過Java的人應該都不陌生。好....Input講完了。&lt;br /&gt;&lt;br /&gt;輸入的部份，推薦另外用&lt;a href="http://sourceforge.net/projects/wgois"&gt;OIS&lt;/a&gt;或&lt;a href="http://www.libsdl.org/"&gt;SDL&lt;/a&gt;處理。Python-OGRE已經內建了OIS了。&lt;br /&gt;&lt;br /&gt;事實上我在Python-OGRE裡根本試不出內建Input怎麼用，SampleFramework裡也是直接使用OIS，所以找不到範例，在forum也找不到討論。但是看到這段程式碼：&lt;br /&gt;&lt;code&gt;&lt;br /&gt;    if (ogre.OgreVersion[0]+ ogre.OgreVersion[1]) == "12":   # ogre 1.2.3 is latest SDK&lt;br /&gt;        from Ogre.sf import *&lt;br /&gt;    else:  # assume it's ogre version 1.3, the CVS version that needs OIS&lt;br /&gt;        from Ogre.sf_OIS import * &lt;br /&gt;&lt;/code&gt;&lt;br /&gt;似乎指出現在(1.4版Ogre)的Python-OGRE已經不能用內建輸入了。&lt;br /&gt;&lt;br /&gt;另外請詳閱Wiki，了解什麼是FrameListener。&lt;br /&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;&lt;br /&gt;之後會再弄個OIS輸入處理篇吧，這一系列的文章就到此結束。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/777077092642445515-1456999480473528655?l=birdy-party.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://birdy-party.blogspot.com/feeds/1456999480473528655/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=777077092642445515&amp;postID=1456999480473528655' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/1456999480473528655'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/1456999480473528655'/><link rel='alternate' type='text/html' href='http://birdy-party.blogspot.com/2007/02/python-ogre-tutorial-4.html' title='Python-Ogre Tutorial 4&amp;5'/><author><name>Mr. BigCat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-777077092642445515.post-8849475626052362297</id><published>2007-02-14T21:52:00.000+08:00</published><updated>2008-11-13T18:19:31.428+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python-Ogre'/><category scheme='http://www.blogger.com/atom/ns#' term='OGRE'/><title type='text'>Python-Ogre Tutorial 3</title><content type='html'>請先閱讀「&lt;a href="http://birdy-party.blogspot.com/2007/02/ogre-tutorial.html"&gt;寫在OGRE Tutorial前面&lt;/a&gt;」，本文假設您的目錄配置都和我一樣。&lt;br /&gt;本文參考&lt;a href="http://www.ogre3d.org/wiki/index.php/PyOgre_Beginner_Tutorial_3"&gt;PyOgre Beginner Tutorial 3&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;先建立C:\Python25\Python-Ogre-0.8\demos\tutorial\tut3.py，貼上這些程式碼：&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;# coding=big5&lt;br /&gt;&lt;br /&gt;import Ogre as ogre&lt;br /&gt;import SampleFramework&lt;br /&gt;&lt;br /&gt;class TutorialApplication(SampleFramework.Application):&lt;br /&gt;def _createScene(self):&lt;br /&gt;&lt;br /&gt;   self.sceneManager.setWorldGeometry("terrain.cfg")&lt;br /&gt;   self.sceneManager.setSkyBox(True, "Examples/SpaceSkyBox")&lt;br /&gt;&lt;br /&gt;def _chooseSceneManager(self):&lt;br /&gt;   self.sceneManager = self.root.&lt;span style="color: rgb(255, 0, 0);"&gt;createSceneManager&lt;/span&gt;(ogre.ST_EXTERIOR_CLOSE)&lt;br /&gt;   # 選擇場景管理器&lt;br /&gt;&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;ta = TutorialApplication()&lt;br /&gt;ta.go()&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;wiki上使用getSceneManager，到Python-OGRE好像要用createSceneManger。這部份我不太確定，不過反正他work了：&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ZNCDOmrFXjs/RdMX_P7sM2I/AAAAAAAAADQ/KunUgoAJf8k/s1600-h/screenshot_0.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_ZNCDOmrFXjs/RdMX_P7sM2I/AAAAAAAAADQ/KunUgoAJf8k/s400/screenshot_0.png" alt="" id="BLOGGER_PHOTO_ID_5031391584079065954" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;有關SceneManager的細節我就不多談，有興趣的請自行查閱。我把焦點放在Terrian, Sky, Fog上。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;地型&lt;/span&gt;&lt;br /&gt;在一開始我們就copy了一些檔案到tutorial資料夾下，包括了terrian.cfg。其中指定了地型的材質、參數等等。最重要的是這一段：&lt;br /&gt;&lt;code&gt;# Heightmap source&lt;br /&gt;PageSource=Heightmap&lt;br /&gt;# Heightmap-source specific settings&lt;br /&gt;Heightmap.image=terrain.png&lt;/code&gt;&lt;br /&gt;terrian.png中，其實就是一個以顏色表示各點高度的heightmap。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;天空&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;天空的貼圖法有三種：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;SkyBoxes，將天空貼在一個cube上&lt;/li&gt;&lt;li&gt;SkyDomes，將天空貼在一個球體上 (但事實上他還是render在一個cube)&lt;/li&gt;&lt;li&gt;SkyPlanes，將天空貼在平面上&lt;/li&gt;&lt;/ol&gt;Wiki上的推薦使用法：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;如果你會看到y軸為負的方向(例如從天空之城向下看)，使用SkyBoxes&lt;/li&gt;&lt;li&gt;SkyDomes在接近y=0的地方會沒貼到圖，所以如果你的場景是被山或建築物圍繞著，推薦使用。&lt;/li&gt;&lt;li&gt;SkyPlane的優點是GPU cost極小，另外，其他兩種貼圖方式和fog並用時可能產生問題 (請詳閱wiki種fog一節)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;霧&lt;/span&gt;&lt;br /&gt;再修改一下_createScene...&lt;br /&gt;&lt;code&gt;&lt;br /&gt;    def _createScene(self):&lt;br /&gt;        self.sceneManager.setWorldGeometry("terrain.cfg")&lt;br /&gt;         &lt;br /&gt;        fadeColour = (0.9, 0.9, 0.9)&lt;br /&gt;        self.sceneManager.setFog(ogre.FOG_LINEAR, fadeColour, 0, 50, 515)&lt;br /&gt;        self.renderWindow.getViewport(0).backgroundColour = fadeColour&lt;br /&gt;         &lt;br /&gt;        self.sceneManager.setSkyDome(True, "Examples/CloudySky", 5, 500)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ZNCDOmrFXjs/RdMaiP7sM3I/AAAAAAAAADc/TBu0Ki21R98/s1600-h/screenshot_0.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_ZNCDOmrFXjs/RdMaiP7sM3I/AAAAAAAAADc/TBu0Ki21R98/s400/screenshot_0.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5031394384397742962" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;被濃霧籠罩的山谷...&lt;br /&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;&lt;br /&gt;有關fog及plane的搭配請務必詳閱wiki，我在這就不多談了...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/777077092642445515-8849475626052362297?l=birdy-party.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://birdy-party.blogspot.com/feeds/8849475626052362297/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=777077092642445515&amp;postID=8849475626052362297' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/8849475626052362297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/8849475626052362297'/><link rel='alternate' type='text/html' href='http://birdy-party.blogspot.com/2007/02/python-ogre-tutorial-3.html' title='Python-Ogre Tutorial 3'/><author><name>Mr. BigCat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_ZNCDOmrFXjs/RdMX_P7sM2I/AAAAAAAAADQ/KunUgoAJf8k/s72-c/screenshot_0.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-777077092642445515.post-5476771495946262625</id><published>2007-02-14T20:43:00.000+08:00</published><updated>2008-11-13T18:19:31.557+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python-Ogre'/><category scheme='http://www.blogger.com/atom/ns#' term='OGRE'/><title type='text'>Python-Ogre Tutorial 2</title><content type='html'>請先閱讀「&lt;a href="http://birdy-party.blogspot.com/2007/02/ogre-tutorial.html"&gt;寫在OGRE Tutorial前面&lt;/a&gt;」，本文假設您的目錄配置都和我一樣。&lt;br /&gt;本文參考&lt;a href="http://www.ogre3d.org/wiki/index.php/PyOgre_Beginner_Tutorial_2"&gt;PyOgre Beginner Tutorial 2&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;先建立C:\Python25\Python-Ogre-0.8\demos\tutorial\tut2.py，貼上這些程式碼：&lt;br /&gt;&lt;code&gt;&lt;br /&gt;# coding=big5&lt;br /&gt;&lt;br /&gt;import Ogre as ogre&lt;br /&gt;import SampleFramework&lt;br /&gt;&lt;br /&gt;class TutorialApplication(SampleFramework.Application):&lt;br /&gt;&lt;br /&gt;   def _createScene(self):&lt;br /&gt;       pass                                   &lt;br /&gt;  &lt;br /&gt;   def _createCamera(self):&lt;br /&gt;       self.camera = self.sceneManager.createCamera("PlayerCam")&lt;br /&gt;       # 建立PlayerCam (玩家攝影機物件)&lt;br /&gt;       self.camera.setPosition = (0, 10, 500)&lt;br /&gt;       # 設定位置&lt;br /&gt;       self.camera.lookAt((0, 0, 0))&lt;br /&gt;       # 設定方向&lt;br /&gt;       self.camera.nearClipDistance = 5&lt;br /&gt;       # 太近的東西看不到 (距離小於5)&lt;br /&gt;  &lt;br /&gt;   def _createViewports(self):&lt;br /&gt;       vp = self.renderWindow.addViewport(self.camera)&lt;br /&gt;       vp.backgroundColour = (0, 0, 0)&lt;br /&gt;       self.camera.aspectRatio = vp.actualWidth / vp.actualHeight&lt;br /&gt;&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;   ta = TutorialApplication()&lt;br /&gt;   ta.go()&lt;/code&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;這次我把註解直接打在程式碼裡面了，如果你的程式碼有中文的話，記得加上第一行coding的宣告，否則會沒辦法執行&lt;br /&gt;&lt;/li&gt;&lt;li&gt;注意紅字的地方，position property沒辦法用，要用setPosition&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;經過了這段修改，我們得到一個....全黑的畫面？是的。&lt;br /&gt;&lt;br /&gt;由於TutorialApplication是繼承SampleFramework.Application類別，就算我們不設定Camera及Viewport，上層的物件也會自動幫我們建立。現在我們只是Override上層的method，手動建立一次而已。&lt;br /&gt;&lt;br /&gt;Camera簡單講就是玩家視角，Viewport這裡不用詳細解釋，有興趣深入了解請詳讀wiki吧。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;光線與陰影 (Light&amp;Shadow)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;重頭戲來了....廢話不多說，我們來試試吧....修改_createScene函式：&lt;br /&gt;&lt;code&gt;&lt;br /&gt;def _createScene(self):&lt;br /&gt;   sceneManager = self.sceneManager&lt;br /&gt;   sceneManager.ambientLight = (0, 0, 0)&lt;br /&gt;   # 不要ambient光源&lt;br /&gt;   sceneManager.shadowTechnique = ogre.SHADOWTYPE_STENCIL_ADDITIVE&lt;br /&gt;   # 設定陰影種類&lt;br /&gt; &lt;br /&gt;   ent = sceneManager.createEntity("Ninja", "ninja.mesh")&lt;br /&gt;   ent.castShadows = True     # this is not actually needed&lt;br /&gt;   # 設定這個entity要有陰影效果&lt;br /&gt;   sceneManager.rootSceneNode.createChildSceneNode().attachObject(ent)&lt;br /&gt;   # 在scene中放置一個忍者&lt;br /&gt; &lt;br /&gt;   plane = ogre.Plane((0, 1, 0), 0)&lt;br /&gt;   # 建立地板平面&lt;br /&gt;   mm = ogre.MeshManager.getSingleton()&lt;br /&gt;   mm.createPlane('ground', ogre.&lt;span style="color: rgb(255, 0, 0);"&gt;ResourceGroupManager&lt;/span&gt;.DEFAULT_RESOURCE_GROUP_NAME,&lt;br /&gt;              plane, 1500, 1500, 20, 20, True, 1, 5, 5, (0, 0, 1))&lt;br /&gt;   # 建立地板平面的Mesh&lt;br /&gt; &lt;br /&gt;   ent = sceneManager.createEntity("GroundEntity", "ground")&lt;br /&gt;   sceneManager.rootSceneNode.createChildSceneNode().attachObject(ent)&lt;br /&gt;   ent.setMaterialName("Examples/Rockwall")&lt;br /&gt;   # 將地板明面貼上岩石材質&lt;br /&gt;   ent.castShadows = False&lt;br /&gt; &lt;br /&gt;   light = self.sceneManager.createLight("Light1")&lt;br /&gt;   light.type = ogre.Light.LT_POINT&lt;br /&gt;   # 建立一個點光源&lt;br /&gt;   light.&lt;span style="color: rgb(255, 0, 0);"&gt;setPosition&lt;/span&gt;(0, 150, 250)&lt;br /&gt;   # 設定光源位置&lt;br /&gt;&lt;br /&gt;   light.&lt;span style="color: rgb(255, 0, 0);"&gt;setDiffuseColour&lt;/span&gt;(1.0, 0.0, 0.0)&lt;br /&gt;   light.&lt;span style="color: rgb(255, 0, 0);"&gt;setSpecularColour&lt;/span&gt;(1.0, 0.0, 0.0)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;注意紅色的部份，是與PyOgre API不相容的地方。先看看結果吧：&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ZNCDOmrFXjs/RdMPE_7sM0I/AAAAAAAAAC4/9fdOdY08yCA/s1600-h/screenshot_0.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_ZNCDOmrFXjs/RdMPE_7sM0I/AAAAAAAAAC4/9fdOdY08yCA/s400/screenshot_0.png" alt="" id="BLOGGER_PHOTO_ID_5031381787258663746" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;漆黑的忍者拖著長長的倒影 (驚)&lt;br /&gt;&lt;br /&gt;注意我們把ambient光源設定為0了，在這裡我要稍微解釋一下。&lt;br /&gt;一般3D圖學中的打光效果分為：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ambient (我不太會翻譯...這個字是"周圍的"的意思)&lt;br /&gt;舉個例子，在一個漆黑的房間中，有一個門縫、窗縫透了一點光進來。這時整個房間都會近乎均勻的被打到一點點的光線。這個其實是經過很多反射、散射所造成的效果，但是真的去計算這些物理現像實在太難了，所以我們就假設所有物體都會被定量的光線照到。(就算不是realtime rendering，在photorealistic rendering也是有用ambient的)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Diffuse (散射)&lt;/li&gt;&lt;li&gt;Specular (鏡面反射)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;現在我們將ambient設為零，而光源在忍者的背面，所以從正面看當然就是一片漆黑了。注意程式的最後兩行將光源設定圍紅色。&lt;br /&gt;&lt;br /&gt;除了ambient外，Diffuse和Specular都是假定光線是從某種方向照過來的。OGRE裡光源有三種：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Point：點光源&lt;/li&gt;&lt;li&gt;Spotlight：聚光燈、手電筒，需要設定廣角範圍&lt;/li&gt;&lt;li&gt;Directional：指向性光源，假設光源從無線遠處射來(如太陽)。需要設定範圍但不用設定位置。&lt;/li&gt;&lt;/ol&gt;先來個有三種光源的範例吧，在剛剛的_createScene後再加上：&lt;br /&gt;&lt;code&gt;&lt;br /&gt;     light = sceneManager.createLight("Light3")&lt;br /&gt;     light.type = ogre.Light.&lt;span style="color: rgb(51, 51, 255);"&gt;LT_DIRECTIONAL&lt;/span&gt;&lt;br /&gt;     # 從無限遠處射來的光線&lt;br /&gt;     light.&lt;span style="color: rgb(255, 0, 0);"&gt;setDiffuseColour&lt;/span&gt;(.25, .25, 0)&lt;br /&gt;     light.&lt;span style="color: rgb(255, 0, 0);"&gt;setSpecularColour&lt;/span&gt;(.25, .25, 0)   &lt;br /&gt;     # 設定顏色&lt;br /&gt;     light.&lt;span style="color: rgb(255, 0, 0);"&gt;setDirection&lt;/span&gt;(0, -1, 1)&lt;br /&gt;     # 要指定方向，不用指定位置&lt;br /&gt;  &lt;br /&gt;     light = sceneManager.createLight("Light2")&lt;br /&gt;     light.type = ogre.Light.&lt;span style="color: rgb(51, 51, 255);"&gt;LT_SPOTLIGHT&lt;/span&gt;&lt;br /&gt;     # 聚光燈形式的光源&lt;br /&gt;     light.&lt;span style="color: rgb(255, 0, 0);"&gt;setDiffuseColour&lt;/span&gt;(0, 0, 1.0)&lt;br /&gt;     light.&lt;span style="color: rgb(255, 0, 0);"&gt;setSpecularColour&lt;/span&gt;(0, 0, 1.0)&lt;br /&gt;     # 顏色&lt;br /&gt;     light.&lt;span style="color: rgb(255, 0, 0);"&gt;setDirection&lt;/span&gt;(-1, -1, 0)&lt;br /&gt;     light.setPosition(300, 300, 0)&lt;br /&gt;     # 位置方向&lt;br /&gt;     light.setSpotlightRange(ogre.Degree(35), ogre.Degree(50))&lt;br /&gt;     # 廣角&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ZNCDOmrFXjs/RdMTYf7sM1I/AAAAAAAAADE/8uik3CGkNgY/s1600-h/screenshot_0.png"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_ZNCDOmrFXjs/RdMTYf7sM1I/AAAAAAAAADE/8uik3CGkNgY/s400/screenshot_0.png" alt="" id="BLOGGER_PHOTO_ID_5031386520312623954" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;看到三個方向的影子了，雖然這張圖看不出什麼差，但這是三種不同光源(藍字)造成的。照慣例，紅字是與wiki不同的地方。&lt;br /&gt;&lt;br /&gt;另外，陰影模式也有三種：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;SHADOWTYPE_TEXTURE_MODULATIVE  最差，最少運算資源&lt;/li&gt;&lt;li&gt;SHADOWTYPE_STENCIL_MODULATIVE&lt;/li&gt;&lt;li&gt;SHADOWTYPE_STENCIL_ADDITIVE    最強，最多運算資源&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;有興趣深入了解的請看wiki&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/777077092642445515-5476771495946262625?l=birdy-party.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://birdy-party.blogspot.com/feeds/5476771495946262625/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=777077092642445515&amp;postID=5476771495946262625' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/5476771495946262625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/5476771495946262625'/><link rel='alternate' type='text/html' href='http://birdy-party.blogspot.com/2007/02/python-ogre-tutorial-2.html' title='Python-Ogre Tutorial 2'/><author><name>Mr. BigCat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_ZNCDOmrFXjs/RdMPE_7sM0I/AAAAAAAAAC4/9fdOdY08yCA/s72-c/screenshot_0.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-777077092642445515.post-3146593007711979479</id><published>2007-02-14T19:40:00.000+08:00</published><updated>2008-11-13T18:19:32.224+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python-Ogre'/><category scheme='http://www.blogger.com/atom/ns#' term='OGRE'/><title type='text'>Python-Ogre Tutorial 1-2</title><content type='html'>續&lt;a href="http://birdy-party.blogspot.com/2007/02/python-ogre-tutorial-1.html"&gt;上一篇&lt;/a&gt;..&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;座標系&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;OGRE的座標系系統是：x左右, y上下, z前後&lt;br /&gt;有些其他系統會將y和z顛倒過來&lt;br /&gt;&lt;br /&gt;再修改一下_createScene：&lt;br /&gt;&lt;code&gt;&lt;br /&gt;    def _createScene(self):&lt;br /&gt;        sceneManager = self.sceneManager&lt;br /&gt;        sceneManager.ambientLight = (1, 1, 1)&lt;br /&gt;&lt;br /&gt;        ent1 = sceneManager.createEntity("Robot", "robot.mesh")&lt;br /&gt;        node1 = sceneManager.rootSceneNode.createChildSceneNode("RobotNode")&lt;br /&gt;        node1.attachObject(ent1)&lt;br /&gt;&lt;br /&gt;        ent2 = sceneManager.createEntity("Robot2", "robot.mesh")&lt;br /&gt;        node2 = sceneManager.rootSceneNode.createChildSceneNode("RobotNode2", &lt;span style="color: rgb(255, 0, 0);"&gt;(50, 0, 0)&lt;/span&gt;)&lt;br /&gt;        node2.attachObject(ent2)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;放了兩台機器人:)&lt;br /&gt;注意倒數第二行紅字的部份，第二台機器人有(50, 0, 0)的位移量。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ZNCDOmrFXjs/RdLpIP7sMwI/AAAAAAAAACE/xC2_A5kCb1c/s1600-h/screenshot_0.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_ZNCDOmrFXjs/RdLpIP7sMwI/AAAAAAAAACE/xC2_A5kCb1c/s400/screenshot_0.png" alt="" id="BLOGGER_PHOTO_ID_5031340061651383042" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt; def _createScene(self):&lt;br /&gt;    sceneManager = self.sceneManager&lt;br /&gt;    sceneManager.ambientLight = (1, 1, 1)&lt;br /&gt;&lt;br /&gt;    ent1 = sceneManager.createEntity("Robot", "robot.mesh")&lt;br /&gt;    node1 = sceneManager.rootSceneNode.createChildSceneNode("RobotNode")&lt;br /&gt;    node1.attachObject(ent1)&lt;br /&gt;&lt;br /&gt;    ent2 = sceneManager.createEntity("Robot2", "robot.mesh")&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;       node2 = node1.createChildSceneNode("RobotNode2", (0, 100, 0))&lt;/span&gt;&lt;br /&gt;    node2.attachObject(ent2)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;再注意倒數第二行，我們這次不把第二台機器人接上SceneManager的root SceneNode，而接上第一台機器人的SceneNode，並且給了(0, 100, 0)的位移量 (正上方一百單位)。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ZNCDOmrFXjs/RdLqXP7sMxI/AAAAAAAAACU/tieWeTzdLPQ/s1600-h/screenshot_0.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_ZNCDOmrFXjs/RdLqXP7sMxI/AAAAAAAAACU/tieWeTzdLPQ/s400/screenshot_0.png" alt="" id="BLOGGER_PHOTO_ID_5031341418861048594" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;注意：ent2的位置現在完全跟隨著ent1，要是第一台機器人移動，第二台也會跟著動。Wiki中提到可以拿來做grouping (像星海的航空母艦子機 XD)&lt;br /&gt;&lt;br /&gt;來看看旋轉類的效果吧：&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;  def _createScene(self):&lt;br /&gt;     sceneManager = self.sceneManager&lt;br /&gt;     sceneManager.ambientLight = (1, 1, 1)&lt;br /&gt;&lt;br /&gt;     ent1 = sceneManager.createEntity("Robot", "robot.mesh")&lt;br /&gt;     node1 = sceneManager.rootSceneNode.createChildSceneNode("RobotNode")&lt;br /&gt;     node1.attachObject(ent1)&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;       node1.yaw(ogre.Degree(-90))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;     ent2 = sceneManager.createEntity("Robot2", "robot.mesh")&lt;br /&gt;     node2 = sceneManager.rootSceneNode.createChildSceneNode("RobotNode2", ogre.Vector3(50, 0, 0))&lt;br /&gt;     node2.attachObject(ent2)&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;       node2.pitch(ogre.Degree(-90))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;     ent3 = sceneManager.createEntity("Robot3", "robot.mesh")&lt;br /&gt;     node3 = sceneManager.rootSceneNode.createChildSceneNode("RobotNode3", ogre.Vector3(100, 0, 0))&lt;br /&gt;     node3.attachObject(ent3)&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;       node3.roll(ogre.Degree(-90))&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ZNCDOmrFXjs/RdLtyv7sMyI/AAAAAAAAACg/3rUCm1dU9dM/s1600-h/screenshot_0.png"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_ZNCDOmrFXjs/RdLtyv7sMyI/AAAAAAAAACg/3rUCm1dU9dM/s400/screenshot_0.png" alt="" id="BLOGGER_PHOTO_ID_5031345189842334498" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;注意紅色那三行就對了，不同的轉向函式。&lt;br /&gt;&lt;br /&gt;最後，關於縮放(scaling)功能...&lt;br /&gt;&lt;br /&gt;Wiki上的語法都不能用：&lt;br /&gt;&lt;code&gt;node.setScale(0.5, 0.2, 1)&lt;br /&gt;node.scaleBy(2, 10, 1)&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;要用這個：&lt;br /&gt;&lt;code&gt;node.setScale(0.5, 0.2, 1)&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ZNCDOmrFXjs/RdLwI_7sMzI/AAAAAAAAACs/XVymBEa9TeY/s1600-h/screenshot_0.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_ZNCDOmrFXjs/RdLwI_7sMzI/AAAAAAAAACs/XVymBEa9TeY/s400/screenshot_0.png" alt="" id="BLOGGER_PHOTO_ID_5031347771117679410" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;這裡有一些PyOgre及Python-Ogre的差異，可是沒寫到scale，害我自己找半天 :(&lt;br /&gt;&lt;a href="http://python-ogre.python-hosting.com/wiki/FAQindex"&gt;http://python-ogre.python-hosting.com/wiki/FAQindex&lt;/a&gt;：見Converting from PyOgre&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;br /&gt;Tutorial 1的部份寫了最多，接下來的幾個Tutorial會寫必較少。不是我偷懶喔，而是點到為止就好了。尤其是OGRE Input處理的部份，最後做遊戲時是不太會用到的。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/777077092642445515-3146593007711979479?l=birdy-party.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://birdy-party.blogspot.com/feeds/3146593007711979479/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=777077092642445515&amp;postID=3146593007711979479' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/3146593007711979479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/3146593007711979479'/><link rel='alternate' type='text/html' href='http://birdy-party.blogspot.com/2007/02/python-ogre-tutorial-1-2.html' title='Python-Ogre Tutorial 1-2'/><author><name>Mr. BigCat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_ZNCDOmrFXjs/RdLpIP7sMwI/AAAAAAAAACE/xC2_A5kCb1c/s72-c/screenshot_0.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-777077092642445515.post-3976560113718848467</id><published>2007-02-14T17:28:00.000+08:00</published><updated>2008-11-13T18:19:32.592+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python-Ogre'/><category scheme='http://www.blogger.com/atom/ns#' term='OGRE'/><title type='text'>Python-Ogre Tutorial 1</title><content type='html'>請先閱讀「&lt;a href="http://birdy-party.blogspot.com/2007/02/ogre-tutorial.html"&gt;寫在OGRE Tutorial前面&lt;/a&gt;」，本文假設您的目錄配置都和我一樣。&lt;br /&gt;本文參考&lt;a href="http://www.ogre3d.org/wiki/index.php/PyOgre_Beginner_Tutorial_1"&gt;PyOgre Beginner Tutorial 1&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;讓我們跟著上面那個tutorial的步驟一步一步做。首先我們看到這段程式，使用你熟悉的編輯器將他存到C:\Python25\Python-Ogre-0.8\demos\tutorial\tut1.py中&lt;br /&gt;&lt;code&gt;&lt;br /&gt;from pyogre import ogre&lt;br /&gt;import SampleFramework&lt;br /&gt;&lt;br /&gt;class TutorialApplication(SampleFramework.Application):&lt;br /&gt;   def _createScene(self):&lt;br /&gt;       pass&lt;br /&gt;&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;   ta = TutorialApplication()&lt;br /&gt;   ta.go()&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;執行看看&lt;br /&gt;&lt;code&gt;cd \Python25\Python-Ogre-0.8\demos\tutorial&lt;br /&gt;python tut1.py&lt;/code&gt;&lt;br /&gt;結果當然有error囉，因為他引用了PyOgre的package名稱而非Python-Ogre&lt;br /&gt;&lt;br /&gt;將程式的前兩行改成&lt;br /&gt;&lt;br /&gt;&lt;code&gt;import Ogre as ogre&lt;br /&gt;import SampleFramework&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ZNCDOmrFXjs/RdLa2f7sMtI/AAAAAAAAABc/ToVKheh1QRg/s1600-h/screenshot_0.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_ZNCDOmrFXjs/RdLa2f7sMtI/AAAAAAAAABc/ToVKheh1QRg/s400/screenshot_0.png" alt="" id="BLOGGER_PHOTO_ID_5031324363545916114" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It works!!右下角有OGRE的mark，左下角有FPS的效能數據。整個畫面黑黑的一片，因為我們還沒有放任何東西在場景中。其實PyOgre和Python-OGRE最大的差別應該就是在這個import package name吧，其他程式碼幾乎都可以直接work。&lt;br /&gt;&lt;br /&gt;接下來我就簡化地follow tutorial，還是推薦大家詳閱原版的tutorial喔!!&lt;br /&gt;&lt;br /&gt;我們稍微改寫一下_createScene函式：&lt;br /&gt;&lt;code&gt;&lt;br /&gt;   def _createScene(self):&lt;br /&gt;      sceneManager = self.sceneManager&lt;br /&gt;      sceneManager.ambientLight = ogre.ColourValue(1, 1, 1)&lt;br /&gt;     &lt;br /&gt;      ent1 = sceneManager.createEntity("Robot", "robot.mesh")&lt;br /&gt;      node1 = sceneManager.rootSceneNode.createChildSceneNode("RobotNode")&lt;br /&gt;      node1.attachObject(ent1)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;然後再執行看看...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ZNCDOmrFXjs/RdLdSv7sMuI/AAAAAAAAABw/hI8v1NIWwFc/s1600-h/screenshot_0.png"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_ZNCDOmrFXjs/RdLdSv7sMuI/AAAAAAAAABw/hI8v1NIWwFc/s400/screenshot_0.png" alt="" id="BLOGGER_PHOTO_ID_5031327047900476130" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;可以按上下左右、移動滑鼠試試喔！&lt;br /&gt;&lt;br /&gt;第一行取得了sceneManager物件，在OGRE的架構中，所有你看的見的東西都是被這個物件管理的。&lt;br /&gt;第二行設定了光源，要是拿掉了這行，畫面就會變成一片漆黑了。ambientLight是一種光源的類型，等到光源那節我再詳細介紹。&lt;br /&gt;&lt;br /&gt;第三到五行在畫面上放置了一個機器人，這部份比較複雜一些，我們需要了解一些物件：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;MoveableObject：任何可以移動的物體。其實我們在這裡都不會直接取用他&lt;/li&gt;&lt;li&gt;Entity：MoveableObject的子類別，你可以將任何可以用3D Mesh表示的物件看成一個Entity。(例如：人、魚、鳥、車)&lt;br /&gt;然而燈光、攝影機...等等沒有3D模型的東西，他們是MoveableObject但不是Entity。&lt;/li&gt;&lt;li&gt;SceneNode：這個概念比較抽象...我真的不太會解釋，請務必看wiki原文。&lt;br /&gt;總而言之，每一個SceneNode都可以有他的parent及children，形成一個tree的結構。SceneNode記錄著相對於其parent的位置及方向。&lt;br /&gt;SceneManager中有個root SceneNode，一般來說他應該是一切其他SceneNode的根源。我是把他想成類似世界原點座標..&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;簡單來說，要在場景上放上一個物件至少要做三件事：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;建立Entity&lt;br /&gt;程式碼第三行，載入robot的mesh並建立了這個entity&lt;/li&gt;&lt;li&gt;建立SceneNode&lt;br /&gt;程式碼第四行，注意他是從SceneManager建立這個SceneNode的。SceneNode必需以某種方式與SceneManager的root連結，我們才可以看的到他。&lt;/li&gt;&lt;li&gt;將Entity附在SceneNode上(程式碼第五行)&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;文章太長了，拆成兩篇...請看&lt;a href="http://birdy-party.blogspot.com/2007/02/python-ogre-tutorial-1-2.html"&gt;Python-Ogre Tutorial 1-2&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/777077092642445515-3976560113718848467?l=birdy-party.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://birdy-party.blogspot.com/feeds/3976560113718848467/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=777077092642445515&amp;postID=3976560113718848467' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/3976560113718848467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/3976560113718848467'/><link rel='alternate' type='text/html' href='http://birdy-party.blogspot.com/2007/02/python-ogre-tutorial-1.html' title='Python-Ogre Tutorial 1'/><author><name>Mr. BigCat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_ZNCDOmrFXjs/RdLa2f7sMtI/AAAAAAAAABc/ToVKheh1QRg/s72-c/screenshot_0.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-777077092642445515.post-4688371106920290318</id><published>2007-02-14T17:10:00.000+08:00</published><updated>2007-02-14T19:13:25.006+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python-Ogre'/><category scheme='http://www.blogger.com/atom/ns#' term='OGRE'/><title type='text'>寫在Python-OGRE Tutorial前面</title><content type='html'>接下來讓我們來看一些Tutorial吧。&lt;br /&gt;&lt;br /&gt;從介紹OGRE的第一篇我就提到，學OGRE從Tutorial開始是最快的。在OGRE官方Wiki上有&lt;a href="http://www.ogre3d.org/wiki/index.php/Ogre_Tutorials"&gt;一系列的Tutorial教學&lt;/a&gt;。&lt;br /&gt;&lt;br /&gt;另外在&lt;a href="http://www.ogre3d.org/wiki/index.php/PyOgre"&gt;PyOgre頁面&lt;/a&gt;中也有五個Tutorial，這五個Tutorial其實和上面的Basic Tutorial 1~5內容是一樣的，只是程式語言從C++變成了Python。&lt;br /&gt;&lt;br /&gt;但是，目前並沒有為最新的Python-Ogre寫的Tutorial。事實上PyOgre及Python-Ogre的API根本就差不多，只有一些細微的差異。但如果你用PyOgre的程式直接貼到Python-Ogre，還是會出一點錯的。&lt;br /&gt;&lt;br /&gt;接下來我會把這五個Tutorial的筆記整理出來，並且在Python-OGRE上執行。希望可以讓大家很快的上手Python-OGRE。&lt;br /&gt;&lt;br /&gt;如果你的遊戲運算量、動作性沒有那麼高，那用Python開發應該不錯。但這五個Tutorial只是教你OGRE的基本操作，無論如何，C++版本的那整套Tutorial還是推薦大家一定要去去看一下的。&lt;br /&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;&lt;br /&gt;開始囉，讓我們先準備一下環境。我很偷懶的直接在c:\Python25\Python-Ogre-0.8\demos建一個tutorial的目錄，並且將所需的檔案copy過去，在命令提示字元下執行這些指令就可完成：&lt;br /&gt;&lt;br /&gt;&lt;code&gt;cd \Python25\Python-Ogre-0.8\demos&lt;br /&gt;md tutorial&lt;br /&gt;cd tutorial&lt;br /&gt;copy ..\ogre\SampleFramework.py .&lt;br /&gt;copy ..\ogre\*.cfg .&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;SampleFramework.py是一個寫好的遊戲框架，定義了一些行為(例如說按上下左右攝影機就會移動，移動滑鼠就會轉向)。真正的implementation應該是在C:\Python25\Lib\site-packages\Ogre\sf.py，在前五個教學中我們先不用管他是什麼。&lt;br /&gt;&lt;br /&gt;*.cfg是一些設定檔案，如果你完全照我的目錄配制的話，那就先不用管他是什麼東西了。&lt;br /&gt;&lt;br /&gt;好，讓我們進入第一個Tutorial吧...&lt;br /&gt;&lt;br /&gt;待續&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/777077092642445515-4688371106920290318?l=birdy-party.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://birdy-party.blogspot.com/feeds/4688371106920290318/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=777077092642445515&amp;postID=4688371106920290318' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/4688371106920290318'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/4688371106920290318'/><link rel='alternate' type='text/html' href='http://birdy-party.blogspot.com/2007/02/ogre-tutorial.html' title='寫在Python-OGRE Tutorial前面'/><author><name>Mr. BigCat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-777077092642445515.post-8660100943695447615</id><published>2007-02-14T16:29:00.000+08:00</published><updated>2008-11-13T18:19:32.818+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python-Ogre'/><category scheme='http://www.blogger.com/atom/ns#' term='OGRE'/><title type='text'>Python-Ogre安裝</title><content type='html'>&lt;a href="http://python-ogre.python-hosting.com/wiki/DownloadsPage"&gt;Python-Ogre&lt;/a&gt;的安裝反而比C++環境的安裝簡單的多。&lt;br /&gt;&lt;ol&gt;&lt;li&gt; 安裝&lt;a class="reference" href="http://www.python.org/ftp/python/2.5/python-2.5.msi"&gt;Python 2.5 Windows installer&lt;/a&gt; (假設裝到C:\Python25)&lt;/li&gt;&lt;li&gt;抓下&lt;a class="ext-link" title="http://www.python-ogre.org/PythonFiles/Python-Ogre-V0.8-PY2.5.7z" href="http://www.python-ogre.org/PythonFiles/Python-Ogre-V0.8-PY2.5.7z"&gt;Python-Ogre 0.80 Windows Release for Python 2.5&lt;/a&gt;，解壓至C:\Python25&lt;/li&gt;&lt;li&gt;進到命令提示字元，輸入&lt;br /&gt;&lt;code&gt;cd \python25\Python-Ogre-0.8&lt;br /&gt;..\python setup.py install&lt;/code&gt;&lt;/li&gt;&lt;li&gt;抓下&lt;a class="ext-link" title="http://www.python-ogre.org/PythonFiles/Media-V0.6.zip" href="http://www.python-ogre.org/PythonFiles/Media-V0.6.zip"&gt;Media for Python-Ogre&lt;/a&gt;，解壓後將C:\Python25\Python-Ogre-0.8\demos\media覆蓋&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;這樣就安裝完成囉。令外OGRE Wiki推薦安裝&lt;a href="http://psyco.sourceforge.net/"&gt;Psyco&lt;/a&gt;，可以加速python程式的執行。&lt;br /&gt;&lt;br /&gt;來執行看看吧&lt;br /&gt;&lt;br /&gt;&lt;code&gt;cd \Python25\Python-Ogre-0.8\demos\ogre&lt;br /&gt;\Python25\python.exe Demo_Lighting.py&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ZNCDOmrFXjs/RdLMAf7sMqI/AAAAAAAAABA/Qxb6Dmcz6eE/s1600-h/screenshot_0.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_ZNCDOmrFXjs/RdLMAf7sMqI/AAAAAAAAABA/Qxb6Dmcz6eE/s400/screenshot_0.png" alt="" id="BLOGGER_PHOTO_ID_5031308042670191266" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;成功!!&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;br /&gt;可以在我的電腦-&gt;內容-&gt;進階-&gt;環境變數-&gt;系統變數-&gt;path&lt;br /&gt;在變數值後面加上;C:\Python25&lt;br /&gt;記得重新開啟command console&lt;br /&gt;&lt;br /&gt;就不用執行\Python25\python.exe 直接打python就好了，筆者的電腦因為有兩個版本的python，所以不做此設定。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/777077092642445515-8660100943695447615?l=birdy-party.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://birdy-party.blogspot.com/feeds/8660100943695447615/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=777077092642445515&amp;postID=8660100943695447615' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/8660100943695447615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/8660100943695447615'/><link rel='alternate' type='text/html' href='http://birdy-party.blogspot.com/2007/02/python-ogre.html' title='Python-Ogre安裝'/><author><name>Mr. BigCat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_ZNCDOmrFXjs/RdLMAf7sMqI/AAAAAAAAABA/Qxb6Dmcz6eE/s72-c/screenshot_0.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-777077092642445515.post-2497187244177824357</id><published>2007-02-14T15:39:00.000+08:00</published><updated>2007-02-14T16:19:37.717+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OGRE'/><title type='text'>OGRE language binding</title><content type='html'>縱觀近年來程式語言的發展，我想大家應該都會同意動態、腳本語言可以縮短程式開發的時間。例如：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;網頁開發：&lt;a href="http://www.pragmaticprogrammer.com/title/rails/"&gt;Agile web development with rails&lt;/a&gt;&lt;/li&gt;&lt;li&gt;遊戲開發：&lt;a href="http://www.amazon.com/Game-Programming-Python-Ruby-Development/dp/1592000770"&gt;Game Programming with Python, Lua, and Ruby&lt;/a&gt;&lt;/li&gt;&lt;li&gt;知名MMORPG魔獸世界內建Lua Script&lt;/li&gt;&lt;/ul&gt;等等...&lt;br /&gt;&lt;br /&gt;OGRE本身是使用C++寫的，但其龐大的社群使得我們可以找到一些其他語言binding的資源：&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;a href="http://www.ogre3d.org/wiki/index.php/PyOgre"&gt;PyOgre&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;PyOgre的歷史應該滿悠久的，使用SWIG將OGRE與Python語言做結合，讓我們可以在Python中直接取用OGRE的物件。&lt;br /&gt;&lt;br /&gt;PyOgre最新的版本應該是1.2版，但是官網的binary release竟然停留在2005年的1.0.6版，不知道在想什麼 =.= Wiki上面有熱心的網友自己編譯的win32 binary，但連結已失效了。目前取得最新版本的唯一方式就是自己去SVN checkout然後編譯。&lt;br /&gt;&lt;br /&gt;PyOgre的優點應該是比較stable(應為已經開發很久了)、官網tutorial(在&lt;a href="http://www.ogre3d.org/wiki/index.php/PyOgre"&gt;PyOgre&lt;/a&gt;的下半部)一定可以work。除此之外，官網論壇上的人似乎都比較推薦Python-Ogre。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;a href="http://python-ogre.python-hosting.com/wiki/DownloadsPage"&gt;Python-Ogre&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Python-Ogre是另外一套Ogre的Python binding，相較於PyOgre使用SWIG，Python-Ogre使用&lt;a href="http://www.language-binding.net/pyplusplus/pyplusplus.html"&gt;Py++&lt;/a&gt;來自動化的做Warpper的動作。當然使用者可以不用理會這些，重點是Python-Ogre雖然發展不到半年的時間，但開發的動作相當迅速，應該可望完全取代掉PyOgre。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;a href="http://www.shatteredruby.com/"&gt;Shattered Ruby&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Shattered Ruby是一套使用OGRE為底層的Game Framework，他不僅是做Warpper的動作而已，還開發了一些工具來加速遊戲設計的流程。&lt;br /&gt;&lt;br /&gt;我想這個開發者一定對於Ruby on Rails的網頁框架十分熟悉，而把Rails這個網頁開發的很多概念拿到遊戲開發上，如：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;DRY: Don't repeat yourself&lt;/li&gt;&lt;li&gt;CoC: Convention before configuration&lt;/li&gt;&lt;li&gt;Generator&lt;/li&gt;&lt;li&gt;Domain Specific Language&lt;/li&gt;&lt;/ul&gt;等等...我覺得是一個相當有潛力的project，可惜使用者族群沒有Python的多。&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;br /&gt;當然，有其利必有其弊。這些動態語言的開發速度雖然勝過C++，但執行速度是一定比不過C++的，如何平衡當然就看你的應用囉。例如：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;格鬥遊戲、3D射擊遊戲：別鬧了，乖乖用C++寫吧。動態語言可以拿來輔助做流程控制用。&lt;/li&gt;&lt;li&gt;益智遊戲、冒險解迷：在運算量不大的前題下，整個遊戲都使用動態語言寫也是有可能的。&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/777077092642445515-2497187244177824357?l=birdy-party.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://birdy-party.blogspot.com/feeds/2497187244177824357/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=777077092642445515&amp;postID=2497187244177824357' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/2497187244177824357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/2497187244177824357'/><link rel='alternate' type='text/html' href='http://birdy-party.blogspot.com/2007/02/ogre-language-binding.html' title='OGRE language binding'/><author><name>Mr. BigCat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-777077092642445515.post-4336706821353183498</id><published>2007-02-14T14:23:00.000+08:00</published><updated>2008-11-13T18:19:33.145+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OGRE'/><title type='text'>OGRE + MinGW + Code::Blocks 安裝</title><content type='html'>OGRE本身是用C++寫的，所以利用OGRE撰寫程式最直接的方法也就是使用C++。在OGRE官網 提供了&lt;a href="http://www.ogre3d.org/index.php?option=com_remository&amp;Itemid=74&amp;amp;func=selectcat&amp;cat=1"&gt;幾種開發環境的SDK&lt;/a&gt;，當然你要自己在其他環境compile應該也是可以的，但新手的話最好照著他的instruction做吧。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;VC.net 2005：雖然我滿不想用微軟的IDE，但為了方便我一開始試灌了這個方案。結果我發現還要另外抓四百多MB的windows platform SDK後，一怒之下就放棄了。&lt;/li&gt;&lt;li&gt;VC.net 2003：聽說這版不用灌platform SDK，我不太確定，要試的人請自己survey。&lt;/li&gt;&lt;li&gt;MinGW+CodeBlock：最後我還是選擇了gcc當我的底層compiler，於是就使用了這個方案。灌起來應該比VC麻煩一些吧。&lt;/li&gt;&lt;/ul&gt;如果你已經決定了使用MinGW+CodeBlock方案的話，請先詳閱&lt;a href="http://www.ogre3d.org/wiki/index.php/Codeblocks_and_MinGW"&gt;這篇文章&lt;/a&gt;並跟著一步一步做。(注意：在Code::Block 1.0 stable release後，安裝的步驟應該會變簡單很多，請隨時注意該wiki文章的內容有沒有更新)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;MinGW&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;MinGW是什麼？有試著在windows下用gcc的人應該都知道，MinGW和cygwin是目前兩個將gcc port到windows下的方案。所以我們的編譯器就靠他了。&lt;br /&gt;&lt;br /&gt;注意，&lt;span style="color: rgb(255, 0, 0);"&gt;不要下載官方的MinGW&lt;/span&gt;，因為OGRE對於libstdc++做了一些修正，請下載OGRE提供的&lt;a href="http://prdownloads.sourceforge.net/ogre/MinGW_Toolbox_Setup_r1.exe?download"&gt;MinGW ToolBox&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Code::Blocks&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;這是一套聽說要追過Dev-C++的Open Source IDE (我最近很少在寫C，所以不太清楚)&lt;br /&gt;&lt;br /&gt;注意：不要使用Code::Blocks 1.0 RC2及以前的版本，會當機。&lt;br /&gt;Code::Blocks的&lt;a href="http://forums.codeblocks.org/index.php?board=20.0"&gt;官方論壇幾乎每天會放出新的nightly build&lt;/a&gt;。OGRE官網是建議抓最新的nightly build，不過抓之前可以看看該thread有沒有重大的bug :)&lt;br /&gt;&lt;br /&gt;除了抓Wiki那兩個檔案外，記得抓mingwm10.7z，才有和mingw溝通的DLL&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;OGRE SDK&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;沒啥好說的，one-click installer&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Direct9 SDK&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;最好裝一下，如果你跟我一樣不爽裝(XD)的話....&lt;br /&gt;&lt;br /&gt;先 把sample build &amp; run看看，如果跳出找不到D3DX9_??.dll (??可能是某兩個數字)，去google 搜尋這個檔案的名稱就可以抓到了，把他丟進windows\system32之中。 (記得掃毒，但google明列前矛的網站應該還OK)&lt;br /&gt;&lt;br /&gt;這樣做的話，在debug build中可能會需要D3DX9_??d.dll (多了一個d字，debug版本的dll)而當掉。如果你還是不想用DX的話...&lt;br /&gt;&lt;br /&gt;在C:\OgreSDK\bin\debug (或你的安裝資料夾下) ，找到plugins.cfg中&lt;br /&gt;&lt;code&gt;Plugin=RenderSystem_Direct3D9&lt;/code&gt;&lt;br /&gt;將這行最前面加個井號註解掉，不要使用D3D，完全用OpenGL就好了。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;來玩OGRE吧&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Wiki最下面的那些setting可以先不要看，如果你抓的是2007.2.13之後的Code::Block nightly build，他裡面就有附OGRE的template project了。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ZNCDOmrFXjs/RdKxz_7sMoI/AAAAAAAAAAo/ISq7YVxpbnw/s1600-h/codeblockogre.PNG"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_ZNCDOmrFXjs/RdKxz_7sMoI/AAAAAAAAAAo/ISq7YVxpbnw/s400/codeblockogre.PNG" alt="" id="BLOGGER_PHOTO_ID_5031279240619504258" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;正常的話可以直接build&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ZNCDOmrFXjs/RdKzG_7sMpI/AAAAAAAAAAw/_89nvtbr-Oc/s1600-h/screenshot_1.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_ZNCDOmrFXjs/RdKzG_7sMpI/AAAAAAAAAAw/_89nvtbr-Oc/s400/screenshot_1.png" alt="" id="BLOGGER_PHOTO_ID_5031280666548646546" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;萬歲!!成功 XD&lt;br /&gt;&lt;br /&gt;(下一章應該寫OGRE + Python)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/777077092642445515-4336706821353183498?l=birdy-party.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://birdy-party.blogspot.com/feeds/4336706821353183498/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=777077092642445515&amp;postID=4336706821353183498' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/4336706821353183498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/4336706821353183498'/><link rel='alternate' type='text/html' href='http://birdy-party.blogspot.com/2007/02/ogre-mingw-codeblocks.html' title='OGRE + MinGW + Code::Blocks 安裝'/><author><name>Mr. BigCat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_ZNCDOmrFXjs/RdKxz_7sMoI/AAAAAAAAAAo/ISq7YVxpbnw/s72-c/codeblockogre.PNG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-777077092642445515.post-3894336564418299967</id><published>2007-02-13T23:14:00.000+08:00</published><updated>2007-02-14T16:28:22.512+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OGRE'/><title type='text'>What's OGRE?</title><content type='html'>&lt;a href="http://www.ogre3d.org/"&gt;OGRE&lt;/a&gt;是目前最大的open source 3d rendering engine之一，這四個字其實是Open soure GRaphic Engine的縮寫。&lt;br /&gt;&lt;br /&gt;這套引擎的歷史已經很悠久了，相信很多人沒玩過也聽過。那我只在這裡做簡單的介紹：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;他是一個繪圖引擎(rendering, 對岸好像稱為絢染)&lt;/li&gt;&lt;li&gt;他不是一個遊戲引擎，這個函式庫專注在3D繪圖上，少了音效、輸入、網路(optional)等部份。(事實上OGRE有很粗糙的輸入處理功能，但正式製作遊戲時不建議使用)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;為什麼要用OGRE？他與DirectX, OpenGL有什麼不同？&lt;br /&gt;&lt;ul&gt;&lt;li&gt;DirectX及OpenGL都是較底層的繪圖函式庫，直接與硬體做溝通。&lt;/li&gt;&lt;li&gt;DirectX是微軟的產品，只能在Windows系列上面跑。OpenGL是工業標準，能夠跨平台在Windows, Linux, Mac OSX上執行。&lt;br /&gt;&lt;/li&gt;&lt;li&gt;OGRE提供了比較高階的C++物件導向封裝，學習起來比較簡單。他可以選擇呼叫底層的DirectX和OpenGL，達到跨平台的目的，在windows下也可使用表現可能較好的DX。&lt;/li&gt;&lt;/ul&gt;介紹OGRE的一些link&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.ogre3d.org/index.php?option=com_content&amp;task=view&amp;amp;amp;amp;amp;amp;id=19&amp;amp;Itemid=79"&gt;官網: About&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.azure.com.cn/article.asp?id=138"&gt;Ogre图形引擎介绍（原创）- Azure Product&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;學習OGRE最快的方法應該就是照著&lt;a href="http://www.ogre3d.org/wiki/index.php/Ogre_Tutorials"&gt;OGRE Tutorial&lt;/a&gt;跑一遍，千萬不要一開始就去看API Documentation，保證你看的頭昏腦脹。由於目前OGRE的繁中資源還滿少的，接下來我應該會把我的筆記簡單的整理出來，其實我自己也是最近在跑tutorial而已，對整個開發流程還只是一知半解，如有謬誤也請大家幫忙更正。&lt;br /&gt;&lt;br /&gt;P.S. ogre這個字本身是&lt;a href="http://en.wikipedia.org/wiki/Ogre_%28Dungeons_%26_Dragons%29"&gt;食人魔&lt;/a&gt;的意思，開發人員明顯都是愛玩遊戲的人，固意把名稱縮成這四個字 XD&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/777077092642445515-3894336564418299967?l=birdy-party.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://birdy-party.blogspot.com/feeds/3894336564418299967/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=777077092642445515&amp;postID=3894336564418299967' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/3894336564418299967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/777077092642445515/posts/default/3894336564418299967'/><link rel='alternate' type='text/html' href='http://birdy-party.blogspot.com/2007/02/whats-ogre.html' title='What&apos;s OGRE?'/><author><name>Mr. BigCat</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
