Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf ·...

102
Jitter入門マニュアル 赤松 正行

Transcript of Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf ·...

Page 1: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

Jitter入門マニュアル赤松 正行

Page 2: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

目次

はじめに ..................................................................................................................1

第1部 Jitterの基礎................................................................................................201 プログラミングの基本..................................................................................................................................... 202 右から左への順序............................................................................................................................................. 403 ムービーの表示................................................................................................................................................. 604 ムービーの再生............................................................................................................................................... 1005 メッセージの処理........................................................................................................................................... 1106 ユーザ・インターフェース........................................................................................................................... 1407 初期設定と設定保存....................................................................................................................................... 1608 アトリビュート............................................................................................................................................... 1809 メッセージの解釈........................................................................................................................................... 1910 画像エフェクト............................................................................................................................................... 2011 マトリックス................................................................................................................................................... 22

第2部 Jitterの応用..............................................................................................2401 ムービーの再生............................................................................................................................................... 2402 ムービーのループ指定................................................................................................................................... 2603 ムービー再生位置の指定............................................................................................................................... 2704 ムービー再生位置の取得............................................................................................................................... 2805 マウス情報の取得........................................................................................................................................... 3006 フルスクリーン表示....................................................................................................................................... 3107 表示領域の指定............................................................................................................................................... 3208 画像の変形....................................................................................................................................................... 3409 画像の色調整................................................................................................................................................... 3610 画像のモノクローム化................................................................................................................................... 3711 カラースペースの変換................................................................................................................................... 3812 画像のモザイク化........................................................................................................................................... 4013 映像の残像効果............................................................................................................................................... 4114 QuickTimeエフェクト..................................................................................................................................... 4215 画像のサンプリング....................................................................................................................................... 4416 映像のディレイ............................................................................................................................................... 4517 画像の貼り付け............................................................................................................................................... 4618 画像の重ね合わせ........................................................................................................................................... 4819 クロスフェード合成....................................................................................................................................... 4920 マスク合成....................................................................................................................................................... 5021 クロマキー合成............................................................................................................................................... 5122 図形の描画....................................................................................................................................................... 5223 テキストの描画............................................................................................................................................... 5424 特定色の検出................................................................................................................................................... 5525 動きの検出....................................................................................................................................................... 5726 ファイルへの保存........................................................................................................................................... 5927 ビデオ機器からの画像入力........................................................................................................................... 6128 ビデオ機器のコントロール........................................................................................................................... 6329 ビデオ機器への画像出力............................................................................................................................... 6530 音量による画像処理....................................................................................................................................... 6731 波形の描画....................................................................................................................................................... 6832 3次元描画の基本............................................................................................................................................. 7033 3次元物体の操作............................................................................................................................................. 7234 3次元物体のマウス操作................................................................................................................................. 74

i

Page 3: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

目次

35 複数の物体の描画........................................................................................................................................... 7636 カメラの視界................................................................................................................................................... 7837 テクスチャーの適用....................................................................................................................................... 7938 物体の透明表現............................................................................................................................................... 8139 モデリング・データの利用........................................................................................................................... 8340 3次元空間の背景............................................................................................................................................. 8541 3次元空間での画像表示................................................................................................................................. 8742 3次元空間でのクロスフェード..................................................................................................................... 8843 GPUによる画像処理....................................................................................................................................... 8944 2次元テキストの描画..................................................................................................................................... 9145 3次元テキストの描画..................................................................................................................................... 9246 日本語の表示................................................................................................................................................... 9347 映像のネットワーク転送............................................................................................................................... 9548 映像のストリーミング配信........................................................................................................................... 97

おわりに ................................................................................................................99

ii

Page 4: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

はじめに

はじめに

音楽制作や音響処理のためのプログラミング環境には、いくつかのソフトウェアがありますが、その中でもMax/MSPが最も使い易く、拡張性が高いことは多くの人が認めるところでしょう。インタラクティブなライブ・パフォーマンスやインスタレーション、あるいはレコーディングや作曲などの先進的な分野でMax/MSPが活用されてきました。そして、2002年に登場したMaxの機能拡張であるJitterによって、リアルタイム画像処理を中心とした多種多様な映像表現が可能になりました。Maxだけでもムービーや外部機器制御といったマルチメディア機能を備えていますが、Jitterが加わることでMax/MSPは、映像と音響を同時に扱うことができる最強の開発環境になったわけです。その応用範囲は極めて広く、多くの人々によって革新的なアプローチが続けられています。

さて、Jitterは、マトリックス(行列)処理により大規模なデータ集合を効率よく処理できる、優れた機能を持ったライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨大な機能に翻弄されて混乱状態に陥りかねません。そこで、Jitterプログラミングへの導入として本書が企画されました。第1部では、Maxとしてのプログラミング方法を含めて、Jitterを使ってどのようにプログラミングを行うかという基礎的な概念や方法を説明しています。第2部では、Jitterの様々な機能の中から、画像処理において頻繁に用いるであろうプログラミング例を紹介しています。これらは、Jitterへの最初の取り組みとして、充分に理解すべき事柄ばかりです。そして、本書をスタートラインとして、さらに深遠なJitterの世界へと探求を続けられることを願っています。

なお、本書掲載のパッチは、Mac OS X 10.4.2、Max/MSP 4.5.5、Jitter 1.5.1で動作を確認をしています。

2005.09.09

赤松正行

1

Page 5: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

第1部 Jitterの基礎

第1部 Jitterの基礎

Jitterは、プログラミング言語であるMaxの機能を拡張する追加ライブラリです。従って、Jitterを活用するためには、Maxによるプログラミング方法を習得する必要があります。ここでは、Maxのプログラミング方法に触れながら、Jitterの基本的な使い方を見ていきます。

01 プログラミングの基本

Maxでは、いくつかのオブジェクトを並べ、オブジェクト同士をパッチ・コードで繋ぐことでプログラミングを行います。オブジェクトは何らかの機能を持ち、その中にはマウスで操作したり、情報を表示するユーザ・インターフェース・オブジェクトもあります。このようなオブジェクトとパッチ・コードの集まりをパッチ(またはパッチャー)と呼びます。

オブジェクトをクリックするといった何らかのイベントに応じて、あるオブジェクトからメッセージが出力され、パッチ・コードを伝わって次のオブジェクトに送られます。メッセージを受け取ったオブジェクトは、何らかの処理を行い、さらに他のオブジェクトにメッセージを送ります。このようにして、オブジェクトからオブジェクトへとメッセージが流れていくことで、全体の処理が進行します。なお、オブジェクトの動作は、アーギュメントと呼ばれる数値や文字列によって指定することができ、メッセージによって動作を変更することもできます。また、オブジェクトからメッセージを出力する部分をアウトレットと呼び、メッセージを受け取る部分をインレットと呼びます。

次の例は足し算を行うパッチですが、上部にある3というメッセージ・ボックスをクリックすれば、その数値のメッセージが出力され、パッチ・コードを伝わって+オブジェクトに送られます。数値を受け取った+オブジェクトは、アーギュメントとして与えられた 10を足し算して、その結果を出力します。そして、最後にナンバー・ボックスが受け取った数値を表示すれば、パッチの処理は完了です。パッチ・コードを伝わるメッセージが目に見えるわけではありませんが、Maxはこのような仕組みでパッチを実行しています。

パッチと処理の流れ

マウス・クリックされた!

「3」というメッセージを送る

「3」に「10」を加算する

「13」というメッセージを送る

「13」を表示する

オブジェクト(メッセージ・ボックス)

オブジェクト(+オブジェクト)

オブジェクト(ナンバー・ボックス)

パッチ・コード

パッチ・コード

アウトレット

インレット

インレット

アウトレット

2

Page 6: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

01 プログラミングの基本

Maxの基本的なメッセージには、以下の種類があります。

intメッセージ 整数(小数点以下を持たない数値) 例: 100、 -25、 0floatメッセージ 実数(小数点以下を持つ数値) 例: 3.14、 -0.25、 0.0symbolメッセージ シンボル、英単語などの文字列 例: read、 start、 stoplistメッセージ 複数の数値から成るメッセージ 例: 0 1 2、 10 -0.5、 0.1 0.2 100bangメッセージ オブジェクトを動作させる特別なメッセージ 例: bang

また、これらを組み合わせたメッセージもあります。例: read myfamily.mov、 jump 200.36、 start 0

Maxのメッセージが流れるパッチ・コードは黒い実線になります。これに対して、MSPが処理する音響データであるシグナルが流れるパッチ・コードは黒と黄色の模様で描かれ、Jitterが処理する画像データであるマトリックスが流れるパッチ・コードは緑色の太線になります。また、同じJitterでも、OpenGLで用いるテクスチャーが流れるパッチ・コードは青色の太線です。

3

Page 7: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

02 右から左への順序

02 右から左への順序

Maxプログラミングにおいて重要な事柄は、メッセージは「右から左への順序(right-to-left order)」で処理される、ということです。例えば、 +オブジェクトは2つのインレットを持っていますが、「 3 + 4」という計算をしたい場合には、まず右のインレットに 4を送った上で、左のインレットに 3を送る必要があります。逆の順番では正しい計算が行われません。一部の例外を除いて、ほとんどのオブジェクトは右(2番目およびそれ以降)のインレットにメッセージを受け取った場合は、その内容をオブジェクト内部に格納するだけです。そして左のインレット、すなわち第1インレットにメッセージを受け取った時に実際の処理を行い、処理結果をアウトレットから出力します。従って、インレットにメッセージを送るには、右から左への順序で送らなければなりません。

インレットの右から左へとメッセージを送る

同じように、複数のアウトレットを持つオブジェクトであれば、右から左の順序でアウトレットからメッセージを出力します。例えば、 unpackオブジェクトは、受け取った数字のリストを分解し、個別の数字として各アウトレットから出力します。出力は瞬間的に行われるので、同時に出力されているように見えます。しかし、

printオブジェクトによるMaxウィンドウの表示を見れば、右のアウトレットから先に出力されていることが分かります。

アウトレットの右から左へとメッセージが出力される

4

Page 8: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

02 右から左への順序

ひとつのアウトレットから複数のオブジェクトのインレットにパッチ・コードが繋がれている場合も、メッセージが送られる順序は右から左への順序となります。次の例では、メッセージ・ボックスをクリックすれば、 +オブジェクトにも *オブジェクトにも 3というメッセージが送られます。ただし、最初に右側にある *オブジェクトにメッセージが送られ、一連の処理が完了した後、すなわち右側のナンバー・ボックスに表示し、 printオブジェクトがMaxウィンドウに表示した後に、左側の+オブジェクトにメッセージが送られます。このことは、Maxウィンドウの表示で確認できます。なお、複数のオブジェクトの左右の位置が同じであれば、より下にあるオブジェクトから順にメッセージが送られます。これは「下から上への順序(bottom-to-top order)」として覚えておくと良いでしょう。

右のオブジェクトから左のオブジェクトへとメッセージが送られる

このように、インレットについてもアウトレットについても、そしてオブジェクトの並びについても、メッセージの流れは右から左への順序となるのが、Maxプログラミングの原則です。

5

Page 9: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

03 ムービーの表示

03 ムービーの表示

それでは、QuickTimeムービーを再生して表示する簡単なパッチを作ってみましょう。まずは、FileメニューのNewから「Patcher」を選んで、新しいパッチ・ウィンドウを開きます。このウィンドウでパッチを作成・編集し、実行することになります。

パッチ・ウィンドウのタイトル・バーの下にはオブジェクト・パレットがありますので、一番左側にあるアイコンをクリックし、次にパッチ・ウィンドウの空白部をクリックしましょう。これで、オブジェクト・ボックスが作られ、「New Object」というリストが現れます。このリストの左側はオブジェクトの分類ですが、この中から「 Jitter QuickTime」をクリックして選択します。次いで、リストの右側にJitterのQuickTime関係のオブジェクトが一覧表示されますので、この中から「 jit.qt.movie」をダブル・クリックします。これでオブジェクト・ボックスに「 jit.qt.movie」という文字が入力されますので、enterキーを押せば新しいオブジェクトが作られます。 jit.qt.movieオブジェクトはQuickTimeムービーを再生する機能を持つオブジェクトです。

オブジェクト・ボックスの作成

なお、New Objectリストはオブジェクト名を入力するための補助ツールなので、慣れればオブジェクト・ボックスに直接「 jit.qt.movie」とタイプし、enterキーを押して確定しても構いません

オブジェクト・ボックス

6

Page 10: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

03 ムービーの表示

次に、オブジェクト・パレットの中程にあるネコのアイコンをクリックし、パッチ・ウィンドウの空白部をクリックすれば、黒い長方形が現れます。これは jit.pwindowと呼ばれるオブジェクトで、ムービーなどの画像を表示する機能を持っています。さらに、オブジェクト・パレットの左から2番目にあるメッセージ・ボックスを作り、「 read」とタイプして確定します。また、オブジェクト・パレットの4番目にある Button(ボタン)オブジェクトも作ります。

jit.pwindowオブジェクト、メッセージボックス、 Buttonオブジェクトの作成

以上で、ムービーを表示するのに必要なオブジェクトが揃いましたので、次にオブジェクトをパッチ・コードで繋いでいきます。まず、メッセージ・ボックスの左下のアウトレットをクリックし、そのままマウスをドラッグすると、マウスの動きに従って、黒い実線が延びていきます。そして、 jit.qt.movieオブジェクトの左上のインレットまでマウス・カーソルを動かして、マウス・ボタンを離せば、2つのオブジェクトがパッチ・コードで結ばれます。

アウトレットからインレットへのパッチ・コードの接続

メッセージ・ボックス

Buttonオブジェクト

jit.pwindowオブジェクト

7

Page 11: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

03 ムービーの表示

同じようにして、 Buttonオブジェクトから jit.qt.movieオブジェクトへ、 jit.qt.movieオブジェクトから jit.pwindowオブジェクトへとパッチ・コードを繋ぎます。これで、必要なパッチ・コードの接続は完了しました。

QuickTimeムービーを表示するパッチ

パッチを実行するためには、タイトル・バーの右端にある長円形のボタンをクリックします。これで、オブジェクト・パレットが消え、パッチ・ウィンドウはエディット・モードから実行モードにかわります。Viewメニューの「Edit」を選ぶことでも、エディット・モードと実行モードを切り替えることができます。

次に、 readメッセージ・ボックスをクリックすれば、ファイル選択ダイアログが開かれますので、適当なムービー・ファイルを選択します。そして、 Buttonオブジェクトをクリックすれば、 jit.pwindowオブジェクトにムービーが表示されます。表示された映像は静止していますが、素早く連続的に Buttonオブジェクトをクリックすれば、映像が動いて見えるはずです。

ここでの処理は、 readメッセージを送ることで、 jit.qt.movieオブジェクトにムービーを読み込むことを指示しています。そして、 Buttonオブジェクトをクリックした時には、 bangという特別なメッセージが出力され、 bangを受け取った jit.qt.movieオブジェクトはムービーの映像を出力します。そして、映像を受け取った jit.pwindowオブジェクトが映像を表示することになります。

QuickTimeムービーの画像が表示されたパッチ

8

Page 12: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

03 ムービーの表示

ところで、 jit.qt.movieオブジェクトから jit.pwindowオブジェクトへのパッチ・コードは緑色になっていますが、このパッチ・コードは Jitterオブジェクトが扱うマトリックス・メッセージが流れることを示しています。マトリックスとは行列の意味で、ここでは映像の1フレーム分の画像データのことだと考えて良いでしょう。これに対して、黒いパッチ・コードは bang、整数、実数、シンボル、リストといったMaxのデータが流れます。

9

Page 13: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

04 ムービーの再生

04 ムービーの再生

さて、何度もクリックするのは面倒なので、自動的に jit.qt.movieオブジェクトに bangを送るようにパッチを改良することにします。このためには、もう一度、タイトル・バー右端のアイコンをクリックして、パッチが編集できるエディット・モードにします。エディット・モードではオブジェクト・パレットが表示されますので、左から5番目にある×印のような Toggleオブジェクトをパッチに加えます。さらに、オブジェクト・ボックスをもう一つ作り、「 metro 10」とタイプして確定します。 metroと 10との間には、半角のスペースを入れます。次に、 Toggleオブジェクトから metroオブジェクトにパッチ・コードを繋ぎ、 metroオブジェクトから jit.qt.movieオブジェクトに繋ぎます。

QuickTimeムービーを連続的に再生するパッチ

これでパッチが改良できましたので、実行モードにして試してみましょう。 Toggleオブジェクトをクリックしてチェック・マークを付ければ、自動的にムービーが再生されるはずです。もう一度、 Toggleオブジェクトをクリックしてチェック・マークを外せば、ムービーの再生は止まります。

