<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Chia´s Small Shop</title>
	<atom:link href="http://chia0418.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://chia0418.wordpress.com</link>
	<description>Chia小鋪，陳列隨手的文字</description>
	<lastBuildDate>Tue, 18 Aug 2009 17:54:13 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>zh-tw</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='chia0418.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/94c5398bdceecc2d0ea74d4645a93f2e?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Chia´s Small Shop</title>
		<link>http://chia0418.wordpress.com</link>
	</image>
			<item>
		<title>別讓你的多核心只是裝飾品！Intel TBB 2.2 發布</title>
		<link>http://chia0418.wordpress.com/2009/08/18/%e5%88%a5%e8%ae%93%e4%bd%a0%e7%9a%84%e5%a4%9a%e6%a0%b8%e5%bf%83%e5%8f%aa%e6%98%af%e8%a3%9d%e9%a3%be%e5%93%81%ef%bc%81intel-tbb-2-2-%e7%99%bc%e5%b8%83/</link>
		<comments>http://chia0418.wordpress.com/2009/08/18/%e5%88%a5%e8%ae%93%e4%bd%a0%e7%9a%84%e5%a4%9a%e6%a0%b8%e5%bf%83%e5%8f%aa%e6%98%af%e8%a3%9d%e9%a3%be%e5%93%81%ef%bc%81intel-tbb-2-2-%e7%99%bc%e5%b8%83/#comments</comments>
		<pubDate>Tue, 18 Aug 2009 15:09:04 +0000</pubDate>
		<dc:creator>chia0418</dc:creator>
				<category><![CDATA[TBB]]></category>
		<category><![CDATA[Intel Threading Building Blocks]]></category>
		<category><![CDATA[multicore]]></category>
		<category><![CDATA[multithread]]></category>

		<guid isPermaLink="false">http://chia0418.wordpress.com/?p=379</guid>
		<description><![CDATA[Intel® Threading Building Blocks (TBB) 是一個協助將演算法平行化處理的函式庫。利用多核心可以同時處理多執行緒的優點，TBB自動將資料拆成數塊，分別由各個執行緒執行後，再將結果彙整。以往要自己手動處理多個執行緒的管理以及同步等問題，TBB都已經幫你包辦好了。雖然寫起來不若OpenMP那樣簡潔，不過我對於程式碼中飛來飛去的#pragma實在有點感冒&#8230;
TBB 的開放原始碼版本(GPL 2)，在2009年8月9日發布2.2版囉！跟2.1版相比，架構有一點點小小地變動。除了效能的增進外，新加入的parallel_invoke與parallel_for_each方法，可以簡化原先parallel_for使用functor的繁複寫法，同時也支援C++0x的lambda functions。還有一個小小驚喜，終於不用初始化task scheduler了，2.2版會自動幫你做好這件事。眼下先把2.1版的projects升級一下囉～
拜訪 TBB
- TBB Home
- TBB 2.2 stable version download
- What’s New in Intel® TBB 2.2
Posted in TBB Tagged: Intel Threading Building Blocks, multicore, multithread, TBB      <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chia0418.wordpress.com&blog=3262473&post=379&subd=chia0418&ref=&feed=1" />]]></description>
		<wfw:commentRss>http://chia0418.wordpress.com/2009/08/18/%e5%88%a5%e8%ae%93%e4%bd%a0%e7%9a%84%e5%a4%9a%e6%a0%b8%e5%bf%83%e5%8f%aa%e6%98%af%e8%a3%9d%e9%a3%be%e5%93%81%ef%bc%81intel-tbb-2-2-%e7%99%bc%e5%b8%83/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">嘉嘉</media:title>
		</media:content>
	</item>
		<item>
		<title>在VC中利用Qt Designer建立自訂的slot</title>
		<link>http://chia0418.wordpress.com/2009/05/19/%e5%9c%a8vc%e4%b8%ad%e5%88%a9%e7%94%a8qt-designer%e5%bb%ba%e7%ab%8b%e8%87%aa%e8%a8%82%e7%9a%84slot/</link>
		<comments>http://chia0418.wordpress.com/2009/05/19/%e5%9c%a8vc%e4%b8%ad%e5%88%a9%e7%94%a8qt-designer%e5%bb%ba%e7%ab%8b%e8%87%aa%e8%a8%82%e7%9a%84slot/#comments</comments>
		<pubDate>Tue, 19 May 2009 12:34:23 +0000</pubDate>
		<dc:creator>chia0418</dc:creator>
				<category><![CDATA[Qt]]></category>
		<category><![CDATA[add-in]]></category>
		<category><![CDATA[Qt Designer]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://chia0418.wordpress.com/?p=343</guid>
		<description><![CDATA[Qt自己出了個IDE，Qt Creator，支援GNU的編譯器與GDB除錯器
整合度之高，感覺真像是先前使用Borland C++ Builder的經驗一樣
不過，假如已經習慣了VC的編譯環境，就只能望著Qt Creator乾瞪眼嗎？
好在從Qt釋出了Visual Studio add-in (for open-source version)以後
Qt跟VC之間的距離就越來越近了
不用管什麼三部曲、uic與moc
視窗拉一拉，元件放一放，一個可口的GUI就完成了
打造複雜的GUI再也不是夢想！
在設計GUI的過程中，往往會碰到需要自行定義被觸發事件(signal)的處理方法(slot)
signal沒啥問題，通常是按鈕、選單等元件發出(e.g. 滑鼠點擊)
但是slot呢？並不是每個signal都找得到合適的預設slot
比方說，按一個按鈕開啟檔案對話框，然後載入一張圖片
應該找不到一個slot是剛好設定為「開啟檔案對話框」的吧！
這個時候，就需要自訂的slot來解決問題
signal跟slot的宣告，可以依照自己的喜好來設計（不過要照規則唷）
或是由Designer協助建立signal與slot的連結關係
為什麼要由Designer來協助呢？個人認為有兩個好處
1. 由Designer建立signal與slot的連結，不容易出錯
當使用Designer建立連結時，會幫你檢查signal傳送資料的型別與參數量與slot的是否相符
如果兩者的函式簽名對應不起來，你連看到slot的機會都沒有，大大的降低了出錯的可能性
2. 統一管理，程式碼不再亂糟糟

Designer提供了signal/slot編輯器，所有的連結關係都由此編輯器完成
在實做類別中，就不需要再手動寫連結signal/slot的程式碼了
講了一堆，就拿上面提到的例子開始吧～
以下的操作，以VC2008作為編譯環境
Qt版本是4.5.0 (open-source 編譯版)，配上Visual Studio add-in 1.0.0
首先，開啟VC，建立一個新的Qt應用程式專案



假設應用程式的class name叫做MyQtApp
設定完成後，點兩下&#8221;myqtapp.ui&#8221;，帶出Qt Designer
就開始畫UI囉
在這個小範例中，需要兩個元件，一個是QLabel，用來顯示影像
另一個就是QPushButton，用來開啟檔案對話框用的
那檔案對話框呢？嗯&#8230;必須由程式產生了[註1]，所以暫時先不管
最後設計好的視窗看起來會像這樣：

接著，重點出現了，要設定pushButton的signal/slot連結
按下pushButton，自然會用到clicked()這個signal
但是，要連到哪個slot呢？
利用編輯信號與信號槽的狀態下
發送者選擇pushButton，信號是clicked(bool) [註2]
而對象是我們的應用程式MyQtAppClass，信號槽是空白一片

沒關係，按下「編輯」後

在信號槽的地方增加一個新的信號槽
這個slot function的名稱隨便你設計，但是簽名要與發送的信號一致
在這裡，引數的型別一定要是bool

按下「確定」後，原先空白一片的信號槽出現剛剛新增的slot function囉！

設定連結後，最後可以在信號與信號槽編輯器看到剛剛建立的連結結果

到這裡，Qt Designer的工作已經完成了
剩下的工作就是coding，定義剛剛新增的slot function
回到VC2008中，開啟myqtapp.h
宣告剛剛新增的slot function，假設放在private好了，因此myqtapp.h看起來就像

class MyQtApp : public QWidget
{
    Q_OBJECT

public:
    MyQtApp(QWidget *parent = 0, Qt::WFlags flags = 0);
    ~MyQtApp();

private:
    Ui::MyQtAppClass ui;

private slots:
 [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chia0418.wordpress.com&blog=3262473&post=343&subd=chia0418&ref=&feed=1" />]]></description>
		<wfw:commentRss>http://chia0418.wordpress.com/2009/05/19/%e5%9c%a8vc%e4%b8%ad%e5%88%a9%e7%94%a8qt-designer%e5%bb%ba%e7%ab%8b%e8%87%aa%e8%a8%82%e7%9a%84slot/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">嘉嘉</media:title>
		</media:content>

		<media:content url="http://chia0418.files.wordpress.com/2009/05/2009-05-19-18-41-04.png" medium="image">
			<media:title type="html">Open new Qt Application project</media:title>
		</media:content>

		<media:content url="http://chia0418.files.wordpress.com/2009/05/2009-05-19-18-41-05.png" medium="image">
			<media:title type="html">Qt Application settings</media:title>
		</media:content>

		<media:content url="http://chia0418.files.wordpress.com/2009/05/2009-05-19-18-55-30.png" medium="image">
			<media:title type="html">MyQtApp gui design</media:title>
		</media:content>

		<media:content url="http://chia0418.files.wordpress.com/2009/05/2009-05-19-18-59-31.png" medium="image">
			<media:title type="html">edit slot</media:title>
		</media:content>

		<media:content url="http://chia0418.files.wordpress.com/2009/05/2009-05-19-18-59-49.png" medium="image">
			<media:title type="html">signal and slot editor</media:title>
		</media:content>

		<media:content url="http://chia0418.files.wordpress.com/2009/05/2009-05-19-19-00-39.png" medium="image">
			<media:title type="html">new slot</media:title>
		</media:content>

		<media:content url="http://chia0418.files.wordpress.com/2009/05/2009-05-19-19-02-01.png" medium="image">
			<media:title type="html">connect to the slot</media:title>
		</media:content>

		<media:content url="http://chia0418.files.wordpress.com/2009/05/2009-05-19-19-02-25.png" medium="image">
			<media:title type="html">connection result</media:title>
		</media:content>

		<media:content url="http://chia0418.files.wordpress.com/2009/05/2009-05-19-19-29-59.png" medium="image">
			<media:title type="html">open file dialog</media:title>
		</media:content>

		<media:content url="http://chia0418.files.wordpress.com/2009/05/2009-05-19-19-30-26.png" medium="image">
			<media:title type="html">MyQtApp</media:title>
		</media:content>
	</item>
		<item>
		<title>與Ogre共舞：第六步，敲敲鍵盤、動動滑鼠</title>
		<link>http://chia0418.wordpress.com/2009/04/01/%e8%88%87ogre%e5%85%b1%e8%88%9e%ef%bc%9a%e7%ac%ac%e5%85%ad%e6%ad%a5%ef%bc%8c%e6%95%b2%e6%95%b2%e9%8d%b5%e7%9b%a4%e3%80%81%e5%8b%95%e5%8b%95%e6%bb%91%e9%bc%a0/</link>
		<comments>http://chia0418.wordpress.com/2009/04/01/%e8%88%87ogre%e5%85%b1%e8%88%9e%ef%bc%9a%e7%ac%ac%e5%85%ad%e6%ad%a5%ef%bc%8c%e6%95%b2%e6%95%b2%e9%8d%b5%e7%9b%a4%e3%80%81%e5%8b%95%e5%8b%95%e6%bb%91%e9%bc%a0/#comments</comments>
		<pubDate>Wed, 01 Apr 2009 14:59:59 +0000</pubDate>
		<dc:creator>chia0418</dc:creator>
				<category><![CDATA[Ogre]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://chia0418.wordpress.com/?p=299</guid>
		<description><![CDATA[從建立了Ogre的視窗開始，我們的目標就是透過攝影機，來看所設計的3D場景。為了能夠自由自在的瀏覽，我們得用輸入裝置來控制攝影機的位置與拍攝角度。由於Ogre本身只是個純繪圖引擎，對於處理鍵盤滑鼠之類的裝置非常不擅長，因此特地請來另外一個小巧簡單的套件 &#8211; OIS（Object Oriented Input System，別問我為什麼不叫OOIS呀&#8230;），幫忙解決這個問題。而這所有的過程，都會由FrameListener來接管。我們將繼續上一步的FrameListener範例，添加了滑鼠鍵盤輸入的處理，達到控制攝影機的目的。
先來簡單介紹一下OIS，這是個跨平台處理輸入裝置的函式庫，以物件導向的方式設計。OIS可以支援的輸入裝置主要是鍵盤、滑鼠、搖桿，同時也支援力回饋裝置。Ogre在編譯的時候，已經把OIS當成其中的一部分，所以我們可以簡單的使用，而不需要另外作安裝或設定的動作。不過，OIS本身沒有提供說明文件，Ogre的API裡也查不到（當然的嘛～），所以除了Wiki上有得找以外，就得直接看source code，或是OIS的API參考文件囉！
使用OIS，必須定義OIS_DYNAMIC_LIB與引入&#8221;OIS.h&#8221;，順序不能錯，這樣OIS才會正確的使用dll檔的export的定義。接著，我們接受輸入裝置的目標是視窗，因此要讓OIS知道是哪一個視窗取得輸入裝置的訊息。OIS的初始化比較囉唆一點，因為一開始要準備初始化用的參數，看起來就很嚇人。下段code中，第3行的m_render_window是我們所建立的RenderWindow的指標，由其成員函式getCustomAttribute()取得視窗的handle。第一個傳入參數&#8221;WINDOW&#8221;是RenderWindow屬性的鍵值，是固定的寫法。得到的window_handle隨後由第6~7兩行轉換為字串，準備給OIS的初始化參數使用。

    // retrieve the handle of the render window
    DWORD window_handle = NULL;
    m_render_window-&#62;getCustomAttribute( &#34;WINDOW&#34;, &#38;window_handle );

    // convert the handle to std::string(stream)
    ostringstream window_handle_str;
    window_handle_str &#60; &#60; window_handle;

接著要產生OIS初始化用的參數列，先宣告OIS::ParamList的變數一枚，接著用insert()加入參數對(std::pair)。下面的程式碼中，第4行就是把剛剛取得的RenderWindow的handle，對應鍵值為&#8221;WINDOW&#8221;，加入初始化的參數中。到這裡OIS的初始化參數已經算是建立完成了，可以建立OIS的InputManager。在全螢幕或是視窗的應用上，通常（特別是遊戲）不會讓滑鼠的游標露出來給你看，或是在遊戲中使用自訂的滑鼠游標。第8~9行的作用是讓滑鼠的游標可以顯示出來，就像一般的視窗應用程式那樣。DISCL_FOREGROUND與DISCL_NONEXCLUSIVE設定了滑鼠的前景模式與非獨站模式[註1]，定義在DirectX的DirectInput中。

   [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chia0418.wordpress.com&blog=3262473&post=299&subd=chia0418&ref=&feed=1" />]]></description>
		<wfw:commentRss>http://chia0418.wordpress.com/2009/04/01/%e8%88%87ogre%e5%85%b1%e8%88%9e%ef%bc%9a%e7%ac%ac%e5%85%ad%e6%ad%a5%ef%bc%8c%e6%95%b2%e6%95%b2%e9%8d%b5%e7%9b%a4%e3%80%81%e5%8b%95%e5%8b%95%e6%bb%91%e9%bc%a0/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">嘉嘉</media:title>
		</media:content>

		<media:content url="http://chia0418.files.wordpress.com/2009/04/ogre-unbuffered_input.png" medium="image">
			<media:title type="html">ogre-unbuffered_input</media:title>
		</media:content>
	</item>
		<item>
		<title>與Ogre共舞：第五步，轉轉乳酪方塊</title>
		<link>http://chia0418.wordpress.com/2009/03/28/%e8%88%87ogre%e5%85%b1%e8%88%9e%ef%bc%9a%e7%ac%ac%e4%ba%94%e6%ad%a5%ef%bc%8c%e8%bd%89%e8%bd%89%e4%b9%b3%e9%85%aa%e6%96%b9%e5%a1%8a/</link>
		<comments>http://chia0418.wordpress.com/2009/03/28/%e8%88%87ogre%e5%85%b1%e8%88%9e%ef%bc%9a%e7%ac%ac%e4%ba%94%e6%ad%a5%ef%bc%8c%e8%bd%89%e8%bd%89%e4%b9%b3%e9%85%aa%e6%96%b9%e5%a1%8a/#comments</comments>
		<pubDate>Sat, 28 Mar 2009 08:47:15 +0000</pubDate>
		<dc:creator>chia0418</dc:creator>
				<category><![CDATA[Ogre]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://chia0418.wordpress.com/?p=261</guid>
		<description><![CDATA[在這步中，將要介紹Ogre在描繪場景時，一個參與描繪流程的重要的類別：FrameListener，顧名思義就是Ogre每描繪一張畫面時，在旁邊「聽候通知」的類別。在行為上，FrameListener與回呼函數(callback function)相當，每當Ogre描繪一張畫面，會在適當事件發生的時候通知FrameListener來處理。我們可以利用FrameListener來處理每一個畫面中，物件的操作、攝影機視角的改變、以及其他輸出輸入的處理，讓使用者能夠與Ogre的場景有所互動。
Ogre提供的FrameListener類別不能直接使用，必須產生一個衍生類別後，實做FrameListener提供的虛擬函式。先來看看一個簡單的衍生FrameListener的例子：

class MyOgreFrameListener: public FrameListener
{
public:
    MyOgreFrameListener( Camera *_cam ) :
        m_camera( _cam ), m_scene_mgr( _cam-&#62;getSceneManager() ) {}
    ~MyOgreFrameListener() {}

public: // FrameListener virtual functions
    bool frameStarted( const FrameEvent &#38;_evt );
    bool frameRenderingQueued( const FrameEvent &#38;_evt );
  [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chia0418.wordpress.com&blog=3262473&post=261&subd=chia0418&ref=&feed=1" />]]></description>
		<wfw:commentRss>http://chia0418.wordpress.com/2009/03/28/%e8%88%87ogre%e5%85%b1%e8%88%9e%ef%bc%9a%e7%ac%ac%e4%ba%94%e6%ad%a5%ef%bc%8c%e8%bd%89%e8%bd%89%e4%b9%b3%e9%85%aa%e6%96%b9%e5%a1%8a/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">嘉嘉</media:title>
		</media:content>

		<media:content url="http://chia0418.files.wordpress.com/2009/03/ogre-framelistener1.png" medium="image">
			<media:title type="html">ogre-framelistener</media:title>
		</media:content>

		<media:content url="http://chia0418.files.wordpress.com/2009/03/2009-03-28-15-58-32.gif" medium="image">
			<media:title type="html">轉轉乳酪方塊</media:title>
		</media:content>
	</item>
		<item>
		<title>與Ogre共舞：第四步，乳酪方塊的協奏曲</title>
		<link>http://chia0418.wordpress.com/2009/03/23/%e8%88%87ogre%e5%85%b1%e8%88%9e%ef%bc%9a%e7%ac%ac%e5%9b%9b%e6%ad%a5%ef%bc%8c%e4%b9%b3%e9%85%aa%e6%96%b9%e5%a1%8a%e7%9a%84%e5%8d%94%e5%a5%8f%e6%9b%b2/</link>
		<comments>http://chia0418.wordpress.com/2009/03/23/%e8%88%87ogre%e5%85%b1%e8%88%9e%ef%bc%9a%e7%ac%ac%e5%9b%9b%e6%ad%a5%ef%bc%8c%e4%b9%b3%e9%85%aa%e6%96%b9%e5%a1%8a%e7%9a%84%e5%8d%94%e5%a5%8f%e6%9b%b2/#comments</comments>
		<pubDate>Mon, 23 Mar 2009 07:49:56 +0000</pubDate>
		<dc:creator>chia0418</dc:creator>
				<category><![CDATA[Ogre]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://chia0418.wordpress.com/?p=225</guid>
		<description><![CDATA[在前三步中，從安裝Ogre開始，到建立視窗並在Ogre中放了一個彩色三角片，我們已經接觸了幾個Ogre中重要的元件：Ogre根本的Root，系統繪圖API介面的RenderSystem，掌控物件配置的SceneManager，隸屬於ResourceManager、產生材質的MaterialManager，以及建立自訂幾何構成物件的ManualObject。在這步中，我們要用SceneManager在場景中擺設12個乳酪方塊，認識SceneManager如何控制元件的位置與姿態。當然，還是只用程式碼來完成一切唷。
首先，我們需要12個乳酪方塊，前面學會用ManualObject來產生一個三角片，當然也可以產生一個方塊囉！嗯～沒錯，產生立方體的程式不難，不過今天的重點不是ManualObject，所以暫時把它忘了吧！今天要登場的主角是Entity，
中文意思是「實體」，表示在場景中的物件其幾何構成的實體&#8230;真難解釋，還是先叫Entity吧。在Ogre中，多邊形物件(mesh)都由ResourceManager管理與載入。載入以後，Ogre還不能描繪它，必須由SceneManager產生該Mesh物件的Entity，才能上場。

// create a prefab cube
Entity *ent = m_scene_mgr-&#62;createEntity( &#34;cube0&#34;, SceneManager::PT_CUBE );
ent-&#62;setMaterialName( &#34;CheeseCube&#34; );
m_scene_mgr-&#62;getRootSceneNode()-&#62;attachObject( ent );

上段程式碼的第1行，Entity是由SceneManager產生的，如同ManualObject一樣。”cube0”是產生Entity時給定的名字，在整個場景中必須是獨一無二的，不然Ogre會不爽給你看。在大多數的場合，createEntity()的第二個參數是Mesh物件的名稱，用來產生Mesh物件的Entity。不過SceneManager提供另外一種產生Entity的方式：使用預先製好的幾何模型，平面(PT_PLANE)、立方體(PT_CUBE)與球體(PT_SPHERE)。所以第1行就是產生一個名叫”cube0”的立方體（的Entity，你知道的）。第2行，我們透過ent這個指標來設定剛剛被產生Entity的材質。這個材質的名稱叫做”CheeseCube”，後面會說明它的產生方式。最後，和先前一樣，把Entity加入RootSceneNode，乳酪方塊就可以被Ogre畫出來囉。

Entity屬於MovableObject，看字面就知道他是個可以亂動的東西。SceneManager提供了七種可以亂動的物件：Camera, Light, Entity, ManualObject, BillboardChain (RibbonTrail), ParticleSystem。那麼，物件想放在場景中，要怎樣「擺」呢？SceneManager利用了一個樹狀節點的結構，來描述物件彼此間的關係，以及紀錄在場景中的位置與姿態。每一個節點，可以裝上(attach)一或多個「可以亂動的物件」，而物件的位置與姿態，就由該節點表示。換句話說，物件本身並不知道自己在哪裡，只有查詢節點才知道它的位置。舉例來說，你(SceneManager)把一個杯子(Mesh)放在房間(RootSceneNode)的桌上(SceneNode)，如果我想知道杯子在哪裡，問杯子一定沒有答案。杯子會知道自己在哪裡嗎？不會吧！只有你會記得它在哪裡。進一步來說，我問杯子在哪裡，你的回答會是：在房間(RootSceneNode)裡的桌子(SceneNode)上。如果桌子被搬動，那麼杯子在房間裡的位置就會跟著改變。這就是SceneNode簡單的概念。
我們先來看個改變位置的小例子。SceneNode提供兩種方法設定在場景中的位置：translate()跟setPosition()。translate()是設定相對的x,y,z位移量，預設是根據其父節點的座標系來平移。而setPosition()則是直接設定節點位置，只能根據其父節點的座標系。這個例子中，兩行敘述會讓RootSceneNode移動到(200, 200, 0)的位置：

SceneNode *root_node = m_scene_mgr-&#62;getRootSceneNode();
root_node-&#62;translate( Vector3( 200, 0, 0 ) );
root_node-&#62;translate( Vector3( 0, 200, 0 ) );

這等同於下面這行敘述，直接把RootSceneNode的位置設成(200, 200, 0)：

root_node-&#62;setPosition( Vector3( 200, 200, 0 ) );

如果上述三行敘述一起按照順序執行，最後RootSceneNode的位置會在哪？答案是(200, 200, 0)，答對了嗎？又，如果先執行setPosition()的敘述，再執行上述的兩個translate()敘述，RootSceneNode的位置會在哪？答案是(400, 400, 0)，不意外吧！
接著，我們考慮旋轉的情形。在3D場景中，旋轉的操作往往會帶來許多意外的混亂。讓我們先弄清楚幾個重點：
1. 不論怎麼旋轉某節點，它的local space永遠不會改變。
2. 對某節點一起做旋轉與平移的操作，具有不可交換性。也就是旋轉與平移操作的順序會影響結果。
有點抽象，不過還好，看看小例子吧！（暗紅線標示世界座標系的x水平軸與y鉛直軸，水藍色箭頭表示平移操作，橘色箭頭表示旋轉操作）

root_node-&#62;translate( Vector3( 200, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chia0418.wordpress.com&blog=3262473&post=225&subd=chia0418&ref=&feed=1" />]]></description>
		<wfw:commentRss>http://chia0418.wordpress.com/2009/03/23/%e8%88%87ogre%e5%85%b1%e8%88%9e%ef%bc%9a%e7%ac%ac%e5%9b%9b%e6%ad%a5%ef%bc%8c%e4%b9%b3%e9%85%aa%e6%96%b9%e5%a1%8a%e7%9a%84%e5%8d%94%e5%a5%8f%e6%9b%b2/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">嘉嘉</media:title>
		</media:content>

		<media:content url="http://chia0418.files.wordpress.com/2009/03/2009-03-23-11-26-44.png" medium="image">
			<media:title type="html">乳酪方塊x1</media:title>
		</media:content>

		<media:content url="http://chia0418.files.wordpress.com/2009/03/2009-03-23-13-59-48.png" medium="image">
			<media:title type="html">TRT範例</media:title>
		</media:content>

		<media:content url="http://chia0418.files.wordpress.com/2009/03/2009-03-23-13-59-01.png" medium="image">
			<media:title type="html">RTT範例</media:title>
		</media:content>

		<media:content url="http://chia0418.files.wordpress.com/2009/03/2009-03-23-14-56-54.png" medium="image">
			<media:title type="html">乳酪方塊x12</media:title>
		</media:content>
	</item>
		<item>
		<title>與Ogre共舞：第三步，來一個三角片</title>
		<link>http://chia0418.wordpress.com/2009/03/17/%e8%88%87ogre%e5%85%b1%e8%88%9e%ef%bc%9a%e7%ac%ac%e4%b8%89%e6%ad%a5%ef%bc%8c%e4%be%86%e4%b8%80%e5%80%8b%e4%b8%89%e8%a7%92%e7%89%87/</link>
		<comments>http://chia0418.wordpress.com/2009/03/17/%e8%88%87ogre%e5%85%b1%e8%88%9e%ef%bc%9a%e7%ac%ac%e4%b8%89%e6%ad%a5%ef%bc%8c%e4%be%86%e4%b8%80%e5%80%8b%e4%b8%89%e8%a7%92%e7%89%87/#comments</comments>
		<pubDate>Tue, 17 Mar 2009 13:53:25 +0000</pubDate>
		<dc:creator>chia0418</dc:creator>
				<category><![CDATA[Ogre]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://chia0418.wordpress.com/?p=124</guid>
		<description><![CDATA[自從上一步學會開啟一個黑漆漆的小視窗後，該是來點什麼的時候了。在這步裡，我們將會在視窗裡擺上一個三角片-一個構成3D世界最基本的物件。擺好之後，或許還可以上點顏色。我們會開始接觸Ogre最重要的子系統-SceneManager，以及利用ManualObject來產生三角片。同樣的，這個範例依照我個人的偏好，不使用Ogre的設定檔與提供的資源。
第一個要上場的，就是掌控整個3D場景中所有物件的SceneManager。SceneManager握有物件的生殺大權，透過一個樹狀的結構管理物件的相對關係。Ogre支援多個SceneManager，可以同時管理不同類型的場景。ScnenManager是由Root物件所建立的：

    // create the SceneManager, in this case a generic one
    SceneManager *scene_mgr = root-&#62;createSceneManager( ST_GENERIC );

上面的敘述會建立一個一般性(ST_GENERIC)的ScnenManager，這裡暫時不討論SceneManager的形式。還記得&#8221;Hello, Ogre!&#8221;建立的步驟嗎？在正式啟動Ogre的描繪迴圈之前，我們已經手動建立好一個視窗。但是，光有視窗，Ogre仍然不知道該怎麼把3D場景「畫」在視窗上。這中間還需要一台攝影機，把3D場景「拍下來」，然後顯示在視窗上。所以，由SceneManager建立一部攝影機，就取名叫做&#8221;MainCamera&#8221;：

    // create the Camera
    Camera *camera = scene_mgr-&#62;createCamera( &#34;MainCamera&#34; );

順帶一提，在Ogre裡建立物件或資源，大多數都需要給一個名稱。除了作為辨識外，Ogre在查詢物件時，非常仰賴這個名稱。這個設計一開始讓人有點不習慣，不過在往後會大量的使用，因此稍微熟悉一下。
接著，建立ViewPort物件，讓相機(Camera)與描繪視窗(RenderWindow)有所連結。ViewPort可以看成在描繪視窗中，真正要顯示相機看到的部份。換句話說，一個ViewPort最大的尺寸就是描繪視窗的大小。Ogre支援多個ViewPort，也就是說，你也可以設計成利用分割畫面，達到兩人同時進行遊戲的效果。當然，那樣至少需要兩個相機。一般的情況下，我們只需要一個ViewPort就好，並利用ViewPort設定畫面的背景顏色。ViewPort預設使用100%描繪視窗的寬與高，背景顏色這裡設定為黑色。

    // create the Viewport
    Viewport *viewport = render_win-&#62;addViewport( camera [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=chia0418.wordpress.com&blog=3262473&post=124&subd=chia0418&ref=&feed=1" />]]></description>
		<wfw:commentRss>http://chia0418.wordpress.com/2009/03/17/%e8%88%87ogre%e5%85%b1%e8%88%9e%ef%bc%9a%e7%ac%ac%e4%b8%89%e6%ad%a5%ef%bc%8c%e4%be%86%e4%b8%80%e5%80%8b%e4%b8%89%e8%a7%92%e7%89%87/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">嘉嘉</media:title>
		</media:content>

		<media:content url="http://chia0418.files.wordpress.com/2009/03/2009-03-17-21-12-14.png" medium="image">
			<media:title type="html">白色三角形@Hello, Ogre!</media:title>
		</media:content>

		<media:content url="http://chia0418.files.wordpress.com/2009/03/2009-03-17-21-16-04.png" medium="image">
			<media:title type="html">RGB三角形@Hello, Ogre!</media:title>
		</media:content>
	</item>
	</channel>
</rss>