Max/MSP/Jitter 官方教程翻譯05 - 矩陣的數學運算

disable發表於2021-09-09

本教程介紹如何對儲存在 Jitter 矩陣中的資料做簡單的數學運算,使用 jit.op 物件來縮放矩陣單元格或單個平面。

教程分為三個簡單的例子,你可以使用 jit.op 物件執行這些操作。jit.op 對矩陣的所有物件而不是單個數字執行數學運算。

圖片描述

向矩陣中的所有單元格新增常量

第一個示例顯示了連線到 jit.opjit.matrix 物件,其輸出可由 jit.pwindow 檢視。每次改變連線到 jit.op 右輸入口的數字框,都會從 jit.matrix 輸出一個新的矩陣。從引數中可以看出,jit.matrix 生成一個 4x3 的單平面 char(0-255) 矩陣。jit.pwindow 把這個矩陣視覺化為一個灰度影像。拖動數字框將改變顯示的灰度級別(黑色 0 ~ 白色 255)。

請注意,jit.matrix 輸出了一個所有單元格都為 0 的矩陣。如果將 jit.matrixjit.pwindow 物件繞過 jit.op 連線在一起,無論向 jit.matrix 傳送多少次 bang 訊息,都只能看到黑色影像。jit.opjit.matrixjit.op 之間的矩陣的所有單元都加上了一個值(由數字框給定)。

@ 運算子

jit.op 根據引數指定的運算(用 @op 表示)向矩陣加了一個值(不是乘或除)。@op 之後的引數是一個符號(或符號列表),它定義了 jit.op 在輸入矩陣上執行的數學運算。

圖片描述

image

在這個例子中,op 屬性設定為 + ,它對從左入口輸入的任何矩陣都執行加法操作。右側入口中的整數值會加到矩陣中的所有單元格。這個值被稱為標量(scalar),因為它向整個矩陣新增了相同的值(在教程 11 中我們會展示 jit.op 如何使用兩個矩陣進行數學運算)。

要點:更改 jit.op 右側入口中的標量值不會輸出新矩陣。如果斷開數字框和按鈕之間的接線,jit.pwindow 將停止顯示任何新內容。原因在於,大多數 Jitter 物件與大多數 Max 物件一樣,僅在資料進入其最左側入口時才會輸出資料。

在上面的例子中,每次更改數字框時 jit.op 都會儲存新的標量值。此時按鈕傳送一個 bang 給 jit.matrix,讓它將新的矩陣(所有值設定為 0)傳送到 jit.op 的左入口,觸發輸出矩陣。

如果在按鈕上方的接線上放置一個斷點,然後 shift-cmd-T 逐步執行訊息,就能看到它是如何運作的。(有關如何使用斷點功能跟蹤 Max 訊息,請參閱教程:訊息順序和除錯)

使用 jit.op 的 val 屬性,標量值也可以作為常量。例如,如果想要為矩陣的所有單元格新增 134,可以使用 val 屬性並省去數字框:

圖片描述

將標量設定為屬性

類似地,如果想要更改由任何給定的 jit.op 物件執行的數學運算,可以用訊息 op 後跟數學符號,傳送到物件的左入口。

多平面資料的數學運算

第二個示例顯示了使用 jit.op 將值傳入矩陣的更復雜的例子。

圖片描述

為矩陣的每個平面使用單獨的標量

這個 patch 跟第一個類似,區別在於現在使用的是 4 平面矩陣。這由 jit.matrix 的第一個引數給出。jit.pwindow 現在有顏色了,它正在解析矩陣 α/紅/綠/藍 4 個單獨儲存顏色通道的平面。這個例子中的 jit.op 包含 op 屬性的四個符號的列表:每個符號設定輸入矩陣的一個平面的數學運算。在這個 patch 中,保留第一個(alpha)平面不做改動,而為其他 3 個平面做加法運算。

pak 物件向 jit.op 右輸入口傳送四個打包的整數。pakpack 的唯一區別是,當更改任何數字時,pak 都會輸出一個新列表(pack 需要一個新數字或左側入口的一個 bang 來觸發輸出新列表)。由 pak 生成的四個數字決定了傳入 jit.op 矩陣的每個平面的標量值。

在上面的示例中,平面 0 沒有新增任何內容(op 屬性的第一個引數是 pass)。平面 1,2 和 3 將分別新增 161,26 和 254。jit.pwindow 將輸出矩陣的單元格解析為洋紅色(即使只看到一種顏色,矩陣中實際上有 12 個單元格,都設定為相同的值)。

要點:如果jit.op 物件的 op 屬性只有一個值(只使用一個數字作為標量),jit.op 將在輸入矩陣的所有平面都使用該運算子號和標量值。

修改影像中的顏色

第三個例子說明如何在矩陣中使用 jit.op,這個矩陣已經儲存了相關資料:

圖片描述

將單個平面與標量相乘

單擊訊息框 importmovie colorbars.pngjit.matriximportmovie 訊息將影像或 QuickTime 影片檔案中的單幀影像載入到物件儲存的矩陣中。它會將原影像縮放到矩陣的尺寸(320 x 240)。