Toggleオブジェクトは、クリックしてチェック・マークが付いた時には1を、チェック・マークが消えた時には 0を出力します。一方、 metroオブジェクトはメトロノームのようなオブジェクトで、 1を受け取った時に動作を開始し、一定の時間間隔で bangメッセージを出力します。 0を受け取れば、動作は停止し、 bangメッセージを出力しなくなります。つまり、 Toggleオブジェクトをクリックしてチェック・マークを付けると 1が出力され、 metroオブジェクトが動作を開始し、定期的に bangメッセージを jit.qt.movieオブジェクトに送ります。そこで、 jit.qt.movieオブジェクトは連続的にムービーの映像を出力し、 jit.pwindowオブジェクトではムービーが再生されて見えるというわけです。

なお、 metroオブジェクトが動作する時間間隔はアーギュメントで指定しており、10ミリ秒(0.01秒)ということになります。ただし、コンピュータの処理が追いつかない場合は、時間間隔が自動調整されて長くなります。実際の時間間隔は、後述する jit.fpsguiオブジェクトで確認することができます。

10

Page 14: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

05 メッセージの処理

05 メッセージの処理

MaxやJitterのプログラミングでは、どのようなオブジェクトを用いるかだけでなく、どのようにメッセージを用いるかが重要になります。そこで、ここではメッセージを取り扱う便利な方法をいくつか紹介しておきましょう。

QuickTimeムービーを再生する jit.qt.movieオブジェクトは、様々なメッセージに対応しています。例えば、 rateメッセージは、そのアーギュメントによってムービーの再生速度を指定します。つまり、「 rate1.0」なら標準の再生速度であり、「 rate 0.5」なら半分の速度、「 rate -2.0」なら逆方向の2倍速となります。このように、特定の再生速度を指定する場合は、メッセージ・ボックスを利用するのが良いでしょう。

再生速度を指定するメッセージ・ボックス

11

Page 15: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

05 メッセージの処理

一方、連続的に再生速度を変化させたい場合には、フロート・ナンバー・ボックス(オブジェクト・パレットの左から7番目)を用い、その出力を「 rate $1」というメッセージ・ボックスを通じて jit.qt.movieオブジェクトに送ります。 $1は特別な記号で、受け取ったメッセージに置き換えられます。例えば、フロート・ナンバー・ボックスを 1.5とした場合は、 rate 1.5というメッセージとなって jit.qt.movieオブジェクトに送られます。

同じような用途には prependオブジェクトを用いることができます。 prependオブジェクトは、アーギュメントのシンボルを受け取ったメッセージの前に付加します。従って、 1.5というメッセージを prepend rateというオブジェクトに送れば、 rate 1.5というメッセージが出力されます。

フロート・ナンバー・ボックスによる再生速度の指定

12

Page 16: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

05 メッセージの処理

メッセージには2つ以上のアーギュメントが必要な場合があります。 jit.qt.movieオブジェクトが出力する画像の解像度は dimメッセージで設定しますが、 dim 160 120のように横と縦の2つのピクセル数を指定しなければなりません。これらのピクセル数をナンバー・ボックスで設定するには、それぞれの出力を packオブジェクトを使ってリストにした上で、 dim $1 $2のメッセージ・ボックスに送るか、 prepend dimオブジェクトに送ることになります。

dimメッセージで画像解像度を指定

上記のパッチでは、縦の解像度を指定しただけでは実際の解像度に反映されません。これは packオブジェクトが、右から左への順序に従っているからです。一方、縦の解像度を指定した時にも解像度を変更したい場合は、

packオブジェクトの代わりに pakオブジェクトや bondoオブジェクトを用います。 pakオブジェクトや bondoオブジェクトは、どのインレットにメッセージを受け取っても、すべてのアウトレットからメッセージを出力しますので、このような用途に適しています。

pakオブジェクトの利用

13

Page 17: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

06 ユーザ・インターフェース

06 ユーザ・インターフェース

ナンバー・ボックスのように、ユーザが操作したり、何らかの情報を表示するオブジェクトを、特にユーザ・インターフェース・オブジェクトと呼びます。オブジェクト・ボックスとして用いるオブジェクトは、直接的には操作や表示ができませんので、ユーザ・インターフェース・オブジェクトではなく、ノーマル・オブジェクトと呼ばれます。

ユーザ・インターフェース・オブジェクトは、オブジェクト・パレットから作成することができます。そして、多くのユーザ・インターフェースのオブジェクトは、インスペクタを使って様々な設定を行います。インスペクタを開くには、オブジェクトをクリックして選択し、Objectメニューから「Get Info...」を選びます。インスペクタの内容はオブジェクトによって異なりますが、ナンバー・ボックスのインスペクタは次のようになっています。このインスペクタでは、ナンバー・ボックスが扱う数値の範囲を設定したり、ナンバー・ボックスの動作や外観などの設定か可能です。

ナンバー・ボックスのインスペクタ

14

Page 18: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

06 ユーザ・インターフェース

オブジェクト・パレットから分かるように、ユーザ・インターフェース・オブジェクトには多くの種類があります。例えば、再生速度をスライダーで操作するにようにすれば、直観的に分かり易くなるでしょう。ただし、水平スライダー( hsliderオブジェクト)は、整数しか扱えませんので、再生速度に適した実数に変換する必要があります。ここでは、スライダーの範囲を 401、オフセットを -200とすることで、スライダーから -200から

200までの整数が出力されるように設定し、その出力に 0.01を掛けることで -2.0から 2.0までの実数で再生速度を指定するようにしています。

スライダーによる再生速度の指定

なお、水平スライダーの他にも、垂直スライダー( vsliderオブジェクト)、多目的に使えるマルチ・スライダー( MultiSliderオブジェクト)など数多くのユーザ・インターフェース・オブジェクトがありますので、目的に応じて適切なオブジェクトを用いれば良いでしょう。

15

Page 19: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

07 初期設定と設定保存

07 初期設定と設定保存

複雑なパッチになれば、設定を手動で行うのは面倒であり、間違いが起こりがちです。そこで、パッチの自動設定を行うために、 loadbangオブジェクトが用意されています。 loadbangオブジェクトは、パッチが開いた時に bangメッセージを出力します。これを利用して、再生速度の初期値を 0.5にしたい場合は、 loadbangオブジェクトから 250というメッセージ・ボックスへ bangを送り、 250をスライダーに送るようにすれば良いでしょう。これは、スライダーのオフセットが -200なので、 250を受け取ったスライダーは、オフセットを足して 50を出力します。そして、 50に 0.01が掛けられて 0.5となり、 rateのアーギュメントが 0.5となるからです。

スライダーの初期状態の自動設定

16

Page 20: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

07 初期設定と設定保存

また、数多くの設定が必要な場合は、 presetオブジェクトが利用できます。 presetオブジェクトは、同じパッチ・ウィンドウにあるユーザ・インターフェース・オブジェクトの状態を記憶し、呼び戻すことができます。 presetオブジェクトをパッチに作成すれば、パッチを実行状態にして、shiftキーを押しながら presetオブジェクトのプリセット(マス目)のどれかをクリックします。これで、ユーザ・インターフェース・オブジェクトの状態が記憶され、プリセットには黒い点が付きます。そして、プリセットをクリックすれば、記憶した状態が呼び戻されます。プリセットは左上から順に 1、 2、 3...という番号に対応しているので、整数のメッセージを送れば、そのプリセットが呼び出されます。そこで、ここでは loadmessオブジェクトを用いて、すべてのユーザ・インターフェース・オブジェクトの初期設定を行うようにしています。 loadbangオブジェクトは、パッチが開いた時に bangメッセージを出力しますが、 loadmessオブジェクトはアーギュメントで指定したメッセージを出力します。

presetオブジェクトによるユーザ・インターフェースのプリセット

17

Page 21: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

08 アトリビュート

08 アトリビュート

オブジェクト・ボックスでは、アーギュメントによってオブジェクトの内部状態の初期設定ができます。例えば、 jit.qt.movieオブジェクトなら、2つの整数のアーギュメントで出力する画像の解像度を指定します。このようなアーギュメントはMaxでもMSPでも用いられますが、Jitter独自の方法がアトリビュートによる指定です。アトリビュートはアトリビュート名で示すオブジェクトの内部状態のことです。オブジェクト・ボックスでは、 @に続けてアトリビュート名を指定し、スペース(空白文字)で区切ってアトリビュートの値を指定します。例えば、 jit.qt.movieオブジェクトの再生速度を表すアトリビュートは rateなので、 @rate 0.5とすれば、再生速度として半速を指定したことになります。アトリビュートはいくつでも指定することができ、任意の順番で並べることができます。

オブジェクト・ボックスでのアトリビュートの指定は初期状態を設定するだけなので、その後にメッセージを送って、アトリビュートの値を変更しても構いません。また、メッセージによってアトリビュートを読み出すこともできます。 rateアトリビュートの場合は、 rateメッセージで値を変更し、 getrateメッセージで値を読み出します。 getrateメッセージを受け取った jit.qt.movieオブジェクトは第2アウトレットから、 rate1.0といったメッセージを出力します。

アトリビュートの指定と読み出し

18

Page 22: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

09 メッセージの解釈

09 メッセージの解釈

jit.qt.movieオブジェクトの第2アウトレットからは、様々なアトリビュートの値が出力されます。すでに紹介したように、 getrateメッセージに対しては、 rate 1.0といった再生速度を表すメッセージが出力され、 getdimメッセージに対しては、 dim 320 240といった画像解像度を示すメッセージが出力されます。そこで、アトリビュートの値に応じた処理を行うには、出力されたメッセージを解釈する方法が必要になります。これらの出力メッセージの最初にはアトリビュート名がありますので、 routeオブジェクトを使うことでメッセージを振り分けることができます ÅBrouteオブジェクトのアーギュメントには複数のシンボルを指定することができ、指定したシンボルの数だけのアウトレットが作成されます。そして、受け取ったメッセージの最初の要素がアーギュメントに一致すれば、対応するアウトレットから最初の要素(一致したシンボル)を除いた残りのメッセージが出力されるようになっています。

routeオブジェクトによるメッセージの振り分け

このパッチでは、 rate 1.0といったメッセージを受け取った場合には、 routeオブジェクトの第1アウトレットから 1.0が出力され、メッセージ・ボックスに表示されます。同じく、 dim 320 240といったメッセージを受け取った場合は、 routeオブジェクトの第2アウトレットから 320 240というメッセージが出力されますが、このリストを unpackオブジェクトで個々の数値に分けてメッセージ・ボックスに表示しています。 unpackオブジェクトは、 packオブジェクトの逆の機能を持ち、リストを受け取って、その要素の数値を各アウトレットから出力します。

なお、「 getrate,getdim」のように、メッセージをカンマ( ,)で区切って並べると、それぞれのメッセージが順に送られることになります。つまり、最初に getrateメッセージが送られ、続いて getdimメッセージが送られます。

19

Page 23: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

10 画像エフェクト

10 画像エフェクト

次に、QuickTimeムービーに画像エフェクトを掛けてみましょう。先に紹介したムービー再生パッチでは、

jit.qt.movieオブジェクトがムービーを再生して画像データを送り出し、それを受け取った jit.pwindowオブジェクトが画像を表示していました。そこで、これらのオブジェクトの間に、画像エフェクトを行うオブジェクトを入れれば良いことになります。すでに作成したパッチ・コードを削除するには、それをクリックして選択し、 deleteキーを押します。そして、新しいオブジェクトを作成し、新たにパッチ・コードを繋ぎ直せば良いわけです。

まず、画像の大きさを特定するために、 jit.qt.movieオブジェクトのアーギュメントで横160ピクセル、縦120ピクセルを指定します。また、表示を行う jit.pwindowオブジェクトもインスペクタで横160ピクセル、縦120ピクセルに設定します。そして、映像エフェクトとして、画像のエッジ検出を行う jit.robcrossオブジェクトと、画像の回転を行う jit.rotaオブジェクトを作成します。さらに、検出するエッジの閾値を指定するthreshアトリビュートと、回転角度をラディアン単位で指定する thetaアトリビュートを、ナンバー・ボックスによって設定できるようにしています。また、 jit.rotaオブジェクトのオブジェクト・ボックスでは、回転の中心位置を指定する anchor_xと anchor_yのアトリビュートの初期値を設定しています。これは、画像の中心点に相当します。

画像にエフェクトをかける

ここでは、それぞれのオブジェクトから出力される画像を jit.pwindowオブジェクトに表示していますので、どのように画像が変化しているかが把握できます。このように、 Jitterオブジェクトでは、インレットに画像を受け取り、何らかの処理を行ってアウトレットから出力します。これは、最初に説明したMaxでのメッセージとオブジェクトの処理と何ら変わりありません。JitterはMaxの拡張オブジェクトであり、Maxと同じように、Jitterは画像を処理すると考えて良いでしょう。

20

Page 24: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

10 画像エフェクト

なお、このパッチでは最終的に表示する画像サイズに合わせてムービーの画像サイズを指定しています。しかし、回転などの画像エフェクトでは、最終画像より大きなサイズの画像を用いて処理するほうが、美しい結果が得られます。また、 interpアトリビュートなどで指定できるインターポレーション(補間)を有効にすれば、好ましい結果が得られる場合が多いでしょう。ただし、いずれも処理に必要なCPUパワーが増大しますので、目的と環境に応じて設定する必要があります。

21

Page 25: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

11 マトリックス

11 マトリックス

これまで Jitterオブジェクトが処理するデータを画像と呼んでいましたが、実際にはJitterが扱うデータはマトリックス(matrix)と呼ばれています。マトリックスには画像を格納することができますが、画像だけに限定されるわけではありません。そして、より高度な処理を行うには、マトリックスについての理解が不可欠になりますので、ここではマトリックスについて簡単に触れておきます。

まず、マトリックスは名前を持ち、マトリックス名で区別されます。マトリックス名はユーザが指定することができますが、省略した場合は他のマトリックスと重複しない名前が自動的に付けられます。マトリックスは、日本語では「行列」と呼ばれ、数値を規則正しく並べたデータ集合のことです。画像の場合は、縦と横のピクセル数で指定する2次元のデータになりますが、このようなマトリックスの大きさを、Jitterではディメンジョン(dimension)と呼びます。例えば、VGA画像は横640個、縦480個の画素から構成されますので、この場合のディメンジョンは640×480で、ディメンジョン数は2となります。Jitterでは32次元までのデータを扱うことができます。

マトリックスを構成する要素はセル(cell)と呼ばれ、画像ではピクセルに相当します。また、セルを構成するデータの数をプレーン(plane)と呼びます。これはRGB形式の画像ピクセルで言えば、赤、緑、青の3つのプレーンを持っていることになります。ただし、Jitterが扱うカラー画像は、RGBにアルファ・チャンネルを加えたARGB形式が用いられ、プレーン数は4となっています。

さらに、Jitterでのデータのタイプは、 char(8ビットの符号なし整数)、 long(32ビットの符号付き整数)、

float32(32ビットの浮動小数点実数)、 float64(64ビットの浮動小数点実数)のいずれかになります。ビット数が多いほど、より精度の高い演算ができますが、処理時間が多くかかるようになります。

マトリックスを生成するには、 jit.matrixオブジェクトを用い、次のようなアーギュメントでマトリックスを定義します。

jit.matrixオブジェクトによるマトリックスの定義

例えば、 jit.matrix mydata 1 char 10 20 5、とした場合には、 mydataというマトリックス名で、

char タイプのデータを 1 プレーンで、 10 × 20 × 5 の3 次元のマトリックスを生成し、保持します。

jit.matrixオブジェクトは bangを受け取ると、アウトプットからマトリックスを出力しますが、これは、

printオブジェクトでMaxウィンドウに表示すれば分かるように、「 jit.matrix mydata」というメッセージです。つまり、マトリックスそのものはJitterの内部に格納されており、その名前が他のオブジェクトに伝えられると考えれば良いでしょう。

マトリックス名

プレーン数

データ・タイプ

ディメンジョン

22

Page 26: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

11 マトリックス

マトリックスの内容は直接確認することはできませんが、 jit.printオブジェクトや jit.matrixinfoオブジェクト、そしてオブジェクト・パレットにある jit.fpsguiオブジェクトを使って確認することができます。特に、 jit.fpsguiオブジェクトは1秒あたりに処理されるフレーム数(fps)を表示できますので、処理速度を把握するのに便利です。

マトリックスの確認

また、これまで見てきたムービー再生のパッチでは、マトリックスを生成したり、マトリックス名を指定していないように見えるかもしれません。しかし、実際には、 jit.qt.movieオブジェクトが重複しない名前を持ったマトリックスを生成し、ムービーの画像をマトリックスに収めて、そのマトリックスの名前をアウトレットから出力します。そして、そのマトリックス名を受け取ったオブジェクトは、名前で指定されるマトリックスのデータを処理して、エフェクトをかけたり、画面に表示しているわけです。

