顯示具有 GemPrimer ( Gem 初步教學) 標籤的文章。 顯示所有文章
顯示具有 GemPrimer ( Gem 初步教學) 標籤的文章。 顯示所有文章

2008/10/9

GemPrimer

GEM
Graphics Environment for Multimedia

圖形化環境的多媒體

April 10,2003

由 IOhannes m zmoelnig 編寫

這份文件的原文,你可以在 pd/doc/manuals/Gem/Gemprimer 找到它。

目錄

1. 如何閱讀這文件

1.1 翻譯pd-patches

2. openGL

2.1公尺、英吋、噚

3.第一個Gem-patch

3.1 [gemwin]

3.2 [gemhead]

3.3描繪某些東西

3.4彩繪一個Geo

3.5移動

3.6旋轉

3.7區域座標系統與全域座標系統

3.8多個物件

3.9獨立物件

3.10在單一gemlist的部份獨立物件

3.11美化輸出

3.12動畫

3.13習題

4.影像

4.1貼圖製作

5習題解答

5.1太陽系(3.13)

1. 如何閱讀這文件

這文件打算幫助編寫一些基本步驟到 Gem 之內。它被創造的原因來自一系列關於 Gem 工作坊的某些結構,其中我是非常注意的是-導致(我猜測)更多的混亂在參與者身邊究竟發生什麼事。

我假設這文章的讀者有完整最近的pd版本,已經安裝在他們的電腦上。而且我假設他們已經熟悉建立pd的patch基本概念,和在物件與訊息盒子之間的差異,以及在訊息與信號之間的不同。

1.1 翻譯pd-patches

因為 pd 是一個圖形化編寫程式語言,所以它難以在文字裡去解釋 patch 。因此我會試著給予一些執行中的 pd-patch螢幕截圖,其中可以被用來重新產生一些事。然而,為了用文字來討論 pd 物件,我會使用下面的排版慣例:

[foo 1 2]物件(包含著參數)固定字型在方括號內
[foo χ]物件(替代的參數)
[foo bar(訊息固定字型在方括號/圓括號之間
[foo name(訊息(跟著替代物)

"連接 [foo] 物件到 [bar] 物件"的術語意義,是連接 [foo] 的第一個輸出(這是在物件底部最左邊的小班點)到 [bar]物件第一個輸入(在物件上方邊緣最左邊的小班點)。連接[foo]的任何其他輸出到[bar]的任何其他輸入,是沒有意義的。而且連接[bar]的任何輸出到 [foo] 的任何輸入,也是沒有意義。 Pd只准許使用輸出連接到輸入(沒有其他相似的方法)因此,你必須確實以 [foo] 物件開始並且拉一條線到 [bar] 物件。

2.1公尺、英吋、噚

使用電腦圖形工作是相當普遍的,一個圖形元素的特定尺寸為像素。像素的尺寸取決於你的硬體(螢幕解析度)。使用 bitmap 圖形執行是很好(因為 bitmap 是以像素為基礎)。但是你在3D-應用程式中描繪了一個物體,物體實際的尺寸(在這螢幕裡)將會非常依賴在這眼睛/攝影機和物體之間的距離裡(遠方的物件是比較小的),然而物體的邏輯尺寸是固定的。因為以向量為基礎的應用程式(像 Gem )是以邏輯的方式敘述物體,它們不使用像素(如同螢幕上的單位)來儲存。相反地是,長度是用測量來給定,不使用任何的尺寸。如果一條線是1的單位長,你不知道是否這是一公尺、一個天文單位或一噚。但是你可以確定的是,這條線符合邏輯地只是2長度這條線的一半。

3.第一個Gem-patch

Gem-patches 是 pd-patches 。它們只是使用物件的特別設定,這些物件不是pd本來就有的,而是GEM提供的。這些物件能連接給一般的pd物件,無論是被它們控制或是控制它們。Gem物件來自一致的單位:機會是你必須使用一系列的GEM物件在一起,得到想要的結果。一般來說,使用單一、單獨的GEM物件是不能作任何事:它們不是獨立的物件。

3.1[gemwin]

為了讓 Gem 運作,有一個物件必須存在。這個物件是 [gemwin] 。

對一個顯示脈絡而言,[gemwin]是一個把柄。這個基本意義是,它提供了一個視窗Gem-window,Gem的場景在此渲染。
為了創造Gem-window,你必須送一個 [create(訊息給 [gemwin] 。取消視窗,只需要送出 [destroy(訊息。
你必須注意的是,即使創造了一個 Gem-window (稱為 Gem),是沒有東西會在這視窗描繪出來。反而,是在一開始它會包含在視窗之後的東西(這通常是相當令人煩躁的)。因此它簡直沒有東西包含在這裡面,甚至都沒有的黑色。
為了在 Gem-window 裡面顯示東西,你必須開啟渲染。簡單的送出一個 [1( 給[gemwin],讓它執行。再一次關閉渲染,只要送出 [0(。
我所想到最簡單的Gem-patch顯示在圖案2。它會顯示一個黑色視窗,因為沒有任何物體增加到這 Gem 場景內。
圖表2:每一個Gem-patch的強制性部份。
當有一個Gem-window已經被創造出來,你可以啟動渲染。
如果你要取消正在渲染的Gem-window,渲染會自動關閉。如果你要改變Gem-window的屬性,你可以送出訊息給[gemwin]來修改。例如,你可以改變顯示在視窗最上方橫桿的標題,送出 [title title-symbol( 。
你也可以設定 Gem-window 的尺寸([dimen width height()和位置([offset x y()。要注意的是,在實際創造出Gem-window之前,你必須送出有關於視窗外觀的訊息。你不能重新定義尺寸與移動一個已存在帶有訊息的 Gem-window 。在這裡也需要注意的是,在linux下簡單的使用視窗管理員重新修改 Gem-window 尺寸是不可能的,然而這在 windows 系統是可以的。

如果想要有一個 Gem 的全螢幕輸出,你可以送出 [fullscreen 1( 給它(在創造視窗之前)。注意,因為這會用到所有的螢幕,你也許永久不能再控制你的基本pd,例如你不能再一次關閉 Gem-window (並且離開全螢幕模式)。你可以送出一個 [fullscreen 0( 使全螢幕模式失效。
直到現在,只能一次使用一個 Gem-window (在一個 pd 執行範例的脈絡裡)。你可以放置許多 [gemwin] 物件在你的一個或多個 patch 裡,但是他們全部會影響同一個 Gem-window 。
未來的音樂:規劃支援多個 Gem-window 會在將來的 Gem 版本出現。在你電腦桌面上的視窗將會是不必須的,但是可以是你的顯示卡的電視輸出、IEEE1394-ink或是連接到串流視頻服務器(streaming video server)傳播到網路上。

2008/10/8

3.2[gemhead]

當[gemwin]創造了一個視窗時,裡面的渲染正被執行, [gemhead] 是一個物件,連接Gem物件的設定到渲染脈絡裡。
當pd執行音頻處理時,你必須用某種方法連接所有你要聽到的信號物件到[dac~] 。而所有的 Gem 物件必須被連接到 [gemhead] 。相反於 [dac~] ,[gemhead]不是最後的物件,卻是第一個物件(源頭,是Gen-list的開頭)。
每次渲染循環(每次描繪一個影格---通常的頻率是20 fps) [gemhead] 觸發一個輸出,因此這被稱為 Gen-list。Gen-list 是一種特別的信號種類,這只有被Gen物件所了解。
在Gen-list 裡,少數的Gem物件有多過(兩個)的輸入。
堆疊一系列的 Gem 物件(為了讓它們的作用計算),每一個 Gem 物件最少有一個「(最左邊)輸出,這些通過 Gen-list。

3.3描繪某個東西

這最基本的3D物體或許可以如此被稱為 Geos ,這些是基礎造型。這些是可被描繪的,告訴渲染去畫出某個造型。這些可描繪的造型其中之一是 [square] ,這會(意外地)描繪一個矩形。
圖表3:描繪一個矩形。
你將會注意到這有2個輸入。第一個輸入(左邊)是針對 Gem-list。這剩下的輸入被用來設定參數。(只有一個)參數能設定[square]它本身的外邊長度。你可以送出一個數字給第二個輸入去設定(或改變)它。在一開始,長度只會是1,除非撤銷最初的參數,就像這樣設定[square 2.1]。
這裡有許多基本的Geos,像[rectangle a b]、[triangle edge]、[cube edge]、[circle diameter slices]、[disk outerradius slices innerradius]、[cylinder diameter=height]、[cone diameter=height]、[sphere diameter]。

3.4彩繪一個Geo

擁有 Geos 是件好事,但是很快地它會變得無聊。如果你所能做的只是改變尺吋。為了作更多複雜的事,這裡呼叫控制物件准許 Geos 移動、塗上顏色。
一般來說,呼叫控制物件是在Geos之前。這是因為 openGL 結構如同狀態機制。

控制物件告訴渲染器去改變通常的狀態。例如, [color] 物件會告訴渲染器拿起沾上某種顏色的刷子。在描繪每一個物體之後,將會塗上某種顏色。直到 [color] 物件重新設定渲染器的顏色。
你必須通過你要劃上的顏色給 [color] 作為紅/綠/藍數值的設定,每一個排列在0和1 之間。最初的參數: [color red green blue] 會被執行,如果你不指定任何參數的話,111是預設的參數,指示物體為白色。在執行時間期間改變顏色,你可以送出一個數值(rgb三個一組)清單給 [color] 的第二個輸入。
圖表4:彩繪 Geo。
另一個選擇是 [colorRGB] ,這准許通過浮點數輸入去個別設定每一個顏色組成。

3.5移動

當Geo連接給[gemhead]的時候,它會描繪在視窗螢幕的中間。每一個Geo有它自己的中心點,這是每個簡單形狀的模型中心。(而且一個相當隨心所欲,但是但願更多複雜模型直覺的點)。當渲染器被通知畫出一個Geo,它會放置 Geo 的中心點在3D世界縱座標的原點。拍照的照相機是 Gem 視窗上的顯示器。是被校正去專注在3D場景的世界原點。因此所有的Geo會出現在視窗螢幕裡的中心點。我們可以用[translate]或[translateXYZ]物件移動物體(Geos,不是pd物件)。
[translateXYZ transX transY transZ] 採取3個參數作為在3個軸線X(由左到右)、Y(由上到下)、Z(由螢幕前到螢幕內)方向的最初轉換點。部分的轉換點也能經由給3個右邊輸入的數字來設定。
[translate factor vecX vecY vecZ]向量方位vecX vecY vecZ是按照比例縮放,藉由係數得到轉換。因此你可以指定轉換(第三的輸入)的方位獨立的由轉換的數量(第二個輸入)。
圖表5:Geo 的轉換。

3.6旋轉

任何 Geo 都可以旋轉它的中心點。
[rotateXYZ rotx rotY rotZ]物件旋轉Geo,第一個rotx 環繞X軸,然後rotY 環繞Y軸,最後rotZ環繞 Z軸。
[rotateXYZ amount vecX vecY vecZ]物件旋轉Geo,藉由方位vecX vecY vecZ
來指定環繞向量的數量。
圖表6:旋轉一個Geo 。

3.7區域座標系統與全域座標系統

[translate]([translateXYZ])、[rotate]([rotateXYZ])在區域座標系統的應用是多過全域座標系統。 [translate] 物件藉由確定的數量轉換區域座標系統, [rotate] 物件旋轉整個座標系統。這意味著堆放[translate]和[rotate]轉變的順序是非常重要的。
範例:假設一個立方體,首先[translate]然後[rotate]。如果現在改變旋轉的數量,結果將會是立方體在固定地點旋轉環繞它的中心軸。如果這兩個轉變被交換(先[rotate]然後在[translate]),改變旋轉的數量,會導致立方體旋轉環繞視窗螢幕的原點。(見圖表7的patch和圖表8的Gem輸出)
當認為是日常的區域座標系統時,這行為變得容易了解。例如假設你站在X地點向前直看。你的目標地點將會重度依賴在不管是向右轉90度並且走10步或是走10步而且然後向右轉90度。
圖表7:轉移順序的重要性。
圖表8:[translate] 在 [rotate] 導致Geo旋轉環繞它擁有的軸心之前(淡紫色所表示的)。[rotate] 在 [translate] 產生旋轉環繞原點之前(綠色所表示)

3.8多個物件

你可以放置多個 Geo 到 gemlist 裡。當在 gemlist 執行選轉移動時(像[rotate]),下面的每一個物件轉變都會被它所影響。在它之上的物件,這轉變將不會被它所影響。
圖表9:多個 Geos 在一個 gemlist。
這通常是非常方便的,當它允許一個3D場景的等級系統描述的時候。 Gemlist 中最初的物件在層級系統中是高過在他們之下的物件。較低的物件是被認為是較高階物件的一部分-就像你的手指是你的手的一部分:如果你移動你的手,手指也會跟著移動。

3.9獨立物件

有時候,你想要獨立的控制每一個Geo。然後你也許不要放他們到同一個。只要開始一個新 gemlist 。Gem物件是不同 [gemhead] 的孩子(以下),不會相互干涉。(看圖表10)

圖表10:Geos在多個 gemlists。

3.10在單一gemlist的部份獨立物件

有時候你要部份獨立控制 Gem 物件。例如如果你要建立人類身體的模型,你也許要移動和旋轉整個身體(與所有的部份,像頭部也被轉變)而且要能旋轉頭部和獨立的舉起手臂。(看圖表11)

圖表11:部份的獨立 Geos在單一 gemlist。

3.11美化輸出

當你也許已看到 Geo 外觀相當的醜陋,因為你不能在一個物件的不同面之間作辨別。為了美化渲染我們可以增加一些場景光線。

為了制造光線的使用,首先我們必須放置一些光源到我們的場景內。
[world_light] 物件是被用來當作無限遠的光源(就像太陽一樣)。因此你只能旋轉[world_light] 指定光線的方向。
[light] 是點狀的光源,可以藉由 [translate]([translateXYZ])和 [rotate]([rotateXYZ])放置在任何地方。
為了在適當位置放置光源,你可以送出一個 [debug 1( 給與光源後,會顯示一個小型圓錐,代表光的來源。

開關光源:在適當位置放置光源是不足夠打開光源。相反地你必須明確地打開(或關掉)它。這動作可以送出 [light 1((或 [light 0()訊息給 [gemwin] 來執行。注意這裡,當打開照明而沒有任何的光源,你的場景將會漆黑。
圖表12:為一個場景打光:(a)無打光,(b)打光

3.12動畫

Gem本身沒有能力去產生動畫。但是你可以用pd的邏輯來控制每個影格的演出。

圖表13:在Gem的動畫

3.13習題

作一些練習:建立一個包含下面天文元素的太陽系模型:
太陽
水星
金星
地球
月球
假設星球/月球/星星的隨心所欲(好看的)尺寸。使用圓形的路徑。讓整個東西活動起來(用隨意的速度)。

4.影像

為了顯示影像,Gem有一系列的物件用來作為影像的來源。這裡有JPEG/TIFF的影像載入物件、影片載入物件和即時視訊來源(攝影機輸入)。一般來說,所有跟影像有關系的物件,開頭文字帶有 [pix_ 後面帶有某些文字來描述本身功能。
[pix_image] 是最簡單的影像來源。它會載入影像到RAM裡面。你可以指定影像的檔案名稱,不管是作為第一個參數或是發送一個 [open filename( 到這物件。
圖表14:描繪一個影像。
顯示影像最簡單的方法是使用 [pix_draw] ,這會繪製它的原尺寸影像放到Gem視窗的中心。如果影像尺寸大過於Gem視窗,它將不會完整的呈現。[pix_draw] 通常不被顯示卡硬體加速器所支援(一般來說,這會讓它非常緩慢)而且我強烈推薦不要使用它。它只是最簡單的方法去畫出一個影像到螢幕裡,這就是為什麼我在這裡使用它。

4.1貼圖製作

GEM是一個 openGL 應用程式。 openGL 應用程式通常不會直接描繪出影像(就像使用[pix_draw])。反而影像被用來作為材質放在 Geo上。你可以想像貼圖製作是放了一張壁紙在 Geo上。
[pix_texture] 是用於應用一個材質。這意思是,影像被上傳到顯示卡的記憶體裡。每一個描繪出來的 Geo 在上傳材質之後,在相同的 gemlist裡 將會有材質被應用。
註:但願 [pix_texture] 和 [pix_texture2] 會被合併。
圖表15:貼圖製作一個影像。
不幸的是,openGL只支援2的倍數寬度(和高度)的材質(如512x256像素)。如果你試著應用錯誤尺寸的影像作為一個材質,你將不會看到任何東西(就像所有東西都沒有材質)。
為了克服這問題,[pix_texture2] 物件准許任何尺寸的影像(如320x240像素)作為 Geo上的材質。
在macOS-X,任何 Geo是被支援的,在 linux 和 windows 系統上,你也許用複雜的 Geos (像 [sphere])來實驗神秘的結果。