單擊按鈕,jit.pwindow 中顯示影像校準顏色條。這時 jit.op 的算術運算子設定為:alpha 平面不做修改(pass), 其他平面設定為 *(乘)。這個矩陣有 4 個平面,因此使用 4 個浮點數列表設定每個標量。平面 1~3 中的值都是 1.,結果是顯示原始的影像:

圖片描述

所有標量均為 1

如果將標量設定為 1.0,0 和 0.,會看到以下影像:

圖片描述

image

包含顏色條的矩陣的所有平面(平面 1 除外)都乘以 0。這將消除矩陣的α,綠色和藍色平面,僅留下紅色(平面 1)。

將中間值(例如 0.,0.,1. 和 0.5)設定為 jit.op 的標量,會得到顏色欄看起來不同的影像:

圖片描述

image

在這種情況下,忽略 alpha 通道並將紅色通道歸零。藍色平面的值是它們的一半。綠色通道(平面 2)保持不變。

要點: jit.op 中的一些數學標量使用浮點數,有些則使用整數。這取決於相關運算子(由 op 屬性定義)以及輸入矩陣的型別。本教程所有示例都使用了 char 矩陣,因此在新增時可以使用整數(任何浮點數都將被截斷,因為矩陣資料保留 0-255 範圍內的整數)。

如果使用 float32 矩陣作為輸入,就需要新增浮點數。同樣,用 char 乘以浮點標量的矩陣也可以(240 * 0.5 = 120,整數)。但是,由於 jit.op 輸出的矩陣仍然是 char 矩陣(參見下面的註釋),因此仍然只能獲得 0-255 範圍內的值。

如果你嘗試使用標量值,容易看到某些顏色條消失或與相鄰條形圖合併。這是因為顏色條都設定為範圍相似的標準顏色值。如果一次只顯示一個通道(設定一個平面為 1,其餘為 0),頂部七個條形中的四個將顯示顏色。

本教程中只演示了 + 和 * 運算子,實際上 jit.op 物件可以執行許多其他的數學運算。運算子的完整列表請檢視參考文件,或雙擊 jit.op 幫助檔案中的 p op_list 子 patch。

調整大小

建立 jit.pwindow 物件時,它預設顯示為 80 畫素寬,60 畫素高。它可以像 Max 中的許多 UI 物件一樣改變大小。如果要精確地指定大小,可以使用 inspector 或向其傳送尺寸訊息,後跟寬度和高度(以畫素為單位):

圖片描述

更改 ``jit.pwindow`` 的大小

如果給某個固定尺寸(畫素)的 jit.pwindow 傳送不同的尺寸的矩陣,jit.pwindow 會按自身的大小來縮放傳入的矩陣。如果將非常小的矩陣傳送到非常大的 jit.pwindow ,會做畫素化處理(影像中顏色完全相同的矩形區域)。如果傳送大矩陣到一個小的 jit.pwindow,可能會丟失不同程度的細節。

要點:在上面的示例中,含有顏色塊的 jit.matrix 的大小(由其維度決定)為 320 x 240 個單元格,planecount 為 4,型別是 char。jit.op 物件(以及大多數 Jitter 物件)識別出資訊並自動適配計算、輸出相同規格的矩陣。

如果要更改 jit.matrix 的大小, jit.op 將立即識別變化並重新適應。jit.pwindow 也適配傳入的矩陣,但方式略有不同。如果輸入矩陣小於其自身的尺寸,則使用重複資料填充所有畫素。(這會產生前一段中描述的畫素化效果)如果輸入矩陣大於其自身的維度,則必須忽略某些資料,只顯示它可以顯示的內容。因此,即使教程 patch 中的 jit.pwindow跟輸入矩陣的大小不同,它們也會盡可能適配 jit.op 矩陣。

最後一個例子中的 jit.pwindow 儘可能顯示了 jit.op 輸出的整個矩陣,但它必須忽略所有其他行和列,以使其接收的 320x240 矩陣適合自己的 160x120 顯示區域。

小結

jit.op 對矩陣上的所有資料進行數學運算。可以分別對矩陣單元格中的整體或每個平面執行計算。jit.op 的 op 屬性決定要執行什麼數學運算,可以輸入 @op [operator] 屬性引數,或者由左入口中的 op [operator] 訊息提供。

對於多平面矩陣(例如彩色圖片和影片),可以給出運算子列表(例如,op pass * * *)來指定每個平面的操作,並且可以為每個平面提供不同的標量值。在教程 11 中我們會看到如何使用矩陣來代替簡單的標量。

你可以使用 size [width] [height] 訊息設定 jit.pwindow 的大小。jit.pwindow 將盡可能適應接收到的矩陣的大小。如果輸入矩陣小於其維度,它將複製資料;如果輸入矩陣大於其自身維度,它將忽略某些資料。大多數 Jitter 物件都儘量適應它們接收的矩陣的維度、型別和平面數量。對 jit.op 而言,它沒有自己的維度,所以它自動適配傳入的矩陣大小。



作者:Kidult
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/200/viewspace-2816305/,如需轉載,請註明出處,否則將追究法律責任。

相關文章