23

Page 27: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

第2部 Jitterの応用

第2部 Jitterの応用

Jitterのオブジェクトの機能を理解することも大切ですが、それだけでは何もできません。実際には、どのようなオブジェクトを組み合わせて、どのようにメッセージを処理するかが重要になります。ここでは、Jitterを用いた映像処理で多用されるであろう典型的なプログラミング例を紹介していきます。

01 ムービーの再生

QuickTimeムービーを再生するには、 jit.qt.movieオブジェクトを用い、 readメッセージでムービー・ファイルを読み込んだ後、 metroオブジェクトなどで定期的に bangを送ります。

ムービーの再生

jit.qt.movieオブジェクトは、 startメッセージで再生を開始し、 stopメッセージで再生を停止します。ただし、デフォルトでは autostartアトリビュートが有効になっており、ムービーを読み込むと同時に自動的に再生が始まります。自動的に再生を開始したくない場合は、「 autostart 0」メッセージを送るか、オブジェクト・ボックスのアーギュメントで「 @autostart 0」と指定します。

ムービーはデフォルトではディスクから読み出しながら再生されますが、 loadramメッセージを送ると、ムービーがメモリに読み込まれます。メモリに充分な余裕があり、スムースな再生を行いたい場合は、ムービーをメモリに読み込めば良いでしょう。

24

Page 28: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

01 ムービーの再生

通常ムービーは再生速度に従って再生されますが、 framedumpメッセージを送ると、再生速度とは無関係に、可能な限り速く全ての画像フレームを順次出力します。これは、非リアルタイムに映像エフェクトをかけて、新しいムービーとして保存するような用途に向いています。

なお、 jit.qt.movieオブジェクトはQuickTime VRやMacromedia Flashを含むムービーの再生だけでなく、ムービーやトラックの作成や編集、ムービーの保存、他の形式でのインポートやエクスポート、エフェクトの適用、ビデオ出力など多彩な機能を持っています。

25

Page 29: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

02 ムービーのループ指定

02 ムービーのループ指定

ムービーの特定の範囲をループ再生したい場合は、 jit.qt.movieオブジェクトに loopメッセージでループを指定し、 loopstartメッセージと loopendメッセージでループする範囲を指定します。

ムービーのループ指定

loopメッセージのアーギュメントが、 0であればループ再生を行わず、 1であればループ再生を行います。また、 2の場合は正再生と逆再生を繰り返す往復ループ(palindrome)となります。ただし、デフォルトではループ再生するようになっています。そして、 loopstartメッセージのアーギュメントでループの開始位置を、

loopendメッセージのアーギュメントでループの終了位置を指定します。また、開始位置と終了位置の2つの数値を伴う looppointsメッセージも利用できます。

ループする範囲を指定する数値はQuickTimeのタイム・スケールに基づいて表されます。タイム・スケールはムービー作成時に設定され、ムービーによって異なります。そこで、 jit.qt.movieオブジェクトに

gettimescaleメッセージを送ることによって、ムービーのタイム・スケールが得られます。また、ムービーの時間的な長さは getdurationメッセージで得ることができ、この長さもタイム・スケールに基づいた数値です。例えば、タイム・スケールが 600であれば、1秒を600とする単位で時間が表されます。ムービーの長さが4800であれば、ムービーの再生時間は4800÷600=8秒になります。

このパッチでは、ループ範囲を指定するために rsliderオブジェクト(範囲指定できるスライダー)を用います。そして、ムービーの時間長をアーギュメントとする sizeメッセージを送って、 rsliderオブジェクトの範囲を設定しています。これで、どのようなムービーを開いても、そのムービーの長さに従って rsliderオブジェクトが動作します。

26

Page 30: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

03 ムービー再生位置の指定

03 ムービー再生位置の指定

ムービーを特定の位置から再生したい場合は、 jit.qt.movieオブジェクトに対して、時間で再生位置を指定する timeメッセージか、フレーム数で再生位置を指定する frameメッセージを用います。また、現在の位置から相対的にフレーム数だけ再生位置を移動させるには、 jumpメッセージが利用できます。

ムービー再生位置の指定

timeメッセージで指定する再生位置は、ループ範囲と同じくQuickTimeのタイム・スケールで表します。 frameメッセージや jumpメッセージは再生位置をフレーム数で指定します。ムービーに含まれるフレーム数は、 jit.qt.movieオブジェクトに getframecountメッセージを送って得ることができます。ムービーの最初のフレーム番号は 0であり、最後のフレーム番号は全フレーム数より 1小さい数値となります。このパッチでは、 metroオブジェクトと randomオブジェクトを使って、1秒ごとにランダムに再生位置を変えています。

27

Page 31: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

04 ムービー再生位置の取得

04 ムービー再生位置の取得

ムービーを再生している現在位置を知るには、 jit.qt.movieオブジェクトに gettimeメッセージを送ります。これにより、 jit.qt.movieオブジェクトは第2アウトレットから現在時間をアーギュメントとする timeメッセージを出力します。この現在時間はQuickTimeのタイム・スケールに基づいた時間位置です。

ムービー再生位置の取得

このパッチでは、 metroオブジェクトが一定時間毎に動作すると、「 t gettime b」オブジェクトをトリガーするようになっています。 tは triggerオブジェクトの省略形で、アーギュメントで指定したメッセージを出力します。 bは bangの略です。従って、 jit.qt.movieオブジェクトに bangを送ると同時に gettimeメッセージを送っていることになります。これで jit.qt.movieオブジェクトの第2アウトレットから現在時間が得られますから、 routeオブジェクトで振り分けて、ナンバー・ボックスに再生位置を表示します。

さらに、下のチェックボックスをチェックした場合は、「ムービーを半分まで再生すれば停止する」ことになります。この処理のために、ムービーの時間長の半分の値を setメッセージで pastオブジェクトに送っています。 pastオブジェクトは setメッセージで指定した数値よりも大きな数値を受け取れば、 bangを出力しますので、 stopメッセージが jit.qt.movieオブジェクトに送られ、ムービーが停止することになります。このように、ムービーの再生位置を判断する場合は、 pastオブジェクトや >=オブジェクトを用いるのが良いでしょ

28

Page 32: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

04 ムービー再生位置の取得

う。ムービーの再生位置がなだらかに 1ずつ増加するとは限らないので、 ==オブジェクトによる条件判断は避けるべきです。

29

Page 33: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

05 マウス情報の取得

05 マウス情報の取得

ムービーなどの画像は jit.pwindowオブジェクトに表示しますが、この表示領域内でのマウスの座標やボタンの状態などの情報は、 jit.pwindow オブジェクトの第 2 アウトレットから出力されます。これは、

jit.windowオブジェクトでも同じです。

マウス情報の取得

jit.pwindowオブジェクトの領域内でマウスをクリックすれば、その第2アウトレットから mouseメッセージが出力されます。 mouseメッセージには 8つの整数が続き、順にマウス・カーソルの X座標、 Y座標、マウス・ボタンの状態、そしてcommandキーやshiftキーなどの状態を得ることができます。マウス・カーソルの座標は、表示領域の左上隅を( 0,0)とする相対座標で表され、マウス・ボタンやキーが押されている時は 1、押されていない時は 0となります。

「 idlemouse 1」というメッセージを jit.pwindowオブジェクトに送ると、マウスをクリックしていなくても、表示領域にマウス・カーソルがあれば、 mouseidleメッセージが出力されます。 mouseidleメッセージも8つの整数が続き、 mouseメッセージと同じ情報が得られます。

なお、表示領域とは関係なく、画面上の座標としてマウスの情報を得るには MouseStateオブジェクトを、アルファベットなどのキーの状態を得るには keyオブジェクトや keyupオブジェクトを利用することができます。

30

Page 34: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

06 フルスクリーン表示

06 フルスクリーン表示

画像を画面一杯に広げてフルスクリーン表示するには、 jit.windowオブジェクトを利用するのが簡単です。

jit.windowオブジェクトは独立したウィンドウとして画像を表示しますが、「 fullscreen 1」というメッセージを送れば、ウィンドウが全画面に拡大されます。

フルスクリーン表示

このパッチでは、チェックボックスにチェックを付けると、「 fullscreen 1」というメッセージが

jit.windowオブジェクトに送られ、画像がフルスクリーン表示されます。同時に「 ;max hidemenubar」というMaxアプリケーションへの特別なメッセージを送ることで、メニューバーも消去します。さらに、「 ;jitter cursor 0」という Jitterへのメッセージによって、マウス・ポインタも消去します。

また、 keyオブジェクトを利用して、 escキーを押すことで、フルスクリーン表示と通常表示とを切り替えられるようにしています。 escキーによるフルスクリーンの切り替えは、他のJitterパッチでも用いられているので、同じキーを用いるのが良いでしょう。このような配慮をしておかなければ、フルスクリーン状態ではチェックボックスが表示されないので、元へ復帰することができません。ここで用いている selオブジェクトは selectオブジェクトの省略形で、アーギュメントで指定したメッセージを受け取ると、アーギュメントの順番に対応するアウトレットから bangメッセージを出力します。

なお、 jit.windowオブジェクトに rectメッセージを送ることで、ウィンドウを任意の位置と大きさに設定することができます。これを用いてセカンド・モニタにウィンドウを移動したり、フルスクリーン表示することができます。スクリーンの大きさは screensizeオブジェクトや jit.displayオブジェクトによって取得できます。 jit.displayオブジェクトはモニタの解像度を変えたり、ミラーリングの設定なども可能です。

また、パッチ・ウィンドウ内に画像を表示する jit.pwindowオブジェクトを使ってフルスクリーン表示することも不可能ではありません。しかし、かなり面倒な処理となるので、通常は上記のように jit.windowオブジェクトを利用するのが良いでしょう。

31

Page 35: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

07 表示領域の指定

07 表示領域の指定

ムービーなどの画像を jit.pwindowオブジェクトで表示する時、画像の大きさと表示領域の大きさが異なる場合でも、大きさが合うように拡大や縮小が行われます。一方、画像の一部だけを表示したり、表示領域の一部だけに表示することも可能です。元画像のどの部分を表示するかをソース(source)領域として指定し、表示領域のどの部分に表示するかをデスティネーション(destination)領域として指定します。これらの領域の大きさが異なる場合は、自動的に拡大または縮小されます。

ソース領域とデスティネーション領域

jit.pwindowオブジェクトで、ソース領域を指定する場合は、最初に「 usesrcrect 1」メッセージを送ってソース領域を有効にしておきます。そして、4つの整数をアーギュメントとする srcrectメッセージを送ることで、ソース領域を指定します。4つの整数は、受け取った画像の左上隅を原点( 0,0)として、表示に用いる領域の矩形を取り囲むような左、上、右、下の座標で表します。

ソース領域

デスティネーション領域

32

Page 36: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

07 表示領域の指定

デスティネーション領域も同様で、まず「 usedstrect 1」メッセージを送り、デスティネーション領域を有効にし、表示領域の左上隅を原点( 0,0)として、表示する矩形の左、上、右、下の座標を表す4つの整数を伴う

dstrectメッセージを送ります。

表示領域の指定

ソース領域とデスティネーション領域は、同時に指定することも、一方だけを用いることもできます。ソース領域を指定しない場合は、受け取った画像の全体が用いられ、デスティネーション領域を用いない場合は、表示領域全域に表示されます。

33

Page 37: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

08 画像の変形

08 画像の変形

画像の拡大・縮小や移動を行うには、 jit.resampオブジェクトを用います。また、 jit.rotaオブジェクトは拡大・縮小・移動に加えて、画像の回転も可能です。

画像の変形

jit.resampオブジェクトは、 xscaleメッセージと yscaleメッセージで、画像の横方向と縦方向のスケーリングを指定します。これは縮小率に相当し、 1.0なら等倍、 1.0より小さければ拡大、 1.0より大きければ縮小になります。つまり、 0.5なら2倍、 2.0なら半分の大きさになります。また、負の値であれば左右もしくは上下が反転します。 xshiftメッセージと yshiftメッセージは画像の移動を指定し、スケーリング後の画像の幅を 1.0として、正の値なら右に移動、負の値なら左に移動します。従って、 xscaleが 1.0で、 xshiftが 0.5なら、画像は横半分だけ右に移動します。移動や縮小によって画像に空白部分が生じる場合は、 warpメッセージで 1 を指定すると、画像を繰り返して空白部分が埋められます。また、 interp_x メッセージと interp_yメッセージで横方向と縦方向の補間を指定できます。補間を行うと画像が滑らかになりますが、画像処理に必要な時間が増加します。

jit.rotaオブジェクトでは画像の回転が可能です。これは thetaメッセージで回転角度をラディアン単位で指定します。この時、回転の中心点(アンカー・ポイント)を anchor_xメッセージと anchor_yメッセージで設定することができます。 jit.rotaオブジェクトでも画像の拡大や縮小、移動が可能ですが、 jit.resampオブジェクトとは指定方法が異なります。つまり、 zoom_xメッセージと zoom_yメッセージは拡大率を指定しますので、 1.0なら等倍、 2.0なら2倍、 0.5なら半分となります。また、 offset_xメッセージと offset_yメッセージは画像の移動をアンカー・ポイントからのピクセル数で指定します。例えば、 offset_xが正の値なら右へ移動、負の値なら左へ移動します。また、画像の補間を interpメッセージで、空白部の処理モードを boundmodeメッセージで指定することができます。

34

Page 38: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

08 画像の変形

より複雑な図形変形を行うには、 3× 3の変換行列を用いる jit.mxform2dオブジェクトや、マッピング用の画像を用いる jit.reposオブジェクトなどが利用できます。 jit.mxform2dオブジェクトは歪みや遠近感も得られ、 jit.reposオブジェクトは湾曲やノイズ化など複雑な変形が可能です。

35

Page 39: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

09 画像の色調整

09 画像の色調整

画像の色を調整するには jit.brcosaオブジェクトや jit.hueオブジェクトが利用できます。

画像の色調整

jit.brcosaオブジェクトは、 brightnessメッセージで明度を、 contrastメッセージでコントラストを、 saturationメッセージで彩度を調整します。いずれもアーギュメントは実数で、 1.0なら元画像と同じであり、より大きな数値になるにつれて各要素が強調されます。 1.0より小さな数値になれば各要素が薄れますが、負の値になると逆転した効果になります。

jit.hueオブジェクトは画像の色相を回転させます。回転角度は hue_angleメッセージで指定し、これはラディアン単位でなく度数なので、 360で一周し元の色相に戻ります。色相は色を円環状に並べたもので、赤~オレンジ~黄~緑~水色~青~青紫~赤紫のように徐々に変化します。例えば、色相を90度回転させた場合は、元画像の赤は緑に、青は赤になります。

なお、画像の色を変化させるオブジェクトとしては、ARGBの値を個別または同時に一定の値で乗算および加算する jit.scalebiasオブジェクト、 4× 5の行列に基づいてARGB値を変換する jit.trafficオブジェクト、特定の色調を入れ替えることでネオン効果をもたらす jit.fluorideオブジェクト、最小値と最大値を指定してARGB値を特定の範囲にクリッピングする jit.clipオブジェクト、などがあります。

36

Page 40: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

10 画像のモノクローム化

10 画像のモノクローム化

カラー画像をモノクローム化するには、いくつかの方法が考えられますが、簡単なのは jit.rgb2lumaオブジェクトを用いることです。

画像のモノクローム化

jit.rgb2lumaオブジェクトは、ARGB形式の元画像の輝度(明るさ)に基づいて、モノクローム画像に変換します。出力されるマトリックスは1プレーンになります。 jit.rgb2lumaは、各ピクセルごとに、ARGBのプレーンによって異なる比重を掛けた上で合算することでグレースケール化を行います。比重は、 ascale、

rscale、 gscale、 bscaleのプレーンごとのアトリビュートで指定しますが、デフォルト値は順に、 0.0、

0.299、 0.587、 0.114です。

また、少々乱暴な手法ですが、ARGB形式の画像を jit.unpackオブジェクトで4つのプレーンに分け、そのうち1つのプレーンだけを用いることでも、簡易なグレースケール化が可能です。この場合は、明るさの要素として重要な緑のプレーン( jit.unpackの3番目のアウトレット)を用いるのが良いでしょう。

白と黒だけの2値化画像を得るには、グレースケール画像の各ピクセルが一定値以上であるかどうかの条件判断によって行います。このためには、 jit.opオブジェクトを用い、演算の種類を >=とします。基準となる閾値は

valアトリビュートで 0.5と指定していますが、第2インレットに数値を送ることで閾値を変更し、調整することができます。

37

Page 41: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

11 カラースペースの変換

11 カラースペースの変換

ムービーなどの画像は通常ARGB形式ですが、 jit.colorspaceオブジェクトを用いて、異なるカラースペース(色空間)に変換することができます。

カラースペースの変換

jit.colorspace オブジェクトは inputアトリビュートで、変換元となるカラースペースを指定し、 outputアトリビュートで変換後のカラースペースを指定します。 jit.colorspaceオブジェクトで指定できるカラースペースは、RGB、HSV、 HLS、 IHS、 CMYKなど数多くの種類があります。ほとんどのカラースペースの第1プレーンはアルファ・チャンネルで、第2、第3、第4プレーンに各カラースペースの要素が収められますが、CMYKは第1プレーンから順にK(ブラック)、C(シアン)、M(マゼンタ)、Y(イエロー)が収められます。

jit.colorspaceオブジェクトの本来の役割としては、RGB形式以外のカラースペースで作成された画像をJitterで扱うためにRGB形式に変換することや、Jitterで作成した画像を他のカラースペースを必要とするアプリケーションのために変換することです。ただし、それ以外の独創的な用途も考えられるでしょう。

このパッチでは、変換された画像の各プレーンを表示するとともに、変換された画像をそのまま表示しています。 jit.pwindowオブジェクトはARGB形式で画像を表示しますから、変換された画像の色調は不自然になります。しかし、これはサイケデリックな表現や、サーモグラフや衛星写真で用いられるような画像の分析などに

38

Page 42: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

11 カラースペースの変換

応用することができます。また、IHS(明度、色相、彩度)に変換し、第2プレーンの明度だけを取り出すことで、前項で説明した画像のグレースケール化も可能です。

なお、RGB形式とHSL形式の変換のための jit.rgb2hslオブジェクトと jit.hsl2rgbオブジェクトのように、いくつかのカラースペースについては専用のオブジェクトが用意されています。これらのオブジェクトでは、各要素のスケーリングやオフセットが指定でき、変換時の調整が可能になっています。

39

Page 43: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

12 画像のモザイク化

12 画像のモザイク化

画像をモザイク化するには、いくつかの方法が考えられます。まず、ムービーであれば、 jit.qt.movieオブジェクトの dimアトリビュートによって、表示する画像の大きさよりも小さい画像を出力することでモザイク表示ができます。

画像のモザイク化

このパッチの jit.pwindowオブジェクトは320×240ピクセルで表示しますが、 jit.qt.movieオブジェクトに「 dim 32 24」メッセージを送ると、ムービーの画像は32×24ピクセルで出力されます。この画像を受け取った jit.pwindowオブジェクトは表示領域に合うように画像を引き延ばしますので、結果的にモザイク化された画像が表示されることになります。

一方、320×240ピクセルとしてモザイク画像を得たい場合は、 jit.matrixオブジェクトを用います。ここで、 jit.qt.movieオブジェクトに「 dim 320 240」メッセージを送って、ムービーの出力画像を320×240ピクセルに戻しておきます。そして、この画像をディメンジョンが32×24である jit.matrixオブジェクトが受け取ると、32×24ピクセルの縮小された画像が出力されます。さらに、ディメンジョンが320×240である

jit.matrixオブジェクトは320×240ピクセルの画像を出力しますが、これは32×24ピクセルの画像を引き延ばして得られる画像であり、320×240ピクセルのモザイク画像になります。

このように、 jit.matrixオブジェクトは、そのディメンジョンによって受け取った画像を縮小または拡大して出力する機能を持っています。これをマトリックスの適合(adaptation)と呼び、 jit.matrixオブジェクトの他、多くの Jitterオブジェクトはこの機能を備えています。また、ディメンジョンだけでなく、プレーン数、データ・タイプについても適合が行われます。なお、 jit.amebaオブジェクトもモザイクに似た効果を得ることができます。

40

Page 44: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

13 映像の残像効果

13 映像の残像効果

ムービーなど動きのある映像に残像効果をつけたい場合は、 jit.slideオブジェクトや jit.wakeオブジェクトを用いることができます。また、ここでは説明しませんが、 jit.glopオブジェクトも利用できます。

映像の残像効果

jit.slideオブジェクトは画像の各ピクセルの値を徐々に変化させることによって、残像効果を得ます。ピクセル値が増加する時の変化の割合は、 slide_upメッセージで指定し、この値が大きいほど残像効果も強くなります。従って、明るい背景で黒っぽい物体が動くような映像であれば、 slide_upの値を大きくすれば良いでしょう。これとは逆に、ピクセル値が減少する時の変化の割合は、 slide_downメッセージで指定します。暗い背景で明るい物体が動く映像であれば、 slide_downの値を大きくします。

jit.wakeオブジェクトは、畳み込み演算(コンボリューション)によって、残像効果を表現します。 ffメッセージはフィード・フォワードのことで、受け取った画像を付加する割合を指定します。 fbメッセージはフィードバックを意味し、画像が残る割合を指定します。 bleedメッセージは上下左右のピクセルを畳み込む係数を指定し、この値が大きくなれば滑らかな、あるいは不明瞭な画像になります。 gainメッセージは画像のゲインのことで、この値が 1.0以上であれば画像が明るくなり、 1.0より小さければ画像は暗くなります。負の値なら明暗が反転します。そして、 normalizeメッセージは画像のノーマライズを指定します。ノーマライズを有効にすれば、画像が白く飽和するような事態を、ある程度は防ぐことができます。

41

Page 45: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

14 QuickTimeエフェクト

14 QuickTimeエフェクト

QuickTimeはムービーをそのまま再生するだけでなく、様々な効果を適用しながらムービーを再生する機能も持っています。これをQuickTimeエフェクトと呼び、 jit.qt.effectオブジェクトを使って利用することができます。QuickTimeエフェクトには、エンボスや波紋のように1つの画像を変化させるエフェクトや、クロスフェードやワイプなどの2つの画像を切り替えるトランジッションや合成、そして雲や炎など新しい画像を作り出すエフェクトがあります。

QuickTimeエフェクト

jit.qt.effectオブジェクトは、 loadeffectメッセージでエフェクトを選択し、 paramメッセージ、 param_aメッセージ、 param_bメッセージでパラメータを指定することができます。パラメータのメッセージは第1アーギュメントでパラメータ番号を指定し、第2アーギュメント以降でパラメータの値を指定します。ただし、どのようにパラメータを用いるかは、エフェクトの種類によって異なります。また、 stepsメッセージではエフェクトを自動的に変化させる場合のステップ数を設定できます。

例えば、QuickTime 7では、膨張のトランジッションは14番なので、 jit.qt.effectオブジェクトに「 loadeffect 14」というメッセージを送ると膨張のエフェクトが選ばれます。そして、最初のパラメータがトランジッションの割合なので、 paramメッセージの第1アーギュメントを 0とし、第2アーギュメントで 0.0から 1.0までの数値を指定すると、第1インレットの画像から第2インレットへの画像へと移り変わります。

42

Page 46: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

14 QuickTimeエフェクト

ちなみに、 jit.qt.effectオブジェクトでは、 geteffectlistメッセージや getparamlistメッセージによってエフェクトやパラメータのリストを取得できます。また、 jit.qt.effectオブジェクトに dialogメッセージを送ると、 QuickTimeエフェクトの設定ダイアログが開き、エフェクトの種類やパラメータを設定することができます。

QuickTimeエフェクトの設定ダイアログ

43

Page 47: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

15 画像のサンプリング

15 画像のサンプリング

画像をメモリ上に溜め込んだり、溜め込んだ画像を呼び出すには、 jit.matrixsetオブジェクトが利用できます。 jit.matrixsetオブジェクトは複数のマトリックスを格納できるオブジェクトです。

画像のサンプリング

jit.matrixsetオブジェクトはアーギュメントに格納するマトリックスの数を指定し、その後にマトリックスのプレーン数、データ・タイプ、そしてディメンジョンを指定します。格納するマトリックスの数は、 matrixcountメッセージで変更することも可能です。いずれの場合も、指定した数のマトリックスに必要なだけの空きメモリがなければなりません。実際に確保されたマトリックスの数は、 getmatrixcountメッセージで確認できます。

jit.matrixsetオブジェクトは受け取った画像(マトリックス)をオブジェクト内部(メモリ)に格納しますが、何番目のマトリックスに格納するかは indexメッセージのアーギュメントで指定します。そして、 outputmatrixメッセージを送れば、アーギュメントで指定した番号のマトリックスがアウトレットから出力されます。マトリックスの番号は 0から始まりますので、確保したマトリックス数よりも 1小さい番号までが有効です。なお、 thruメッセージで 1を送ると、受け取ったマトリックスをオブジェクト内部に格納すると同時に、そのマトリックスをアウトレットから出力するスルー状態になります。

なお、ここでは映像を静止画像として格納したり、呼び出したりしていますが、 outputmatrixメッセージと indexメッセージを適切に操作すれば、映像サンプラーを実現することも可能です。

44

Page 48: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

16 映像のディレイ

16 映像のディレイ

jit.matrixsetオブジェクトを用いれば、映像にディレイをかけることも簡単に実現できます。次のサンプルは、指定したフレーム数だけ映像を遅らせて表示するパッチです。

映像のディレイ

このパッチでは、まず、異なるマトリックスだけを通過させる jit.changeオブジェクトによって、ムービーの画像をフレームごとに通過させます。これは、コンピュータに処理能力に余裕があれば、 jit.qt.movieオブジェクトが同一のフレームを何度か出力するためです。

次に、「 t l b」オブジェクトは triggerオブジェクトで bangとリストを出力します。最初の bangは

counterオブジェクトを動かし、出力された数値をマトリックス番号として outputmatrixメッセージによって jit.matrixsetオブジェクトに格納されたマトリックスを出力します。そして、同じ番号で indexメッセージによって、受け取った画像を格納するマトリックスを指定します。その後、 triggerオブジェクトから出力されるリストはムービーの画像を示すので、その画像が jit.matrixsetオブジェクトに格納されます。このような処理を繰り返すことによって、映像のディレイが行われます。

例えて言うなら、 jit.matrixsetオブジェクトは円環状のフィルム・ループのように使われており、あるコマを投影した直後に、そのコマに映像を記録しています。記録されたコマは、フィルムが一周した時に投影されますので、これが映像の時間的な遅れとなるわけです。

45

Page 49: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

17 画像の貼り付け

17 画像の貼り付け

ある画像の一部に異なる画像を貼り付けるには、 jit.matrixオブジェクトを使って同一のマトリックスの異なる領域に画像を書き込みます。この領域はデスティネーション領域として指定します。 jit.matrixオブジェクトでは、デスティネーション領域の指定を行うことを usedstdimアトリビュートで行います。そして、デスティネーション領域の左上を dstdimstartアトリビュートで、右下を dstdimendアトリビュートで指定します。これらはメッセージによって変更することも可能です。

画像の貼り付け

このパッチでは、2つの jit.qt.movieオブジェクトに異なるムービーを読み込んで再生します。ムービーの画像は異なる jit.matrixオブジェクトに送られますが、いずれの jit.matrixオブジェクトも canvasというマトリックス名を指定していますので、同じマトリックスに画像を書き込むことになります。ここで、 metroオブジェクトの bang出力から bangbangオブジェクト(b)で2つの bangを出力し、右から左への順序の原則に従って、右側のムービーから先に処理するように明示的に処理しています。そこで、最初に右側のムービーが再生され、その画像が先に canvasマトリックスに書き込まれます。この jit.matrixオブジェクトはデスティネーション領域を指定していませんので、受け取った画像はマトリックス全域に書き込まれます。

次に、左側のムービーの画像が canvasマトリックスに書き込まれますが、こちらの jit.matrixオブジェクトはデスティネーション領域を指定していますので、その領域に画像が書き込まれます。そして最後に左側の

jit.matrixオブジェクトから出力された画像が、 jit.pwindowオブジェクトに表示されます。このような処理によって、右側のムービー画像の上に左側のムービー映像を貼り付けたような表示になります。

46

Page 50: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

17 画像の貼り付け

ちなみに、ここでは使用していませんが、 jit.matrixオブジェクトのソース領域の指定は、 usesrcdim、

srcdimstart、 srcdimendのアトリビュートまたはメッセージによって行います。また、 jit.matrixオブジェクトと jit.pwindowオブジェクトとは領域の指定方法が異なります。具体的には、同じ矩形であっても、 jit.matrixオブジェクトでの領域指定の右と下の値は、 jit.pwindowオブジェクトでの指定よりも1だけ小さくなります。これは第22節の説明を参考にしてください。

47

Page 51: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

18 画像の重ね合わせ

18 画像の重ね合わせ

2つの画像を単純に重ね合わせるには、 jit.opオブジェクトを利用します。 jit.opオブジェクトはマトリックス演算を行うオブジェクトで、 opアトリビュートで演算の種類を指定します。 jit.opオブジェクトの演算には、加減乗除( +、 -、 *、 /)などの算術演算をはじめ、三角関数、ビット演算、条件演算、指数関数、対数関数など、数多くの演算を行うことができます。ただし、マトリックス同士の演算ができるものとマトリックスと数値の演算のみができるものとがあります。

画像の重ね合わせ

このパッチでは、2つの jit.qt.movieオブジェクトから異なる画像が出力されますので、それらを jit.op

オブジェクトに受け取って、マトリックス同士の演算をします。ここでは掛け算( *)を指定していますので、マトリックスのセルごとに、すなわち画像のピクセルの ARGB 値ごとに掛け算された結果が出力され、 jit.pwindowオブジェクトに表示されます。演算の種類は opメッセージで変更することができます。演算の種類によって画像がどのように重ね合わされるか確認しておくと良いでしょう。

48

Page 52: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

19 クロスフェード合成

19 クロスフェード合成

ある映像がフェード・アウトするにつれて、異なる映像がフェード・インするクロスフェード合成は、

jit.xfadeオブジェクトを使えば、簡単に実現できます。

クロスフェード合成

左側のパッチで分かるように、 jit.xfadeオブジェクトは第1インレットと第2インレットのそれぞれに異なる画像を受け取り、 xfadeメッセージの 0.0から 1.0までの数値によってクロスフェード量を設定します。 0.0の時は第1インレットの画像のみが出力され、値が大きくなるにつれて第1インレットの画像が弱まり、第2インレットの画像が強まっていきます。そして、 1.0になると第2インレットの画像のみが出力されます。

クロスフェード合成は、 jit.opオブジェクトを使っても処理することもできます。 jit.opオブジェクトの演算の種類を指定する opアトリビュートが *であればマトリックスの掛け算となり、マトリックスを構成する個々のセルについて掛け算を行います。そこで、 0.5を掛けた場合は、セルのデータの値がすべて半分になります。

opアトリビュートが +の場合はマトリックスの加算になりますが、第1インレットにも第2インレットにもマトリックスを受け取っている場合は、それぞれのマトリックスの対応するセルのデータの値を足し算することになります。

右側のパッチでは、2つのムービー画像(すなわちマトリックス)ごとに掛け算を行い、その結果を足し合わせて jit.pwindowに表示しています。このパッチで横フェーダを動かした場合は、掛け算する数値の合計は常に

1.0となり、 jit.xfadeオブジェクトを用いたクロスフェード合成と同じ結果になります。一方、縦フェーダを動かせば、それぞれの数値の合計が 1.0になるとは限りませんので、クロスフェードとは異なる合成ができます。これらはちょうどDJミキサーの横フェーダと、オーディオ・ミキサーの縦フェーダに似た働きをします。

49

Page 53: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

20 マスク合成

20 マスク合成

グレースケール・マップに基づいて2 つの画像を合成するマスク合成(アルファ・チャンネル合成)は、

jit.alphablendオブジェクトによって行うことができます。 jit.alphablendオブジェクトは、2つのインレットに受け取った画像を合成して出力しますが、第1インレットの画像のアルファ・チャンネルをマスク画像として用います。

マスク合成

このパッチでは、2つのムービーの画像を合成していますが、マスク画像は別のムービー(例えばグレースケールのピクチャ)から読み出すようにしています。そこで、画像を jit.unpackオブジェクトで分解し、マスク画像とムービーのRGBデータを jit.packオブジェクトで組み合わせています。マスク画像の白い部分は第1インレットの画像が用いられ、黒い部分は第2インレットの画像が用いられます。マスク画像のグレーの部分は、その強度に応じて両方の画像がブレンドされます。ただし、 modeアトリビュートが 1であれば、この関係は反対になります。

ちなみに、あらかじめムービーのアルファ・チャンネルにマスク画像を含めておくことも考えられます。多くの3DCGアプリケーションでは、レンダリング時にモデリングした物体のマスク画像も含めてムービーを作成する機能を持っていますので、これを利用すれば、他のムービーを背景として3Dキャラクタが動くような合成が可能です。

50

Page 54: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

21 クロマキー合成

21 クロマキー合成

2つの画像を合成する方法のひとつに、特定の色に基づいて合成を行うクロマキー合成があります。人物を合成する時に青い背景を用いることから、クロマキー合成をブルー・バック合成と呼ぶこともあります。Jitterでは

jit.chromakeyオブジェクトによってクロマキー合成を行うことができます。

クロマキー合成

jit.chromakeyオブジェクトでは2つのインレットに異なる画像を受け取り、キーとなる色を colorメッセージによって指定します。そして、第1インレットに受け取った画像のピクセルごとに、キー・カラーとの差(距離)が大きい場合は第1インレットの画像を用い、差が小さい場合には第2インレットの画像を用いて合成します。

キー・カラーとの差は tolメッセージの値と fadeメッセージの値によって判断され、合成は minkeyメッセージの値と maxkeyメッセージの値に基づいて行われます。 modeメッセージで1を送れば、合成画像ではなく、マスク画像が出力されますので、どのように合成されているかが把握できます。このマスク画像は、先に紹介したマスク合成のために用いることもできます。

なお、3種類の画像を用いてクロマキー合成を行う jit.keyscreenオブジェクトや、輝度に基づいたルーマキー合成を行う jit.lumakeyオブジェクトなども用意されています。

51

Page 55: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

22 図形の描画

22 図形の描画

直線や矩形、楕円形などの2次元での図形描画なら、 jit.lcdオブジェクトを利用します。 jit.lcdオブジェクトはMaxの lcdオブジェクトとほぼ同じ機能を持っていますが、 lcdオブジェクトが独自の描画領域に直接描くのに対して、 jit.lcdオブジェクトは描画した画像を出力する点が異なっています。

図形の描画

jit.lcdオブジェクトは、アーギュメントでプレーン数、データ・タイプ、ディメンジョンを指定します。この指定に従って jit.lcdオブジェクト内部にマトリックスが作成され、このマトリックスに描画を行うことになります。

jit.lcdオブジェクトは、さまざまな描画メッセージを受け付け、マトリックスに描画しますが、描画メッセージだけではマトリックスは出力されず、 bangを受け取った時にマトリックスを出力します。左側のパッチでは、チェックボックスにチェックを付けると metroオブジェクトが動作し、一定時間間隔で bang が jit.lcdオブジェクトに送られます。この場合は、何らかの描画メッセージを送れば、すぐさま描画された画像が jit.pwindowオブジェクトに表示されます。一方、 metroオブジェクトを動作させない場合は、描画メッセージを送っても表示は更新されず、ボタンをクリックして bangを送った時に表示が更新されます。従って、いくつかの描画メッセージを送って一連の描画を終えた後にbangを送ることで、描画の過程を見せないようにすることができます。

さて、 jit.lcdオブジェクトへの描画メッセージには数多くの種類がありますが、代表的なメッセージをいくつか紹介しておきましょう。まず、 colorメッセージと frgbメッセージは前景色を指定します。これは目には見えませんが、ペンの色となります。 brgbメッセージは背景色の指定ですが、画像全体を消去する clearメッ

52

Page 56: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

22 図形の描画

セージを送った時に背景色が反映されます。色は colorメッセージの場合はカラー番号を示す整数値で指定し、

frgbメッセージと brgbメッセージはRGB値として 0から 255までの3つの整数で指定します。

ペンを動かすには movetoメッセージを用い、画像の左上隅を原点( 0,0)とする絶対座標で移動先を指定します。 movetoメッセージでは何も描かれず、描画の開始点を決めることになります。そして、 linetoメッセージでは絶対座標で指定する位置までの直線を描きます。現在のペンの位置から相対的にペンを移動するには

moveメッセージを、同じく相対的に直線を描くには lineメッセージを用います。 linesegmentメッセージなら、絶対座標で開始点と終了点を指定して線分を描くことができます。ペンのサイズは pensizeメッセージを用い、ペンの横幅と縦幅を2つの整数で指定します。

矩形を描くには2種類のメッセージがあり、 framerectメッセージは矩形の枠だけを描き、 paintrectメッセージは内部を塗り潰して矩形を描きます。これらは絶対座標で矩形を取り囲むような左、上、右、下の座標によって描く場所を指定する必要があります。楕円形を描くには、 frameovalメッセージと paintovalメッセージがありますが、これらは左、上、右、下の絶対座標で指定する矩形に内接するような楕円形として描かれます。なお、多くの描画メッセージは、座標指定の後にペンの色を指定することができます。

右側のパッチでは、簡単なアニメーションを描画しています。 metroオブジェクトを動作させると、

bangbang( b)オブジェクトで4つの bangメッセージが出力され、右から左への順序に従って、まず一番右側の clearメッセージが jit.lcdオブジェクトに送られ、描画が消去されます。次いで counterオブジェクトで順次増加する数値を縦座標として、上から下へと移動する青い水平線を描きます。そして、 drunkオブジェクトから出力されるランダムに増減する数値を横座標として、左右にゆらゆら動く白い矩形を描きます。最後に

bangが jit.lcdオブジェクトに送られますので、描画された画像が出力され、 jit.pwindowオブジェクトに表示されます。このように、毎回画像を消去してから新しい位置に図形を描くことで、図形が動くように見せることができます。

なお、 jit.lcdオブジェクトはこれまで説明した以外にも、角が丸まった矩形や円弧、多角形の描画や、画像ファイルを読み込んで描くこともできます。テキストの描画については、次項で説明します。また、 jit.lcdオブジェクトと組み合わせてタートル・グラフィックスを実現する jit.turtleオブジェクトも用意されています。

ここで、領域の指定方法をまとめておきましょう。 jit.pwindowオブジェクトや jit.lcdオブジェクトなどはQuickDrawというMac OSの機能を使って描画を行います。このようなオブジェクトでの領域指定はQuickDrawに準拠しますので、ある領域を取り囲むような座標値として表します。一方、 jit.matrixオブジェクトや、次に説明する jit.findboundsオブジェクトでの領域は、マトリックスのセルの番号として指定します。以下の図を参考にしてください。

領域指定方法の違い

QuickDrawの座標系

(0, 0)

マトリックスのセル番号

{0, 0}

QuickDrawの座標系

(10, 8)

マトリックスのセル番号

{9, 7}

画像のピクセルまたはマトリックスのセル

53

Page 57: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

23 テキストの描画

23 テキストの描画

jit.lcdオブジェクトは、テキストを描画することもできます。テキストはペンの色と位置に従って描かれますので、事前にペンの色を colorメッセージや frgbメッセージで設定し、ペンの位置を movetoメッセージや

moveメッセージで指定しておきます。そして、描きたいテキストをアーギュメントとして writeメッセージを

jit.lcdオブジェクトに送れば、そのテキストが描かれます。また、描く文字をASCIIコードで指定したい場合は、 asciiメッセージを用い、アーギュメントとしてASCIIコードを続けます。

右側のパッチでは、 dateオブジェクトによって現在時間を求め、それをテキストとして描画しています。さらに jit.qt.movieオブジェクトでムービーを再生すれば、 jit.opオブジェクトでムービー画像の上に時刻が描かれることになります。

テキストの描画

テキストを描く際に用いるフォントは fontメッセージで指定します。 fontメッセージの第1アーギュメントはフォント名またはフォント番号で、第2アーギュメントはフォント・サイズの指定です。ただし、異なる環境でパッチを実行する場合は、システムにインストールされているフォントが異なる可能性が高いので、標準的にインストールされるフォント名を指定するのが良いでしょう。

また、日本語のフォントを指定すれば、 writeメッセージで日本語のテキストを表示することもできます。しかし、MaxおよびJitterでの2バイト文字の扱いに問題があり、一部の漢字は文字化けします。日本語の表示については、第46項で説明します。

54

Page 58: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

24 特定色の検出

24 特定色の検出

画像から特定の色を検出したい場合は、 jit.findboundsオブジェクトを利用します。 jit.findboundsオブジェクトは、画像から指定された範囲の色を見つけだし、それらを含む最小の領域を出力します。

特定色の検出

jit.findboundsオブジェクトで検出する色の範囲は、最小値を minメッセージで、最大値を maxメッセージで指定します。いずれも色を表す4つの実数をアーギュメントとします。指定した範囲の色のピクセルが画像中に見つかれば、 jit.findboundsオブジェクトは、そのようなピクセルを含む最小の矩形として、その左上のセルの位置を第1アウトレットから、右下のセルの位置を第2アウトレットから出力します。これらは2つの整数のリストです。指定した範囲の色が見つからない場合は、これらの座標値はすべて -1になります。このパッチでは、検出された領域に基づいて jit.lcdオブジェクトで矩形を描き、それを元の画像とビットXOR演算で合成しています。

55

Page 59: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

24 特定色の検出

ここで掲載したような単純明快な画像であれば、 jit.findboundsオブジェクトだけで赤いボールを追いかけるような処理ができます。しかし、実際のビデオ映像等では、照明が一様でなかったり、画像が荒れていたりなど、検出の障害となる要因があるかもしれません。そのような場合には、検出する物体や周囲の環境に応じてカラースペースを変換することや、ノイズの除去を行うことなど、正確な検出のための工夫が必要になります。

56

Page 60: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

25 動きの検出

25 動きの検出

ビデオなどの変化のある映像の場合、現在のフレーム画像と直前のフレーム画像を比較することによって、画像がどのように変化したかを知ることができます。固定カメラからの映像であれば、画像の変化はカメラの前にある物体が動いたことになりますので、映像による動体検出といった用途に利用できます。

動きの検出

このパッチでは、まず、 jit.changeオブジェクトで映像フレームごとに画像を通過させ、 jit.scalebias

オブジェクトで画像をグレイスケール化し、 jit.unpackオブジェクトで1プレーンだけを取り出します。これで画像変化を知るのに必要最小限の情報としての画像が得られたことになります。次に、演算の種類を absdiffとした jit.opオブジェクトによって、2つの画像の差の絶対を得ます。この時、「 t l l」として triggerオブジェクトから同じ画像を出力しますが、パッチ・コードをたすきがけにして jit.opオブジェクトに送っています。これにより、現在のフレームと直前のフレームとの間で画像演算を行うことになります。このようにして得られた画像は、直前のフレームと現在のフレームとの間に生じた変化を表し、白いピクセルほど変化が大きいことを示しています。

57

Page 61: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

25 動きの検出

次に、 jit.3mオブジェクトでは画像の全ピクセルの最小値、平均値、最大値を求めることができますが、ここでは平均値のみをナンバー・ボックスに表示し、 MultiSliderオブジェクトを使って数値の推移をグラフ表示しています。従って、この数値が一定の値を超えれば、画像に変化が生じたと判断することができます。また、変化量を表す画像に jit.findboundsオブジェクトを用いて、画像のどの部分に変化が生じたかを求めても良いでしょう。

58

Page 62: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

26 ファイルへの保存

26 ファイルへの保存

Jitterで処理した画像は、 jit.qt.recordオブジェクトを使って、ムービー・ファイルとして保存することができます。 jit.qt.recordオブジェクトは、他の Jitterオブジェクトから画像を受け取り、 writeメッセージでムービー・ファイルへの保存を開始し、 stopメッセージで保存を終了します。

writeメッセージのアーギュメントは、ファイル名、 fps(1秒あたりのフレーム数、省略時は 30)、コーデック(省略時は raw)、クオリティ(省略時は max)、タイムスケール(省略時は 600)の順に続きます。 writeメッセージのアーギュメントでファイル名を省略した場合は、ファイル保存ダイアログが開き、ファイル名の入力が求められます。アーギュメントでファイル名を指定した場合は、同じ名前のファイルが存在していても、警告なしに上書き保存されますので、注意が必要です。また、フルパス名ではなく、ファイル名のみを指定した場合は、パッチと同じフォルダにムービー・ファイルが作成されます。

ムービー・ファイルへの保存

このパッチでは、 jit.noiseオブジェクトでランダムなカラー・パターンを作り、 jit.lcdオブジェクトで 0.1秒ごとに増加する数値を描いた画像を、 jit.qt.recordオブジェクトに送っています。

jit.qt.recordオブジェクトが受け取るのは、ムービーを再生してエフェクトを掛けた画像や、OpenGLで描

59

Page 63: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

26 ファイルへの保存

画した3Dグラフィックス画像など、 Jitterオブジェクトが出力する画像であれば何でも構いません。

jit.qt.record オブジェクトで作成したムービー・ファイルは、標準の QuickTime ムービーなので、

jit.qt.movieオブジェクトで再生することはもちろんのこと、QuickTime Playerなど他のQuickTime対応アプリケーションでも利用できます。

jit.qt.recordオブジェクトで重要なのは realtimeアトリビュートです。これが 1であれば、画像を受け取ったタイミングに従ってムービー・ファイルが作られます。このパッチでは、0.1秒ごとに画像を受け取りますので、 realtimeが 1であれば、 writeメッセージでの fps指定に関わらず、作成されたムービーは 10fpsになります。一方、 realtimeが 0であれば、画像を受け取る時間間隔とは無関係に、 writeメッセージの fps指定に従ってムービーが作られます。

なお、ムービー・ファイルではなく、マトリックスそのものをファイルとして保存するには、 jit.matrixオブジェクトや jit.matrixsetオブジェクト、 jit.fprintオブジェクト、 jit.texfileオブジェクトを利用します。

60

Page 64: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

27 ビデオ機器からの画像入力

27 ビデオ機器からの画像入力

DVカメラなどのビデオ入力デバイスから映像を取り込むには、 jit.qt.grabオブジェクトを用います。

jit.qt.grabオブジェクトでは、DVカメラはもちろん、Web Camやキャプチャー・ボードなどQuickTimeに対応したビデオ入力デバイスを利用できます。

ビデオ機器からの画像入力

61

Page 65: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

27 ビデオ機器からの画像入力

jit.qt.grabオブジェクトのアーギュメントには、取り込む画像の大きさを横ピクセル数と縦ピクセル数で指定します。そして、 openメッセージでビデオ入力デバイスを開き、 metroオブジェクトなどで定期的に bangを送れば、ビデオ入力デバイスからの画像が出力されます。取り込みが終われば、 closeメッセージを送って、ビデオ入力デバイスを閉じます。

settingsメッセージを送れば、ビデオ入力設定ダイアログが開きますので、ビデオ・ソースの選択や圧縮の設定などを行います。ビデオ入力デバイスの設定はダイアログだけでなく、 codecqualityなどのメッセージを使って行うことができます。ただし、ビデオ入力モードの指定は vmodeメッセージでのみ可能です。ビデオ入力デバイスの種類によって異なりますが、 vmodeの値によってパフォーマンスや画質が大きく変わる場合があります。

ビデオ入力設定ダイアログ

jit.qt.grabオブジェクトは取り込んだビデオ映像を出力するだけですが、 writeメッセージを送れば、QuickTimeムービーとしてディスクに書き込みます。 writeメッセージのアーギュメントでファイル名やフレーム・レートなどを指定することもできます。ファイル名を省略した場合は、ファイル保存ダイアログが開きます。ディスクへの書き込みを終えるには、 stopメッセージを送ります。

write_videoメッセージはビデオの書き込みを指定し、 write_audioメッセージはオーディオの書き込みを指定します。デフォルトではビデオの書き込みのみが有効になっています。また、 write_previewメッセージは書き込み中の映像のプレビューの有無を指定します。デフォルトではプレビューがオフになっていますが、これをオンにすることで書き込み中の映像を確認することができます。

62

Page 66: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

28 ビデオ機器のコントロール

28 ビデオ機器のコントロール

jit.avcオブジェクトを用いれば、DVビデオ・カメラやDVビデオ・デッキなどのビデオ機器をコントロールして、再生や録画などを行うことができます。 jit.avcオブジェクトが対応しているのは、FireWireによって接続するデバイスの制御規格であるAV/Cプロトコルで、FireWire端子を持つ多くのビデオ機器が対応しています。FireWire端子はIEEE1394端子やiLink端子とも呼ばれます。ただし、カメラ・モードでの制御に対応しているビデオ・カメラは少ないようです。

ビデオ機器のコントロール

ビデオ機器をコントロールするには、まずビデオ機器をFireWireケーブルでコンピュータと接続し、ビデオ機器の電源を入れます。そして、ビデオ・テープを入れるなど、通常にビデオの再生や録画ができる状態にします。ビデオ・カメラならビデオ・モードにしておきます。次に、 jit.avcオブジェクトに openメッセージを送ると、ビデオ・デバイスが開かれ、コントロールが可能になります。コントロールを終える時は closeメッセージを送ります。

ビデオ・デバイスを開いた状態で、 jit.avcオブジェクトにメッセージを送ることで、ビデオ機器のコントロールができます。代表的なメッセージを挙げれば、 play(再生)、 pause(一時停止)、 stop(停止)、

rewind(巻き戻し)、 ff(早送り)、 record(録画)、 recpause(録画一時停止)などがあります。

timeメッセージは時間位置を指定して早送りや巻き戻しを行うもので、時間位置は時、分、秒、フレームの4つの整数で表します。ここでのフレームは1/30秒を意味します。

ビデオ機器の情報を得るためにも、いつくかのメッセージが用意されています。例えば、 getdeviceメッセージを送れば、 jit.avcオブジェクトのアウトレットから deviceメッセージに続いて、デバイス名が出力されます。 gettransport メッセージはビデオ機器の動作状態を表すトランスポートを取得するもので、

transportメッセージに続いて2つの整数が得られます。この整数は16進法で表すと理解し易いようになっており、例えば、1番目の整数が C3であれば再生系(play)グループであることを示し、2番目の整数が 7Dであれば一時停止状態(pause)であることを示します。 gettimeメッセージを送れば、現在の時間位置を取得することになり、 timeメッセージに続いて時間位置を示す4つの整数が出力されます。

63

Page 67: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

28 ビデオ機器のコントロール

jit.avcオブジェクトは、これら以外にも多くのメッセージを用意していますが、どのようなメッセージに対応しているかはビデオ機器によって異なります。また、 jit.avcオブジェクトが用意していないAV/Cプロトコルについては、AV/Cプロトコルに従った整数のリストをアーギュメントとする customメッセージを利用することができます。AV/Cプロトコルの詳細は、1394 Trade Association(1394ta.org <http://1394ta.org/>)という標準化団体から、各種仕様書を有償で入手することができます。

64

Page 68: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

29 ビデオ機器への画像出力

29 ビデオ機器への画像出力

Jitterが処理した画像を jit.qt.videooutオブジェクトによってビデオ機器に出力し、そのビデオ機器で表示したり、録画することができます。 jit.qt.videooutオブジェクトは、QuickTimeのビデオ出力コンポーネントに対応したビデオ機器を扱いますが、これにはDVビデオ・カメラやDVビデオ・デッキやビデオ出力機能を持ったビデオ・カードなどがあります。

ビデオ機器への画像出力

ビデオ機器に画像出力するには、まず、ビデオ出力コンポーネントをコンピュータに正しく接続し、正常に動作するように設定しておく必要があります。DVビデオ機器を用いるのであれば、前項の「 ビデオ機器のコントロール」の説明を参考にしてください。

次に、 jit.qt.videooutオブジェクトに openメッセージを送り、ビデオ出力コンポーネントを開きます。そして、 jit.qt.videooutオブジェクトに画像を送れば、その画像がビデオ出力コンポーネントに出力され

65

Page 69: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

29 ビデオ機器への画像出力

ます。このパッチでは、上部のチェックボックスにチェックを付けておくと、ビデオ機器に繋がったテレビなどで、Jitterからの画像である数字のカウントを見ることができるでしょう。

ちなみに、ビデオ機器はJitterからの映像を受け取っているだけなので、ビデオ・テープに画像を録画するには録画ボタンを押すか、 jit.avcオブジェクトで録画操作をすることになります。また、出力する画像を圧縮するクオリティは codecqualityメッセージで設定します。これは 0(最低)から 5(圧縮なし)までの整数で指定しますが、デフォルトでは 2(通常のクオリティ)となっています。そして、ビデオ出力を終える時は、

jit.qt.videooutオブジェクトに closeメッセージを送ります。

より良い画像を録画するためには、Jitterでの設定が必要になります。例えば、DVビデオ機器で録画するのであれば、DV映像は720×480ピクセルで29.97fps(フレーム/秒)ですから、このサイズに合わせた画像を1秒間に29.97フレームの割合で jit.qt.videooutオブジェクトに送れば、もっとも良い結果が得られます。画像サイズが小さかったり、フレーム・レートが低い場合でも、 jit.qt.videooutオブジェクトは適切に変換を行いますが、映像のクオリティは低下します。

なお、 jit.qt.videooutオブジェクトに getvoclistメッセージを送れば、ビデオ出力コンポーネントのリストが得られ、 getvocmodesメッセージを送れば、利用可能なディスプレイ・モードのリストが得られます。また、 getcodecqualityメッセージなら、圧縮クオリティの設定値が得られます。これらの情報は、

jit.qt.videooutオブジェクトの第2アウトレットから出力されます。

66

Page 70: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

30 音量による画像処理

30 音量による画像処理

音楽によって画像を変化させる方法はいくつも考えられますが、ここでは音楽の音量に従って画像の明るさを変化させる簡単なパッチを紹介しましょう。MaxではMSPによってオーディオを扱うことができます。

音量による画像処理

このパッチでは、まず、ムービー・ファイルとオーディオ・ファイル(AIFFファイルなど)を読み込みます。次に、オーディオ処理を開始するために、スピーカのアイコンの ezdac~オブジェクトをクリックします。そして、ムービーとオーディオの再生を開始すれば、オーディオの音量に応じて、ムービー映像が明るくなったり、暗くなったりするはずです。使用するオーディオ・ファイルは、ドラム・ソロなど音量変化が明確なものであれば、効果がはっきりと確認できます。

ここでの処理は、オーディオ・ファイルの再生音、すなわち sfplay~オブジェクトが出力するシグナルを、レベル・メータの形をした meter~オブジェクトに送ります。 meter~オブジェクトは音量を検出し、バー・グラフとして表示するとともに、アウトレットから実数として音量値を出力します。そこで、その数値を brightnessメッセージとして jit.brcosaオブジェクトれば、再生音の音量に応じて、ムービーの画像の明るさが変化することになります。

67

Page 71: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

31 波形の描画

31 波形の描画

次のパッチは、MSPが扱うオーディオ・シグナルを波形としてJitterで描画しています。シグナルはMSPの

scope~オブジェクトを使って波形表示できますが、Jitterを用いれば多彩な映像表現が可能になります。

オーディオの波形描画

68

Page 72: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

31 波形の描画

MSPのシグナルはオーディオ・レート(例えば、44.1KHz)の数値の流れであり、Jitterの画像はマトリックスと呼ばれる数値の集合なので、これらの間には直接的なデータの互換性はありません。そこで、これらのデータを変換するために用意されたのが、 jit.catch~オブジェクトと jit.release~オブジェクトです。

jit.catch~オブジェクトは、 bangメッセージを受け取ると、入力されたオーディオ・シグナルをfloat型のマトリックスに変換して出力します。どのように変換するかは modeアトリビュートで指定します。ここでは

framesizeアトリビュートで指定する数だけの最新のデータをマトリックスに変換する mode 2を用います。

framesizeのデフォルト値は 320です。

次に、 jit.graph~オブジェクトで波形を2次元画像として描画し、出力をウィンドウに送れば、波形グラフが表示されます。描画方法は modeアトリビュートで指定します。 modeが 0なら点で描画、 1なら線分で描画、 2なら領域として描画、 3なら両方向の領域として描画されます。 mode 4は最小値と最大値を表す2次元のマトリックスによってバーグラフを表示します。

ここでは、さらに iTunesのビジュアライザー風の効果を付けるために、画像を jit.rotaオブジェクトを使って回転と拡大を行い、その結果を再び jit.matrixオブジェクトで canvasマトリックスに書き込んでいます。 canvasマトリックスは、 jit.graphの out_nameアトリビュートで指定した名前なので、同じマトリックスに次々と波形を重ねて描くことになります。また、 jit.rotaの interpアトリビュートをオンにしているので、回転や拡大した画像が補間され、滑らかな映像を得ることができます。

ただし、 jit.graphの clearitアトリビュートをオンにすると毎回マトリックスを消去した上で描画するので、iTunes風の効果は現れず、 jit.graphによる描画そのものを確認することができます。

ちなみに、 jit.graphはオーディオ・シグナルに限らず、float型のマトリックスをグラフ表示するために用いることができます。jit.graphとほぼ同等のグラフをOpenGLを使って3次元空間に描くには、 jit.gl.graphが用意されています。また、 jit.catch~オブジェクトとは逆に、 jit.release~オブジェクトはマトリックスをオーディオ・シグナルに変換します。さらに、 jit.poke~オブジェクトや jit.peek~オブジェクトを用いてもマトリックスとシグナルの変換が可能です。

69

Page 73: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

32 3次元描画の基本

32 3次元描画の基本

JitterではOpenGLを用いて3次元画像の描画ができます。このためには、まず jit.windowオブジェクトで描画ウィンドウを作ります。この jit.windowは、奥行きを表現できるように、 depthbufferアトリビュートをオンにしておき、ウィンドウの名前を stageとします。

次に、描画する3次元物体として、 jit.gl.gridshapeオブジェクトを用います。アーギュメントには、この物体が描かれるウィンドウとして stageを指定します。 jit.gl.gridshapeは球や立方体などの単純な形状を描きます。

最後に、実際の描画処理であるレンダリングを行う jit.gl.renderオブジェクトを作り、アーギュメントには描画するウィンドウとして stageを指定します。 jit.gl.renderは、 eraseメッセージを受け取れば、それまでの描画を消去し、 bangメッセージを受け取ると、新しく描画された画像をウィンドウに表示します。

基本的な3次元描画

このようにして、 qmetroオブジェクトを使って、適当な間隔で eraseと bangを送れば、常に描画が更新されます。また、 jit.gl.gridshapeへ shapeメッセージを送ることで、物体の形状を変えることもできます。ここでは、物体の見え方を整えるために、物体の大きさを指定する scaleアトリビュートと、光の影響を受ける

lighting_enableアトリビュートを指定しています。

このように、OpenGL描画はウィンドウ、物体、レンダーの3種類のオブジェクトから成り立っています。これらのオブジェクトはパッチ・コードで繋がっておらず、その代わりにウィンドウの名前によって関係付けられています。このような関係付けをドローイング・コンテキストと呼びます。つまり、Jitterでのマトリックス処理とは異なるメカニズムで描画が行われるので、注意が必要です。

70

Page 74: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

32 3次元描画の基本

また、OpenGLによる描画では、 metroではなく qmetroを使う点が重要です。処理負荷が高い時に、 metroであればメッセージが停滞しますが、 qmetroは処理の負荷に応じて時間間隔を自動的に調整してくれます。ただし、 jit.qt.movieや jit.qt.grabなどのオブジェクトは、自動的に bangを間引く機能を持っているので、 metroを用いて構いません。

なお、物体を描くオブジェクトには様々な種類があり、適切なオブジェクトを使うことで効率的な描画ができます。どのようなオブジェクトが用意されているかを、ヘルプ・パッチなどで確認しておくと良いでしょう。

71

Page 75: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

33 3次元物体の操作

33 3次元物体の操作

3次元物体の大きさや位置などは、メッセージやアトリビュートによって指定することができます。まず、物体の見え方としては、 lighting_enableをオンにすれば、光の影響を受けて立体的に描画されます。これがオフであれば平坦な描画となり、球が円のように見えてしまうので、通常はオンにするのが良いでしょう。また、

smooth_shadingは物体をなめらかに描画します。

3次元物体の操作

さて、物体の大きさはscaleで指定し、位置は positionで指定します。いずれも3つのアーギュメントを持ち、それぞれX座標、Y座標、Z座標での物体の拡大率や位置を指定します。デフォルトの大きさは1. 1. 1.、デフォルトの位置は0. 0. 0.です。OpenGLでの3次元空間は、デフォルトで正面から見て左右方向がX軸、上下方向がY軸、前後方向がZ軸となります。

物体の回転は rotateで指定し、アーギュメントは回転角度に続けて、回転の軸となるX軸、Y軸、Z軸の割合を指定します。回転角度は度数で表すので、360.0で一回転することになります。回転軸が1. 0. 0.の場合は、X軸を中心に回転することになります。1. 1. 0.であればX軸からY軸に45度回転した軸、あるいは、1.0.5 0.であればX軸からY軸方向に22.5度回転した軸が中心になります。

物体の色の指定には colorを用いますが、アーギュメントは他の Jitterオブジェクトとは異なり、RGBA形式、すなわちR(赤)、G(緑)B、(青)、A(アルファ・チャンネル)の並びとなります。

なお、ここでは描画するウィンドウとして、 jit.pwindowオブジェクトを用いています。この場合は、 jit.pwindowを選択し、Objectメニューから「Get Info...」を選んでインスペクタを表示し、 Depthbuffer

72

Page 76: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

33 3次元物体の操作

をチェックし、Nameでウィンドウ名を設定することが必要です。また、多くのサンプル・パッチではウィンドウ名として stageを使っていますので、ひとつのパッチだけを開くようにしてください。

73

Page 77: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

34 3次元物体のマウス操作

34 3次元物体のマウス操作

マウスを使って物体の位置や回転を設定するには、 jit.gl.handleオブジェクトを用います。

jit.gl.handle アーギュメントには、対象となるウィンドウの名前を指定します。そして、

jit.gl.handleのアウトレットから操作する物体のインレットへパッチ・コードを繋ぎます。

マウスを使って3次元物体を操作する

このようにして、ウィンドウ上でマウスをドラッグすれば、その物体が回転します。 auto_rotateアトリビュートをオンにしている場合は、マウスで回転させた角度に従って、物体が自動的に回転し続けるようになります。Commandキーを押しながらドラッグすれば、物体は上下左右に移動します。いずれの場合も、Shiftキーを押していれば、回転や移動はX軸またはY軸方向に限定されます。さらに、Optionキーを押しながらドラッグすれば、物体は前後に移動します。

マウスで物体を回転移動している時は、物体のX軸を赤、Y軸を緑、Z軸を青として、それぞれの軸を中心とする補助円が描かれます。また、物体の axesをオンにすれば、物体の座標軸が描かれ、 jit.gl.renderオブジェクトの axesをオンにすれば、空間の座標軸が描かれます。このような補助線を参考にしながら、物体の回転移動操作をすれば良いでしょう。

ところで、 jit.gl.handleの出力を printオブジェクトで Maxウィンドウに表示すれば、 rotateメッセージや positionメッセージが出力されていることが分かります。ただし、 jit.gl.handleによる操作はパッチ・ファイルに保存されませんので、回転や移動を再現したい場合には、 jit.gl.handleの出力をメッセージ・ボックスなどに保存しておき、再度メッセージを送るようなパッチを作る必要があります。

74

Page 78: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

34 3次元物体のマウス操作

なお、 jit.gl.handleに resetメッセージを送れば、移動も回転もしていない状態に戻すことができます。また、Optionsメニューの「Help in Locked Patchers」を有効にしている場合は、Optionキーを押しながらクリックすればヘルプ・パッチが開きますので、この設定を無効にするか、クリックした後でOptionキーを押すようにします。

75

Page 79: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

35 複数の物体の描画

35 複数の物体の描画

jit.gl.gridshapeのような物体を描くオブジェクトをいくつか用意すれば、複数の物体を描くことができます。いずれの物体も描画するウィンドウは同じ名前でなければなりませんが、それ以外のアトリビュートを変えることで、それぞれの物体の形や位置、回転などを個別に操作することができます。

次のパッチでは、2つの jit.gl.gridshapeを用いて、ひとつは球、もうひとつはトーラスを描いています。

jit.gl.handleの出力は両方のオブジェクトに繋がっているので、マウス操作で2つの物体を同時に回転移動することができますが、いずれかのパッチ・コードを削除すれば、片方の物体だけを操作することになります。

2つのjit.gl.gridshapeによる2つの物体の描画

76

Page 80: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

35 複数の物体の描画

一方、同じ種類の物体であれば、ひとつのオブジェクトを使って複数の物体を描くことも可能です。この場合、まず、物体の automaticアトリビュートをオフにしておきます。そして、形状や位置などのアトリビュートを設定した後で、 bangメッセージを送れば描画が行われます。手順としては、レンダーへ eraseメッセージを送った後、 bangメッセージを送るまでの間に、このような処理を必要な回数だけ繰り返せば、複数の物体を描くことになります。例えて言うならば、物体のオブジェクトはスタンプのようなもので、 bangメッセージを受け取った時にスタンプを押すと考えても良いでしょう。

次のパッチには jit.gl.gridshapeはひとつしかありませんが、 automaticをオフにしています。そして、「 shape sphere」メッセージを送って物体を球に設定した後、 bangメッセージによって球を描画します。続いて、 shape torusメッセージを送って物体をトーラスに設定し、 bangメッセージでトーラスを描画します。 jit.gl.handle によるマウス操作では、両方の物体が同じように回転移動しますが、個別に

rotateメッセージや positionメッセージを送れば、独立して回転移動させることができます。

1つのjit.gl.gridshapeによる2つの物体の描画

ちなみに、デフォルトでは物体の automaticアトリビュートはオンになっており、 bangを受け取らなくても、レンダーが bangを受け取った時点で自動的に描画が行われます。このパッチでは、物体の automaticがオンであっても同じように描画されますが、描画する順序を明確にし、無駄な描画を避ける意味で、 automaticをオフにすると良いでしょう。また、bangを送らないことで、物体を消すこともできます。

77

Page 81: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

36 カメラの視界

36 カメラの視界

OpenGLでの3次元物体は、カメラから見た画像としてレンダリングされます。そこで、物体に変化がなくても、カメラの位置や向きを変えれば、レンダリングされる画像は異なることになります。ここでは、固定したトーラスとグリッド状の平面を例に、カメラの設定によって、どのように見え方が変わるかを見ていきます。なお、グリッド状の平面は、 shapeが planeである jit.gl.gridshapeオブジェクトですが、 poly_modeを1 1とし、ワイヤーフレームとして描いています。

カメラを操作して視界を変える

さて、カメラはレンダーである jit.gl.renderオブジェクトで設定します。最初に、 axesアトリビュートをオンにして、空間の座標軸を描くようにしておきます。そして、カメラの位置を cameraメッセージで指定します。カメラの位置を変えれば、物体とカメラの位置関係が変わり、レンダリングされる画像も変化します。デフォルトでは0. 0. 2.の位置にカメラがあります。

カメラの位置を変えれば画像が変わりますが、よく観察すれば、常に画像の中心は空間の原点であり、Y軸(緑の補助線)が上を向いていることが分かります。これは、 lookatアトリビュートで指定する点をカメラを見ており、 upアトリビュートで指定するベクトルが上を指すようにカメラが回転しているからです。これらの値を変えることで、カメラが向いている位置や回転を変えることができます。 lookatのデフォルト値は0. 0. 0.で、 upのデフォルト値は0. 1. 0.です。

現実のカメラと同じように、OpenGLのカメラでも視野角度を lens_angleアトリビュートによって変えることができます。デフォルト値は45度ですが、より大きな数値にすれば、より視野が広がり、結果として物体が小さく描かれることになります。

また、レンダーはデフォルトでは透視投影法によって描画しますが、 orthoアトリビュートを1または2にすれば、平行投影法に基づいて描画します。平行投影法では、透視法のような遠近感はなく、カメラからの距離によって物体の大きさは変化しません。 orthoの値が 1の場合はレンズの視野角度の影響を受け、 2の場合は影響を受けません。 orthoのデフォルト値は 0で、投射投影法になります。

なお、カメラからの距離として、 near_clipアトリビュートよりも近い部分や、 far_clipアトリビュートよりも遠い部分はクリッピングされ、描画されません。これらのアトリビュートを操作すれば、物体の一部が切り取られたように見えます。

78

Page 82: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

37 テクスチャーの適用

37 テクスチャーの適用

Jitterでは物体に画像をテクスチャーとして貼り付けることもできます。テクスチャーはレンダーが管理しますので、まず、レンダーに textureメッセージを送り、レンダーにテクスチャーを作成します。 textureメッセージのアーギュメントは、テクスチャーの名前とテクスチャー画像の横と縦とのピクセル数ですので、ここでは imageという名前のテクスチャーが作成されます。次に、物体に textureメッセージを送れば、アーギュメントで指定した名前のテクスチャーが物体に貼り付けられます。デフォルトのテクスチャーは白と灰色の市松模様となっています。

デフォルトのテクスチャーを貼り付けた立方体

79

Page 83: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

37 テクスチャーの適用

次に、テクスチャーとして独自の画像を使用します。このためには、 jit.qt.movieオブジェクトに readメッセージを送り、ピクチャー(静止画)あるいはムービー(動画)のファイルを読み込みます。 readメッセージに続いて、 bangメッセージを送ると、読み込まれた画像がマトリックスとして出力されます。そして、

textureメッセージにテクスチャー名とマトリックス名を続けてレンダーに送ると、指定したテクスチャーにマトリックス(画像)が割り当てられます。パッチでは「 prepend texture image」というオブジェクトがこの処理を行っています。読み込んだファイルがムービーであれば、動画のチェックボックスをチェックすると、 qmetroが bangメッセージを出力するたびに、新しいフレーム画像がレンダーに送られますので、テクスチャーは動画になります。

画像のテクスチャーを貼り付けた立方体

物体からテクスチャーを外すには、アーギュメントなしで単に textureというメッセージを送ります。レンダーからテクスチャーそのものを削除するには、 deletetextureメッセージにテクスチャー名を続けて送れば、指定したテクスチャーが消滅します。

テクスチャーは物体の色や光の影響を受けます。物体の色はデフォルトで0.5 0.5 0.5 1.(灰色)になっていますので、そのままではテクスチャーは本来の画像よりも暗く見えます。そこで、ここでは物体の色を1. 1. 1. 1.(白)として、本来の画像と同じテクスチャーになるように設定しています。また、 lighting_enableで光の影響を受けるように設定すれば、物体が光を受けてできる陰影がテクスチャーにも反映されます。

なお、物体へのテクスチャー・マッピング方法を指定する tex_mapメッセージや、より高度なテクスチャー作成のための jit.gl.textureオブジェクトも利用できます。

80

Page 84: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

38 物体の透明表現

38 物体の透明表現

これまでのOpenGLによる描画では、すべての物体は不透明でした。しかし、OpenGLでは物体が透けて背後が見えるような半透明表現も可能です。このためには、まず、半透明にしたい物体の blend_enableアトリビュートをオンにします。これで物体の描画をブレンドできる状態になります。そして、 colorアトリビュートで指定するRGBA形式の色の4番目の要素であるアルファ・チャンネルの値を1.より小さく設定します。アルファ・チャンネルの値が1.であれば、その物体は不透明ですが、値が小さくなるにつれて透明度が増していきます。そして、アルファ・チャンネルの値が 0.であれば、その物体は透明になり、見えなくなります。

colorアトリビュートによる透明表現

ただし、複数の物体が存在する時は、物体を描く順序に注意しなければなりません。以下のパッチでは、立方体の内部に球体があり、立方体を半透明にする場合は、最初に球体を描いてから立方体を描くようにします。つまり、半透明の物体よりも後ろ、または内部にある物体から先に描くわけです。

物体を描く順序を指定するには、物体の automaticアトリビュートをオフにし、描きたい順に bangメッセージを送ります。パッチでは、 updateという名前の receiveオブジェクトが bangメッセージを出力した時に、 bangbangオブジェクトで最初に球体、次に立方体という順序で bangメッセージを送っています。 automaticアトリビュートのデフォルト値は 1(オン)なので、通常の物体は bangメッセージを送る必要がありませんが、そのままでは描画順序を指定することができません。

ちなみに、 blend_enableアトリビュートがオンの時に、どのように物体をブレンドするかを blend_modeアトリビュートで設定することもできます。 blend_modeのアーギュメントはソース(描画元)とデスティネーション(描画先)のそれぞれについて、 0から 10までの数値でブレンド・ファクタを指定します。ここでは、 blend_modeサブパッチで指定ができるようになっています。 blend_modeのデフォルト値は 6 7です。

81

Page 85: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

38 物体の透明表現

colorアトリビュートのアルファ・チャンネルに基づいて透明度を指定すると、物体全体の透明度が変化します。これに対して、テクスチャー画像に含まれるアルファ・チャンネルを使えば、任意の形状で部分的な透明感の表現ができます。この場合は、物体にテクスチャーを貼り付け、そのテクスチャー画像のアルファ・チャンネルに透明度を示すグレースケール画像を持たせるだけです。

テクスチャーによる透明表現

ムービーやピクチャにアルファ・チャンネルが含まれていない場合も多いので、ここでは jit.qt.movieオブジェクトが出力する画像の明度をアルファ・チャンネルにしています。もちろん、適切なアルファ・チャンネルを持つ画像であれば、このような処理は不要です。また、 colorアトリビュートによる透明度の影響を避けるためには、 colorの値を1. 1. 1. 1.に設定するほうが良いでしょう。

82

Page 86: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

39 モデリング・データの利用

39 モデリング・データの利用

3次元物体として複雑な形状を用いたい場合には、あらかじめ3DCGアプリケーションを使って .obj形式のモデリング・データを作成しておき、そのモデルを利用する方法が考えられます。 .obj形式は多くの3DCGアプリケーションでサポートされています。

Ji tte rでは、 jit.gl.modelオブジェクトを使ってモデリング・データを描画することができます。

jit.gl.model では、まず read メッセージによってモデリング・データを読み込みます。Jitter には

apple.objなどのサンプルがインストールさていますので、これらを用いても良いでしょう。ここで、

verboseアトリビュートをオンにしておくと、モデリング・データに関する処理が行われる度に、Maxウィンドウに関連する情報が表示されます。

モデリング・データの表示

jit.gl.modelでモデルを読み込めば、そのモデルは他のOpenGLオブジェクトと同じように、大きさ、移動、回転などの操作をすることができます。これらの操作はモデル全体に対して行われますので、モデルの一部だけを操作することはできません。

83

Page 87: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

39 モデリング・データの利用

モデルにはテクスチャーを貼り付けることができます。この場合は、レンダーにテクスチャーを定義しておき、

jit.gl.modelに textureメッセージを送ります。 textureメッセージのアーギュメントは、適用するテクスチャーの名前ですが、 0を指定すればモデリング・データに含まれる本来のテクスチャーに戻ります。

テクスチャーを貼り付けたモデル

モデルの形状に対してテクスチャーをどのように貼り付けるかを決めるマッピング・モードは、 tex_mapアトリビュートで指定します。この値が 0であれば、モデリング・データで定義されたマッピング・モードを用います。 1の場合はオブジェクト・マッピング、 2は球体マッピング、 3はアイ・マッピングです。

また、モデルのマテリアル(表面の質感)は material_modeアトリビュートで設定します。この値が2であれば、モデリング・データに定義された本来のマテリアルとなり、 0なら colorアトリビュートで指定する色、 1なら拡散色が用いられます。モデリング・データにマテリアル情報が含まれていない場合は、いずれのマテリアル・モードであっても colorで指定した色が用いられます。

先に、モデルの一部だけを操作することはできないと述べましたが、モデリング・データにポリゴン・グループが定義されている場合は、特定のグループだけを表示するように設定できます。このためには、 drawgroupメッセージに続けてグループ番号を jit.gl.modelに送ります。 apple.objの場合は、リンゴの実がグループ 1、リンゴの蔕(へた)がグループ 2になっています。グループ番号を 0として指定した場合は、すべてのグループ、つまりモデル全体が表示されます。

また、ポリゴン・グループごとにテクスチャーを割り当てることもできます。このためには、 texgroupに続けて、グループ番号とテクスチャー名をアーギュメントとするメッセージを送ります。

84

Page 88: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

40 3次元空間の背景

40 3次元空間の背景

これまでのOpenGLによる描画は、灰色を背景として描かれていました。これは、レンダーが eraseメッセージを受け取ると、 erase_colorアトリビュートで指定された色で背景を塗りつぶすからです。 erase_colorのデフォルト値は0.2 0.2 0.2 1.で暗い灰色ですが、これを異なる色に設定することで、指定した色を背景にすることができます。

また、レンダーに draw_pixelsメッセージに続けてマトリックス名を送ると、そのマトリックスを画像として背景が描かれます。以下のパッチでは、 jit.qt.movieオブジェクトに readメッセージを送って、ムービー・ファイルを開いた後、ラジオボタンの「ムービーを背景に」を選びます。これでムービーを背景として、その前に jit.gl.gridshapeオブジェクトなどによる物体を描くことができます。

ムービー映像を背景に設定

ちなみに、ここでは便宜上、背景という言葉を使っていますが、実際にはレンダーは eraseメッセージを受け取れば、指定された色で描画領域全体を塗りつぶし、 draw_pixelsメッセージを受け取れば、指定された画像を描画領域全体に転送する、という処理を行います。その後にレンダーが物体の描画を行うので、背景を描いているように見えます。ただし、この「背景」と物体との間には空間的な前後関係があるわけではありません。

85

Page 89: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

40 3次元空間の背景

ところで、レンダーに eraseメッセージも draw_pixelsメッセージも送らずに物体を描画すると、どうなるでしょうか? パッチではラジオボタンで「背景なし」を選ぶと、この状態を確かめられます。物体をマウスでドラッグして移動すれば、物体が何重にも重なって描かれることが分かります。この時、 jit.gl.handleオブジェクトの visibleアトリビュートをオフにして、補助円を描かないほうが良いでしょう。このような描画方法は一般的ではありませんが、あえて eraseメッセージを送らないことで、特殊な効果を狙うことができます。

背景を描かずにトーラスを動かした結果

86

Page 90: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

41 3次元空間での画像表示

41 3次元空間での画像表示

jit.gl.videoplaneは、ムービーなどの2次元画像をOpenGLで表示するのに適したオブジェクトです。これは、画像をテクスチャとして貼り付けた平面ですが、 jit.gl.gridshapeオブジェクトなどより手軽に扱うことができます。具体的には、 jit.gl.videoplaneオブジェクトにマトリックスを送るだけで、そのマトリックスが画像として平面に表示されます。つまり、テクスチャーを管理する必要が無いわけです。

jit.gl.videoplaneによるムービー映像の表示

物体としての jit.gl.videoplaneは、 jit.gl.gridshapeなどの物体と同じように設定や操作ができます。ただし、 jit.gl.videoplaneの colorアトリビュートのデフォルト値は1.1. 1. 1.であり、デフォルトのままで画像がそのまま(暗くならずに)表示されるようになっています。

また、当然のことながら、 jit.gl.videoplaneは他の物体との位置関係によって、他の物体を隠したり、他の物体に隠されたりします。この点は、常に最奥に描画されるレンダーへの draw_pixelsメッセージによる背景画像と異なります。

jit.gl.videoplaneを使って画像を表示するメリットは、画像の拡大縮小、回転、補完、合成といった処理をグラフィック・カードのGPU(ハードウェア・アクセラレータ)を用いて実行できること、すなわち、CPUの負荷を減らすことができることです。 jit.gl.videoplaneに限りませんが、OpenGLの大半の処理はCPUによるソフトウェア処理ではなく、GPUによるハードウェア処理として高速に実行されます。従って、2次元画像の処理であっても、可能であればOpenGLとして処理するのが良いでしょう。

87

Page 91: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

42 3次元空間でのクロスフェード

42 3次元空間でのクロスフェード

先に述べたように、OpenGL描画はビデオカードのGPUを使って高速に実行することができます。ここでは、その実例としてビデオ・プレーンを2つ用いて、2つのビデオ映像のクロスフェードを行ってみます。ここでは、DV形式のムービーを用いることを想定して、 jit.qt.movieオブジェクトの解像度は720×480ピクセルとしています。Jitterのサンプル・ムービーに「 dvducks.mov」と「 dvkite.mov」がありますので、これらを読み込むと良いでしょう。

OpenGLによるクロスフェード

2つの jit.gl.videoplaneオブジェクトは、合成処理を行うので、 blend_enableアトリビュートをオンにしています。また、画像の前後関係を無視するために、 depth_enableアトリビュートはオフにします。レンダーの depth_enableアトリビュートもウィンドウの depthbufferアトリビュートもオフで構いません。そして、クロスフェード値に応じて、 jit.gl.videoplaneのアルファ・チャンネル値を変化させれば、クロスフェードが実現できます。OpenGLでの色の指定はRGBA形式ですので、 colorメッセージの4番目のアーギュメントがアルファ・チャンネル(透明度)の値になります。

さらに、このパッチでは jit.qt.movieも jit.gl.videoplaneもカラーモードとしてUYVY形式を用いています。UYVY形式はビデオ・カードのGPUで高速に処理できるピクセル・フォーマットです。カラーモードは jit.qt.movieや jit.gl.videoplaneの他、 jit.qt.grab、 jit.dx.grab、 jit.gl.texture、 jit.gl.slabといったオブジェクトで利用できます。なお、パッチのポップアップ・メニューを選んでカラーモードを変えれて確認できるように、ARGB形式とUYVY形式の変換には多少の誤差があり、まったく同じ画像が得られるわけではありません。

さて、あるコンピュータでこのパッチを実行すると、およそ60fps(フレーム/秒)の処理速度が得られました。カラーモードをARGB形式にすると25fps程度に落ちてしまいます。また、同等の処理を jit.xfadeオブジェクトを使ってマトリックス演算した場合には、15fpsの処理速度しか得られませんでした。処理速度は処理の内容や使用するハードウェアによって異なりますが、GPUをうまく活用することで、画像処理を高速化できる可能性があります。

88

Page 92: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

43 GPUによる画像処理

43 GPUによる画像処理

先に、OpenGLとビデオ・カードのGPUによる高速なハードウェア処理を紹介しましたが、GPUを直接的に活用するのが、 jit.gl.slabオブジェクトです。 jit.gl.slabは .jxsファイルに記述された処理をGPUで実行します。「 Cycling '74」フォルダの「 jitter-shaders」フォルダには百数十個もの .jxsファイルが用意されています。 .jxsファイルはテキスト・ファイルであり、C言語に似たGLSL言語などで記述しますので、独自の処理を追加することも可能です。

jit.gl.slabは fileアトリビュートで使用する .jxsファイルを指定しますが、 readメッセージで任意の

.jxsファイルを読み込むこともできます。 jit.gl.slabの出力はテクスチャー・メッセージと呼ばれ、そのパッチ・コードは青色になります。テクスチャー・メッセージは、 jit.gl.textureにテクスチャー名が続くメッセージで、マトリックス・メッセージが jit.matrixにマトリックス名が続くメッセージであることと似ています。これらを混同すると正しい処理ができませんが、 jit.gl.slabへの入力はテクスチャー・メッセージでもマトリックス・メッセージでも構いません。

次のパッチでは、 jit.qt.movieオブジェクトが出力するマトリックス(画像)を jit.gl.slabオブジェクトに送り、 jit.gl.slabでの処理結果であるテクスチャーを jit.gl.videoplaneオブジェクトに貼り付けています。ここでの jit.gl.slabの処理は td.wobble.jxsで、画像を波状に変化させるエフェクトです。

jit.gl.slabオブジェクトによる画像処理

jit.gl.slabオブジェクトの処理に対するパラメータは、 paramに続けて、パラメータ名とパラメータの値を続けたメッセージを送ります。どのようなパラメータが利用できるかは処理によって異なります。そこで、 getparamlistメッセージを送れば、 jit.gl.slabの第2アウトレットから全てのパラメータ名を得ることができます。また、 getparamtypeなどのメッセージを使ってパラメータの詳細を知ることもできます。

一方、ある処理のパラメータを理解するには、 .jxsファイルを開いて確認するのが簡単です。例えば、 td.wobble.jxsファイルの冒頭には、次のような記述があります。

<param name="lightpos" type="vec3" default="0.0 0.0 4.0" />

<param name="image" type="float" default="0" />

この場合は、 lightposという名前のパラメータの値のタイプは vec3(実数が3つ並んだベクトル値)、デフォルト値は0.0 0.0 4.0であり、 imageパラメータは float(実数)タイプで、デフォルト値は 0であることが分かります。

89

Page 93: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

43 GPUによる画像処理

なお、 op.add.jxsを用いてクロスフェードを作成したところ、前項と同じ条件で60fps弱の処理速度でした。ふたつの jit.gl.videoplaneによる処理に比べて、テクスチャー・データの jit.gl.videoplaneへの貼り付けが増えているため、僅かに処理速度が劣るようです。

jit.gl.slabオブジェクトによるクロスフェード

90

Page 94: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

44 2次元テキストの描画

44 2次元テキストの描画

OpenGLでテキストを描くには、 jit.gl.text2dオブジェクトまたは jit.gl.text3dオブジェクトを用います。その名前が示すように、 jit.gl.text2dは2次元のテキストであり、あたかもウィンドウの表面に描かれるように見えます。従って、映像のキャプション表示やゲームのスコア表示といった用途に適しています。これに対して、 jit.gl.text3dは立体物としてのテキストなので、他の物体と同じように空間的に回転させたり、移動させることができます。

2次元テキストを描くには、 jit.gl.text2dオブジェクトへ描画したい文字列を続けた textメッセージを送ります。以下のパッチでは「 text Hello World」というメッセージ・ボックスをクリックしてください。また、 texteditオブジェクトにテキストを入力してreturnキーを押せば、そのテキストが描画されます。

texteditオブジェクトの出力メッセージは、先頭に textというメッセージが付加されているので、そのまま

jit.gl.text2dへ入力することができます。

2次元テキストの描画

描画するテキストとして、 fontメッセージで使用するフォントを、 sizeメッセージでフォントのサイズを指定し、 alignメッセージで文字揃えを指定します。 alignのアーギュメントは、 0が左揃え、 1が中央揃え、 2が右揃えを意味します。テキストの色はcolorメッセージで設定します。このアーギュメントは他のOpenGLオブジェクトでの色指定と同じくRGBA形式の4つの数値です。

positionメッセージはテキストを描く位置をX座標値とY座標値で指定します。描画位置のデフォルト値は 0 0で、ウィンドウの中央になります。テキストの大きさは scaleメッセージで指定し、アーギュメントはX方向の拡大率とY方向の拡大率を意味します。また、 rotateメッセージでテキストを回転することができ、アーギュメントでその角度を指定します。このように、 jit.gl.text2は2次元平面に描かれるテキストなので、奥行き(Z座標)に関する指定はありません。

ちなみに、 scaleでの大きさの設定は、 sizeで指定したフォント・サイズでビットマップとして描かれたテキストを拡大または縮小することになります。従って、大きな文字を滑らかに描きたい時は、 scaleではなく sizeの値を大きくするほうが良いでしょう。

91

Page 95: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

45 3次元テキストの描画

45 3次元テキストの描画

jit.gl.text3dオブジェクトも、 jit.gl.text2dオブジェクトと同じように、 textメッセージで指定された文字列を描画します。 fontメッセージでテキストのフォントを指定し、 alignメッセージで文字揃えを指定することも jit.gl.text2dと同じです。しかし、フォント・サイズを指定する必要はありませんし、 sizeアトリビュートも存在しません。 jit.gl.text3dは、位置が回転に応じて常に滑らかに描かれるからです。

3次元テキストの描画

また、 jit.gl.text3d によるテキストは 3 次元物体として扱われ、大きさ( scale)、位置( position)、回転( rotate)を指定することができます。アーギュメントの並びは他のOpenGL物体と同じように、大きさと位置は、X、Y、Z、回転は角度、X、Y、Zとなります。 jit.gl.handleオブジェクトを使って、マウス操作しても良いでしょう。テキストの色は colorアトリビュートで、RGBA形式として設定します。

jit.gl.text3dの特別なアトリビュートは depthで、これは文字の厚みを指定します。 scaleアトリビュートのZ方向の値は、文字の厚みに対して拡大または縮小することになります。デフォルトの depthの値は 0で、厚みはありません。 depth値が 0であれば、 scaleによって拡大しても厚みは得られません。

92

Page 96: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

46 日本語の表示

46 日本語の表示

現在のバージョンのJitterは日本語の表示に制限があります。 jit.lcdオブジェクトや jit.gl.text2dオブジェクトなどで、日本語フォントを指定しても、一部の漢字が正しく表示されません。例えば、「日本語表示」というテキストは「日本語」は正しく描画されますが、「表示」は異なる文字に化けてしまいます。これは、Maxでの日本語など2バイト文字の扱いに制約があるためです。本質的な解決はMaxの対応を待つしかありませんが、ここでは対応策をいくつか挙げておきます。

まず、最も簡単な解決策は、あらかじめ日本語テキストを描いたピクチャーやムービーを他のグラフィックス・アプリケーションで作成しておき、 jit.qt.movieオブジェクトで読み出すことです。これは単なる画像ですから、文字が化けることもありません。

もうひとつの方法は、テキスト・ファイルに日本語テキストを記述しておき、 jit.qt.movieオブジェクトで読み出すことです。この場合は、テキスト・ファイルの1行ごとに画像に変換され、フレームとして出力されます。以下のパッチでは、 jit.qt.movieに getmoviedimメッセージを送れば、ムービー本来の解像度に応じて表示の解像度を設定しますので、最適な表示が得られるようになっています。

QuickTimeによる日本語表示

さらに、テキスト・ファイルにテキスト・トラック・ディスクリプタと呼ばれるタグを含めておけば、テキストのフォントやサイズ、描画位置などを細かく指定することもできます。テキスト・トラック・ディスクリプタの詳細については、AppleのWEBサイトから入手できます。

テキスト・ファイルを読み込んだムービーは、通常のムービーとは時間の扱いが異なりますので、特定のフレームを表示するには frame_trueメッセージを用います。フレーム番号は 0から始まりますので、テキスト・ファイルの1行目は 0番目のフレームになります。

93

Page 97: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

46 日本語の表示

Op enGLで 2 次元または3 次元のテキストを表示したい場合は、 jit.gl.text2dオブジェクトや

jit.gl.text3dオブジェクトを用いますが、これらのオブジェクトでも textメッセージによる日本語表示には問題があります。しかし、テキストをシフトJISコードに変換し、そのコードを1バイトごとにセルに収めた

char型のマトリックスを送れば、正しく描画されます。フォントは日本語フォントを指定しておきます。例えば、「表示」のシフトJISコードは「149 92 142 166」(16進数表記なら「0x95 0x5C 0x8E 0xA6」)です。

OpenGLによる日本語表示

94

Page 98: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

47 映像のネットワーク転送

47 映像のネットワーク転送

Jitterにはネットワークを通じて手軽に映像を送受信するオブジェクトが用意されています。それが送信用のオブジェクトである jit.net.sendと、受信用のオブジェクトである jit.net.recvオブジェクトで、TCP/IP方式でネットワーク通信を行います。従って、ローカル・ネットワークはもちろんのこと、インターネットに接続している世界中のコンピュータと通信を行うことができます。

マトリックスのネットワーク送受信

送信を行う jit.net.sendオブジェクトでは、 ipアトリビュートで送信先のIPアドレスを指定し、 portアトリビュートで送信に用いるポート番号を指定します。IPアドレスの代わりに、 hostアトリビュートに送信先のドメイン名を指定しても構いません。 ipのデフォルト値は「127.0.0.1」で、これは使用しているコンピュータ自身を表します。 hostのデフォルト値は「 localhost」で、これも使用しているコンピュータ自身を表します。 ipのデフォルト値は7474です。

同じように、受信を行う jit.net.recvオブジェクトでも、 ipアトリビュートで送信元のIPアドレスを指定します。IPアドレスが、デフォルト値でもある「 ANY」であれば、送信元のIPアドレスに関わらず、すべてのコンピュータからの送信を受け入れます。特定のIPアドレスを指定した場合は、そのIPアドレスからの送信のみを受け付け、他のIPアドレスからの送信は無視します。受信するポート番号は portアトリビュートで指定し、デフォルト値は7474です。

以上のようにIPアドレスやポート番号を設定した上で、 jit.net.sendオブジェクトにマトリックスを送ると、そのマトリックスが指定した送信先に送られ、受信したマトリックスは jit.net.recvオブジェクトから

95

Page 99: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

47 映像のネットワーク転送

出力されます。送受信ができない場合には、IPアドレスやポート番号の設定を確認するとともに、ファイアウォールによって通信が遮断されていないかも確認する必要があります。

なお、ここでは送受信するデータ量を減らすために、 jit.argb2grbgオブジェクトによって画像をARGB形式からGRGB形式に変換しています。GRGB形式はアルファ・チャンネルを含まず、視覚的に重要度が低い赤と青の要素を水平方向に半分の解像度にすることで、ARGB形式の半分のデータ量になります。そして、GRGB形式をARGB形式に戻すには、 jit.grgb2argbオブジェクトを使います。

また、補助的な機能として、 jit.net.sendの第2インレットに入力した任意のメッセージは、受信した

jit.net.recvの第2アウトレットから出力されます。この機能を使って、パッチのリモート・コントロールなどを行うことができます。

96

Page 100: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

48 映像のストリーミング配信

48 映像のストリーミング配信

jit.net.sendオブジェクトと jit.net.recvオブジェクトは、基本的に1:1のネットワーク通信を行います。これに対して、複数のクライアント(受信するコンピュータ)に向けて映像を配信するには、

jit.broadcastオブジェクトを用います。 jit.broadcastは、 startメッセージを受け取ると、入力されているマトリックスをストリーミング形式でブロードキャストします。ブロードキャストの停止は stopメッセージです。

映像のストリーミング配信(左)と受信(右)

ストリーミングに用いる圧縮コーデックは vcodecアトリビュートで設定します。圧縮コーデックは mpeg4、 h263、 jpegの3種類から選ぶことができ、デフォルトは mpeg4です。ポート番号は vportアトリビュートで設定し、デフォルト値は8554、ストリーム名の設定は streamnameアトリビュートで、デフォルト値は jitStreamとなっています。これらはデフォルトのままでも構いません。配信は通常誰でも受信できますが、特定の受信者にだけ配信を行うユニキャストの設定も可能です。

startメッセージを受け取ると、 jit.broadcastは第2アウトレットから配信しているストリームのURLを出力します。URL は「rtsp://123.223.323.423:8554/jitStream」といった形式になります。このURL をQuickTimePlayerなどのストリーミング受信ができるアプリケーションで開けば、配信されている映像を受信することができます。同じコンピュータで受信を確認する場合は、IPアドレスとして「127.0.0.1」を指定しても構いません。 jit.qt.movieオブジェクトでもストリーミングを受信する場合は、 readメッセージにURL続けて送ります。

97

Page 101: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

48 映像のストリーミング配信

QuickTime Playerによるストリーミング受信

URLからも分かるように、 jit.broadcastオブジェクトは内部的にRTSP形式のストリーミング・サーバを運用しています。 jit.broadcastによる映像配信は、レイテンシー(時間的な遅れ)や画像の劣化がありますが、 jit.net.sendオブジェクトよりもデータ量が少なく、ネットワークに対する負荷が少なくて済みます。

なお、ストリーム配信には jit.qt.broadcastオブジェクトも利用できます。 jit.qt.broadcastではSDP形式のストリーミングを行い、指定できるコーデックの数が多く、映像だけでなく音声も配信できるといった特徴があります。

98

Page 102: Jitter入門マニュアル - akihiko taniguchiokikata.org/ma3/jitterbook/Jitter_book.pdf · 2012-04-17 · たライブラリです。Jitterが提供するオブジェクトは160種類以上もありますので、初めてJitterに接する人は、膨

おわりに

おわりに

最初に記したように、Jitterは数多くの機能を備えていますので、様々な活用方法が考えられます。MaxやMSPの機能も含めて考えれば、無限とも言えるほどの膨大な可能性に満ち溢れています。従って、本書ではJitterの僅かな部分にしか言及していないとも言えます。また、本書で説明した事柄についても、それだけが唯一無二というわけではなく、異なる方法を用いるほうが良い場合もあるかもしれません。そもそも、プログラミングは何らかの問題解決のために行うのですから、目的や条件によって、最適な解決方法を自ら見つけ出さねばならないわけです。

最後に、今後Jitterの理解を深めるために活用できるリソースを挙げておきます。もちろん、もっとも基本となるのは、Jitterに付属する各種ドキュメントです。これには、チュートリアルを中心とするマニュアルのPDFファイル、オブジェクトごとのヘルプ・ファイルや詳細説明のHTLMファイルなどがあります。いずれも英文であり、文章量も多いのですが、臆せずに取り組んでください。

また、Jitterの開発元であるアメリカのCycling '74社のWEBサイトも重要です。このサイトも英文ですが、最新のアップデータや関連情報が得られ、メーリング・リストに加入することもできます。

Cycling '74社WEBサイト

http://www.cycling74.com/

Jitterは扱っていませんが、Max/MSPの日本語解説書には「トランスMaxエクスプレス」があります。この書籍では、Max/MSPの初心者にとって有益な基本的な事柄から、より高度な応用手法まで詳細に説明されています。本書では充分に説明しきれなかったMaxのプログラミング方法については、この書籍を参考にしてください。なお、同じ著者によるMax関連の解説書である「マジカルMaxツアー」は絶版となっており、入手困難です。

書籍「トランスMaxエクスプレス」

ノイマンピアノ(赤松正行+佐近田展康)著

リットーミュージック社刊 ISBN:4-8456-0711-5

同書籍オフィシャルWEBサイト

http://max.iamas.ac.jp/

レクチャー、ワークショップ、プレゼンテーション、コンサートからなる5日間の「DSPサマースクール」は、1999年より毎年1回開催されており、2002年にはJitterの開発者を招聘して行われました。2005年以降の開催は未定です。

DSPサマースクールWEBサイト

http://dspss.iamas.ac.jp/

ボランティアで運営されているJitterの日本語オフィシャルWEBサイトでは、Jitterに付属するチュートリアルの日本語訳や関連情報が提供されています。

Jitter日本語オフィシャルWEBサイト

http://jitter.iamas.ac.jp/

「Max Objects Database」は、Jitterを含めてMax関係の拡張オブジェクトやパッチなどを検索できるWEBサイトです。標準ではサポートされていない処理であっても、適切なオブジェクトを利用することで簡単に実現できることがありますので、プログラミングに行き詰まった時に活用すると良いでしょう。

Max Objects Database WEBサイト

http://www.maxobjects.com/

「cv.jit (computer vision for jitter)」はJean=Marc Pelletier氏が開発した画像解析のための無償のライブラリです。Jitterは基本的な画像解析機能しか持っていないので、より高度な画像解析を行いたい場合は、このライブラリを利用すると良いでしょう。

cv.jit WEBサイト

http://www.iamas.ac.jp/̃jovan02/cv/

その他の主要な関連情報やWEBサイトは、ここに紹介した各WEBサイトからリンクを辿ることができます。

99