Jitter入門マニュアル 赤松 正行 目次 はじめに ..................................................................................................................1 第1部 Jitter の基礎................................................................................................2 01 02 03 04 05 06 07 08 09 10 11 プログラミングの基本..................................................................................................................................... 2 右から左への順序............................................................................................................................................. 4 ムービーの表示................................................................................................................................................. 6 ムービーの再生............................................................................................................................................... 10 メッセージの処理........................................................................................................................................... 11 ユーザ・インターフェース........................................................................................................................... 14 初期設定と設定保存....................................................................................................................................... 16 アトリビュート............................................................................................................................................... 18 メッセージの解釈........................................................................................................................................... 19 画像エフェクト............................................................................................................................................... 20 マトリックス................................................................................................................................................... 22 第2部 Jitter の応用..............................................................................................24 01 ムービーの再生............................................................................................................................................... 24 02 ムービーのループ指定................................................................................................................................... 26 03 ムービー再生位置の指定............................................................................................................................... 27 04 ムービー再生位置の取得............................................................................................................................... 28 05 マウス情報の取得........................................................................................................................................... 30 06 フルスクリーン表示....................................................................................................................................... 31 07 表示領域の指定............................................................................................................................................... 32 08 画像の変形....................................................................................................................................................... 34 09 画像の色調整................................................................................................................................................... 36 10 画像のモノクローム化................................................................................................................................... 37 11 カラースペースの変換................................................................................................................................... 38 12 画像のモザイク化........................................................................................................................................... 40 13 映像の残像効果............................................................................................................................................... 41 14 QuickTimeエフェクト..................................................................................................................................... 42 15 画像のサンプリング....................................................................................................................................... 44 16 映像のディレイ............................................................................................................................................... 45 17 画像の貼り付け............................................................................................................................................... 46 18 画像の重ね合わせ........................................................................................................................................... 48 19 クロスフェード合成....................................................................................................................................... 49 20 マスク合成....................................................................................................................................................... 50 21 クロマキー合成............................................................................................................................................... 51 22 図形の描画....................................................................................................................................................... 52 23 テキストの描画............................................................................................................................................... 54 24 特定色の検出................................................................................................................................................... 55 25 動きの検出....................................................................................................................................................... 57 26 ファイルへの保存........................................................................................................................................... 59 27 ビデオ機器からの画像入力........................................................................................................................... 61 28 ビデオ機器のコントロール........................................................................................................................... 63 29 ビデオ機器への画像出力............................................................................................................................... 65 30 音量による画像処理....................................................................................................................................... 67 31 波形の描画....................................................................................................................................................... 68 32 3次元描画の基本............................................................................................................................................. 70 33 3次元物体の操作............................................................................................................................................. 72 34 3次元物体のマウス操作................................................................................................................................. 74 i 目次 35 複数の物体の描画........................................................................................................................................... 76 36 カメラの視界................................................................................................................................................... 78 37 テクスチャーの適用....................................................................................................................................... 79 38 物体の透明表現............................................................................................................................................... 81 39 モデリング・データの利用........................................................................................................................... 83 40 3次元空間の背景............................................................................................................................................. 85 41 3次元空間での画像表示................................................................................................................................. 87 42 3次元空間でのクロスフェード..................................................................................................................... 88 43 GPUによる画像処理....................................................................................................................................... 89 44 2次元テキストの描画..................................................................................................................................... 91 45 3次元テキストの描画..................................................................................................................................... 92 46 日本語の表示................................................................................................................................................... 93 47 映像のネットワーク転送............................................................................................................................... 95 48 映像のストリーミング配信........................................................................................................................... 97 おわりに ................................................................................................................99 ii はじめに はじめに 音楽制作や音 響処理のためのプログラミング環境には、いくつかのソ フトウェアがありますが、その中でも 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 第1部 Jitterの基礎 第1部 Jitterの基礎 Jitter は、プログラミング言語で あるMaxの機 能を拡張する追加ライブラリで す。従って、Jitterを活用す るために は、Maxに よるプログラミン グ方法を習得す る必要があります。こ こでは、Maxのプログ ラミング方法に 触れな がら、Jitter の基本的な使い方を見ていきます。 01 プログラミングの基本 Maxで は、いくつかのオブジェク トを並べ、オブジェクト 同士をパッチ・コードで 繋ぐことでプログラミ ングを 行います。オ ブジェクトは何らかの機 能を持ち、その中にはマウスで 操作したり、情報を表示する ユーザ・イン ターフェ ース・オブジェクトもありま す。このようなオブジェクトと パッチ・コードの集まりをパ ッチ(または パッチャー)と呼びます。 オ ブジェク トをクリ ックする といっ た何らか のイベン トに応 じて、あるオ ブジェク トから メッセー ジが出力 さ れ、パッチ・コー ドを伝わって次のオブジ ェクトに送られます。メッセー ジを受け取ったオブジェ クトは、何ら か の処理を 行い、さら に他の オブジェ クトに メッセー ジを送 ります。こ のように して、オブ ジェク トからオ ブ ジ ェクトへ とメッ セージ が流れ ていく ことで、全体 の処理 が進行 します。な お、オブジ ェクト の動作は、ア ー ギュメン トと呼ばれる数値や文字列に よって指定することができ、メッセ ージによって動作を変更する こともで きます。また、オ ブジェクトからメッセージ を出力する部分をアウトレ ットと呼び、メッセージを受け 取る部分 をインレットと呼びます。 次の 例は足し算を 行うパッチです が、上部にある 3とい うメッセージ・ボ ックスをクリッ クすれば、その数 値の メッセージが出力され、パッチ・コードを伝わって +オブジェクトに送られます。数値を受け取った + オブジェク トは、ア ーギュメ ントとして 与えられた 10 を足し 算して、その 結果を出力 します。そして、最 後にナン バー・ ボックス が受け取った数値を表示す れば、パッチの処理は完了です。パ ッチ・コードを伝わるメッセー ジが目に 見えるわけではありませんが、Maxはこのような仕組みでパッチを実行しています。 オブジェクト マウス・クリックされた! (メッセージ・ボックス) パッチ・コード アウトレット インレット オブジェクト 「3」に「10」を加算する (+オブジェクト) パッチ・コード 「3」というメッセージを送る アウトレット インレット オブジェクト 「13」というメッセージを送る 「13」を表示する (ナンバー・ボックス) パッチと処理の流れ 2 01 プログラミングの基本 Maxの基本的なメッセージには、以下の種類があります。 int メッセージ float メッセージ symbol メッセージ list メッセージ bang メッセージ 整数(小数点以下を持たない数値) 実数(小数点以下を持つ数値) シンボル、英単語などの文字列 複数の数値から成るメッセージ オブジェクトを動作させる特別なメッセージ 例: 100、 -25、 0 例: 3.14、 -0.25、 0.0 例: read、 start、 stop 例: 0 1 2、 10 -0.5、 0.1 0.2 100 例: bang また、これらを組み合わせたメッセージもあります。 例:read myfamily.mov、jump 200.36、start 0 Maxの メッセージが流れるパッ チ・コードは黒い実線になり ます。これに対して、MSP が処理する音響デ ータで あるシグナ ルが流れるパッチ・コードは黒と黄 色の模様で描かれ、Jitter が処理する画像データであるマ トリック スが 流れるパッチ・コ ードは緑色の 太線になり ます。また、同じ Jitterで も、OpenGLで用いる テクスチャー が流 れるパッチ・コードは青色の太線です。 3 02 右から左への順序 02 右から左への順序 Maxプ ログラミングにお いて重要な事柄は、メ ッセージは「右から左 への順序(right-to-left order)」で処 理され る、ということです。例えば、+オブジェクトは2つのインレットを持っていますが、「3 + 4」という計算をし たい場合には、まず右のインレットに 4 を送った上で、左のインレットに3 を送る必要があります。逆の順番では 正し い計算が行わ れません。一部 の例外を除い て、ほとんどの オブジェクト は右(2番目 およびそれ以 降)のイ ンレット にメッセージを受け取った場 合は、その内容をオブジェクト 内部に格納するだけです。そして 左のイン レッ ト、すなわち第 1インレ ットにメッセー ジを受け取っ た時に実際の処 理を行い、処理結 果をアウトレッ トか ら出力します。従って、インレットにメッセージを送るには、右から左への順序で送らなければなりません。 インレットの右から左へとメッセージを送る 同じよう に、複数のアウトレットを持つオ ブジェクトであれば、右から左 の順序でアウトレットからメ ッセージ を出力し ます。例えば、unpackオ ブジェクトは、受け取った数字の リストを分解し、個別の数字とし て各アウ ト レッ トか ら出 力 しま す。出力 は瞬 間的 に行 われ る ので、同 時に 出力 され てい るよ う に見 えま す。しか し、 print オブジェクトによる Maxウィンドウの表示を見れば、右のアウトレットから先に出力されていることが分 かります。 アウトレットの右から左へとメッセージが出力される 4 02 右から左への順序 ひとつの アウトレットから複数のオブ ジェクトのインレットにパ ッチ・コードが繋がれている場合 も、メッセー ジが 送られる順序は 右から左への順 序となります。次の 例では、メッセージ・ボ ックスをクリッ クすれば、+ オ ブジェクトにも *オブジェクトにも 3 というメッセージが送られます。ただし、最初に右側にある* オブジェクト にメ ッセージ が送られ、一 連の処理 が完了した 後、すなわち 右側のナ ンバー・ボッ クスに表示 し、print オブ ジェクトが Maxウィンドウに表示した後に、左側の+オブジェクトにメッセージが送られます。このことは、Max ウィンド ウの表示で確認できます。なお、複 数のオブジェクトの左右の 位置が同じであれば、より下に あるオブ ジェク トから順にメッ セージが送られま す。これは「下から上への 順序(bottom-to-top order)」として覚 えてお くと良いでしょう。 右のオブジェクトから左のオブジェクトへとメッセージが送られる このよう に、インレットについてもアウ トレットについても、そしてオ ブジェクトの並びについて も、メッセー ジの流れは右から左への順序となるのが、Maxプログラミングの原則です。 5 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 03 ムービーの表示 次 に、オブジェ クト・パレ ットの 中程に あるネ コのアイ コンを クリッ クし、パッ チ・ウィン ドウの 空白部を ク リックすれば、黒い長方形が現れます。これは jit.pwindow と呼ばれるオブジェクトで、ムービーなどの画像 を表 示する機能を 持っています。さ らに、オブジェク ト・パレットの左 から2 番目にある メッセージ・ボッ クス を作り、「read」とタイプして確定します。また、オブジェクト・パレットの 4番目にある Button(ボタン) オブジェクトも作ります。 Buttonオブジェクト メッセージ・ボックス jit.pwindowオブジェクト jit.pwindow オブジェクト、メッセージボックス、Button オブジェクトの作成 以上で、ムー ビーを表示するのに必要な オブジェクトが揃いました ので、次にオブジェクトをパッ チ・コードで 繋いでい きます。まず、メッセージ・ボックス の左下のアウトレットをク リックし、そのままマウスを ドラッグ すると、マウ スの動きに従って、黒い実線 が延びていきます。そして、 jit.qt.movie オブジェクト の左上の イン レットまで マウス・カーソ ルを動かして、マ ウス・ボタンを 離せば、2つの オブジェク トがパッチ・コ ード で結ばれます。 アウトレットからインレットへのパッチ・コードの接続 7 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 03 ムービーの表示 ところで、jit.qt.movieオブジェクトから jit.pwindow オブジェクトへのパッチ・コードは緑色になって いますが、この パッチ・コードは Jitter オブジェクト が扱うマトリックス・メッセージが流れるこ とを示して い ます。マト リック スと は行列 の意味 で、ここで は映 像の 1フレ ーム 分の画 像デー タのこ とだ と考え て良い で しょ う。これに対し て、黒いパッチ・コ ードは bang、整数、実数、シン ボル、リストと いった Maxのデー タが 流れます。 9 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 05 メッセージの処理 05 メッセージの処理 Maxや Jitterのプログラミングでは、どの ようなオブジェクトを用いる かだけでなく、どのようにメッセ ージを用 い るかが重 要にな ります。そこ で、ここで はメッセ ージを取 り扱う 便利な方 法をい くつか紹 介して おきまし ょ う。 QuickTime ム ービ ーを 再生す る jit.qt.movie オブ ジェ クトは、様 々な メッ セー ジに 対応し てい ます。例 え ば、rate メ ッセ ージ は、その アー ギュ メ ント によ って ムー ビー の再 生速 度を 指定 しま す。つま り、「rate 1.0」なら標 準の再生速度であり、「 rate 0.5」なら半分の速 度、「rate -2.0」なら逆方 向の2倍 速とな ります。このように、特定の再生速度を指定する場合は、メッセージ・ボックスを利用するのが良いでしょう。 再生速度を指定するメッセージ・ボックス 11 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 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 06 ユーザ・インターフェース 06 ユーザ・インターフェース ナンバ ー・ボックスのように、ユーザが操 作したり、何らかの情報を表 示するオブジェクトを、特に ユーザ・イ ンターフ ェース・オブジェクトと呼び ます。オブジェクト・ボックスとし て用いるオブジェクトは、直 接的には 操作や 表示ができませんので、ユーザ・イ ンターフェース・オブジェク トではなく、ノーマル・オブジェ クトと 呼ばれます。 ユーザ・イ ンターフェース・オブジェク トは、オブジェクト・パレットか ら作成することができま す。そして、 多くのユ ーザ・インターフェースのオブ ジェクトは、インスペクタを使 って様々な設定を行います。イ ンスペク タを 開くには、オブジェ クトをクリックし て選択し、Object メニューから「Get Info...」を選びます。インス ペク タ の内容は オブジ ェクトに よって 異なりま すが、ナンバ ー・ボック スのイン スペク タは次の ように なってい ま す。このイ ンスペクタでは、ナンバー・ボック スが扱う数値の範囲を設 定したり、ナンバー・ボックスの 動作や 外観などの設定か可能です。 ナンバー・ボックスのインスペクタ 14 06 ユーザ・インターフェース オブジェ クト・パレットから分かるよ うに、ユーザ・インターフェース・オブ ジェクトには多くの種類 がありま す。例えば、再 生速度をスライダーで操作 するにようにすれば、直観的 に分かり易くなるでしょ う。ただし、水 平ス ライダー(hslider オブジェク ト)は、整数しか扱え ませんので、再生 速度に適した実 数に変換する 必要 があります。ここでは、スライダーの範囲を 401、オフセットを -200 とすることで、スライダーから-200 から 200までの整数が出力されるように設定し、その出力に 0.01を掛けることで -2.0 から2.0 までの実数で再生速 度を指定するようにしています。 スライダーによる再生速度の指定 なお、水平スライダーの他にも、垂直スライダー(vsliderオブジェクト )、多目的に使えるマルチ・スライダー (MultiSlider オブジェクト)など数多くのユーザ・インターフェース・オブジェクトがありますので、目的 に応じて適切なオブジェクトを用いれば良いでしょう。 15 07 初期設定と設定保存 07 初期設定と設定保存 複雑なパ ッチになれば、設定を手動で 行うのは面倒であり、間違いが 起こりがちです。そこで、パッチ の自動設 定を 行うために、loadbang オブジェ クトが用意され ています。loadbang オブジェ クトは、パッチが開 いた 時に bang メッセージを出力します。これを利用して、再生速度の初期値を 0.5 にしたい場合は、loadbang オ ブジェク トから 250 というメッ セージ・ボックスへ bangを 送り、250 をス ライダーに送るようにすれ ば良いで しょう。こ れは、スライダーのオ フセットが -200 なので、250 を受け取ったスラ イダーは、オフセット を足し て 50 を出力します。そして、50に 0.01 が掛けられて 0.5 となり、rate のアーギュメントが 0.5 となるからで す。 スライダーの初期状態の自動設定 16 07 初期設定と設定保存 ま た、数多く の設定 が必要 な場合 は、preset オブジェ クトが 利用で きます。 preset オ ブジェ クトは、同 じ パ ッチ・ウィン ドウに あるユ ーザ・イン ターフ ェース・オブ ジェク トの状 態を記 憶し、呼び 戻すこ とができ ま す。preset オブジェクトを パッチに作成すれば、パッチを 実行状態にして、shift キーを押しながら preset オ ブジェ クトのプリセット(マス目)のど れかをクリックします。こ れで、ユーザ・インターフェース・オ ブジェ クトの状 態が記憶され、プリセットに は黒い点が付きます。そして、プリ セットをクリックすれば、記 憶した状 態が呼び戻 されます。プリセットは左上から順に 1、2、3... という番号に対応しているので、整数 のメッセー ジを送れば、そのプリセットが呼び出されます。そこで、ここでは loadmess オブジェクトを用いて、すべての ユー ザ・インター フェース・オ ブジェク トの初期 設定を行 うようにし ています。 loadbang オ ブジェク トは、 パ ッチが開 いた時に bang メッ セージを 出力しま すが、loadmess オブジ ェクト はアーギ ュメント で指定し た メッセージを出力します。 preset オブジェクトによるユーザ・インターフェースのプリセット 17 08 アトリビュート 08 アトリビュート オ ブジェク ト・ボック スでは、ア ーギュメ ントに よってオ ブジェ クトの 内部状態 の初期 設定が できます。例 え ば、jit.qt.movie オブジ ェクトなら、2 つの整数の アーギュメン トで出力す る画像の解像 度を指定し ます。 このようなア ーギュメントはMax でもMSP でも用いられますが、Jitter 独自の方法がアトリビュート による指定で す。アトリビ ュートはアトリビュート名 で示すオブジェクトの内部 状態のことです。オブジェクト・ボ ックスで は、@ に 続けて アトリ ビュ ート名 を指定 し、スペ ース(空白 文字)で区 切っ てアト リビュ ート の値を 指定し ま す。例えば、 jit.qt.movie オブジ ェクトの再生速度 を表すアトリビュ ートは rate なので、 @rate 0.5 と すれば、再生 速度として半速を指定した ことになります。アトリビュー トはいくつでも指定するこ とができ、任 意の順番で並べることができます。 オ ブジェク ト・ボック スでのア トリビ ュートの 指定は初 期状態 を設定す るだけ なので、その 後にメ ッセージ を 送って、アト リビュートの値を変更して も構いません。また、メッセージに よってアトリビュートを読 み出すこ ともできます。 rate アトリビュートの 場合は、rate メッセージで 値を変更し、getrateメッセ ージで値を読 み出します。 getrate メッセージを 受け取った jit.qt.movie オブジェクトは 第2アウト レットから、rate 1.0 といったメッセージを出力します。 アトリビュートの指定と読み出し 18 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 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 10 画像エフェクト な お、このパッ チでは 最終的に 表示す る画像サ イズに合 わせて ムービー の画像 サイズを 指定し ています。し か し、回転など の画像エフェクトでは、最終画 像より大きなサイズの画像 を用いて処理するほうが、美し い結果が 得られま す。また、interp アトリ ビュートなどで指定できる インターポレーション(補間)を有効 にすれば、 好ましい 結果が得られる場合が多いでしょ う。ただし、いずれも処理に必要な CPUパワーが増大し ますので、目 的と環境に応じて設定する必要があります。 21 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 11 マトリックス マトリックスの内容は直接確認することはできませんが、jit.printオブジェクトや jit.matrixinfo オブ ジ ェクト、そ して オブジ ェクト・パ レッ トにあ る jit.fpsgui オ ブジ ェクト を使 って確 認する こと ができ ま す。特に、jit.fpsguiオブジェクトは1秒あたりに処理されるフレーム数(fps)を表示できますので、処理速 度を把握するのに便利です。 マトリックスの確認 また、これま で見てきたムービー再生の パッチでは、マトリックスを生 成したり、マトリックス名を指 定してい ないよう に見えるかもしれません。しか し、実際には、jit.qt.movieオ ブジェクトが重複しない名 前を持っ たマトリ ックスを生成し、ムービーの画像 をマトリックスに収めて、その マトリックスの名前をアウト レットか ら 出力しま す。そして、そ のマト リックス 名を受 け取った オブジ ェクト は、名前で指 定され るマト リックス の データを処理して、エフェクトをかけたり、画面に表示しているわけです。 23 第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 01 ムービーの再生 通常ムー ビーは再生速度に従って再生 されますが、framedumpメ ッセージを送ると、再生速度とは 無関係に、 可能な限 り速く全ての画像フレーム を順次出力します。これは、非リア ルタイムに映像エフェクト をかけて、新 しいムービーとして保存するような用途に向いています。 な お、jit.qt.movie オブ ジェ クト は QuickTime VR やMacromedia Flash を含 むム ービ ーの 再生 だけ でな く、 ムービー やトラックの作成や編集、ムー ビーの保存、他の形式でのイン ポートやエクスポート、エフェ クトの適 用、ビデオ出力など多彩な機能を持っています。 25 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 03 ムービー再生位置の指定 03 ムービー再生位置の指定 ムービー を特定の位置から再生したい 場合は、jit.qt.movie オブ ジェクトに対して、時間で再生位 置を指定 する time メッセージか、フレーム数で再生位置を指定する frameメッセー ジを用います。また、現在の位置か ら相対的にフレーム数だけ再生位置を移動させるには、jump メッセージが利用できます。 ムービー再生位置の指定 time メッ セ ー ジで 指 定 する 再 生 位 置は、ル ー プ 範囲 と 同 じく QuickTime の タ イ ム・スケ ー ル で表 し ま す。 frame メッ セージや jump メッ セージは 再生位置 をフレー ム数で指 定します。ム ービーに 含まれる フレー ム数 は、jit.qt.movie オブジェ クトに getframecount メ ッセージを送 って得ることが できます。ムービ ーの 最初のフレーム番号は 0であり、最後のフレーム番号は全フレーム数より 1 小さい数値となります。このパッチで は、metro オブジェクトとrandom オブジェクトを使って、1秒ごとにランダムに再生位置を変えています。 27 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 04 ムービー再生位置の取得 う。ムービーの再生位 置がなだらかに 1 ずつ増加するとは限らない ので、== オブジェクトによ る条件判断は避け るべきです。 29 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 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 07 表示領域の指定 07 表示領域の指定 ムービーなどの画像を jit.pwindow オブジェクトで表示する時、画像の大きさと表示領域の大きさが異なる場 合でも、大き さが合うように拡大や縮 小が行われます。一方、画像の一部 だけを表示したり、表示領域 の一部だ けに 表示するこ とも可能です。元 画像のどの 部分を表示す るかをソー ス(source)領域とし て指定し、表示 領域 のどの部分に表示するかをデスティネーション(destination)領域として指定します。これらの領域の大きさが異 なる場合は、自動的に拡大または縮小されます。 ソース領域 デスティネーション領域 ソース領域とデスティネーション領域 jit.pwindow オブジェクトで、ソース領域を指定する場合は、最初に「usesrcrect 1」メッセージを送っ てソース領域を有効にしておきます。そして、4つの整数をアーギュメントとする srcrect メッセージを送るこ とで、ソース領域を指定します。4つの整数は、受け取った画像の左上隅を原点 (0,0) として、表示に用いる領域 の矩形を取り囲むような左、上、右、下の座標で表します。 32 07 表示領域の指定 デスティ ネーション領域も同様で、ま ず「usedstrect 1」メッセージ を送り、デスティネーション 領域を有 効に し、表示領域 の左上隅 を原点 (0,0) として、表示 する矩形 の左、上、右、下の座 標を表す 4つ の整数を 伴う dstrect メッセージを送ります。 表示領域の指定 ソース領 域とデスティネーション領 域は、同時に指定することも、一方 だけを用いることもできま す。ソース領 域を指定 しない場合は、受け取った画像 の全体が用いられ、デスティネ ーション領域を用いない場 合は、表示領 域全域に表示されます。 33 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 08 画像の変形 より複雑な図形変形を行うには、3× 3 の変換行列を用いるjit.mxform2d オブジェクトや、マッピング用の画 像を用いる jit.repos オブジェクトなどが利用できます。 jit.mxform2d オブジェクトは歪み や遠近感も得 られ、jit.repos オブジェクトは湾曲やノイズ化など複雑な変形が可能です。 35 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 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 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 11 カラースペースの変換 応 用するこ とがで きます。ま た、IHS(明度、色相、彩度)に変 換し、第 2プレ ーンの 明度だ けを取 り出すこ と で、前項で説明した画像のグレースケール化も可能です。 なお、RGB 形式とHSL 形式の変換の ための jit.rgb2hsl オブジェク トと jit.hsl2rgb オブジェク トのよう に、い くつかの カラー スペース につい ては専用 のオブジ ェクト が用意さ れてい ます。これら のオブ ジェクト で は、各要素のスケーリングやオフセットが指定でき、変換時の調整が可能になっています。 39 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 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 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 14 QuickTimeエフェクト ちなみに、jit.qt.effectオブジェクトでは、 geteffectlistメッセージや getparamlist メッセージ によ ってエフェクト やパラメータ のリストを取 得できます。また、 jit.qt.effect オブジ ェクトに dialog メッセー ジを送ると、QuickTime エフェクトの設定ダイアログが 開き、エフェクトの種類やパラメー タを設定 することができます。 QuickTime エフェクトの設定ダイアログ 43 15 画像のサンプリング 15 画像のサンプリング 画像 をメモリ上に 溜め込んだり、溜め 込んだ画像を 呼び出すには、 jit.matrixset オブジ ェクトが利用 でき ます。jit.matrixset オブジェクトは複数のマトリックスを格納できるオブジェクトです。 画像のサンプリング jit.matrixset オブジェ クトはアーギ ュメントに格納 するマトリック スの数を指定 し、その後にマトリ ック ス の プ レ ーン 数、デ ー タ・タ イプ、そ し て デ ィ メン ジ ョ ン を 指定 し ま す。格 納 する マ ト リ ック ス の 数 は、 matrixcount メッセージで変更することも可能です。いずれの場合も、指定した数のマトリックスに必要なだ けの空きメモリがなければなりません。実際に確保されたマトリックスの数は、getmatrixcount メッセージ で確認できます。 jit.matrixset オブジ ェクトは受け 取った画像(マ トリックス)をオ ブジェクト 内部(メモリ)に格納 しま す が、何 番目 の マト リ ック ス に 格納 す るか は index メ ッセ ー ジの ア ーギ ュ メ ント で 指定 し ます。そ し て、 outputmatrix メッセージを送れば、ア ーギュメントで指定した番号 のマトリックスがアウトレット から出力 されます。マトリックスの番号は 0 から始まりますので、確保したマトリックス数よりも1 小さい番号までが有効 です。なお、thruメッセージで 1 を送ると、受け取ったマトリックスをオブジェクト内部に格納すると同時に、 そのマトリックスをアウトレットから出力するスルー状態になります。 なお、ここで は映像を静止画像として格 納したり、呼び出したりしてい ますが、outputmatrix メッ セージと index メッセージを適切に操作すれば、映像サンプラーを実現することも可能です。 44 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 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 17 画像の貼り付け ちな みに、ここでは 使用してい ませんが、jit.matrix オブジェ クトのソー ス領域の指 定は、usesrcdim、 srcdimstart、srcdimend のアトリビュー トまたはメッセージによ って行います。また、jit.matrix オ ブジ ェクトと jit.pwindow オブジ ェクトとは 領域の指 定方法が異 なります。具 体的には、同じ 矩形であ って も、jit.matrix オブジ ェクトでの 領域指定の 右と下の値 は、jit.pwindow オ ブジェクトで の指定より も1 だけ小さくなります。これは第 22節の説明を参考にしてください。 47 18 画像の重ね合わせ 18 画像の重ね合わせ 2 つの画像を単純 に重ね合わせ るには、jit.op オブジェクト を利用します。 jit.op オブ ジェクトはマト リッ クス演算を行うオブジェクトで、op アトリビュートで演算の種類を指定します。jit.op オブジェクトの演算に は、加減 乗除(+、-、*、/)などの 算術演算 をはじめ、三角 関数、ビット 演算、条件演 算、指数関数、対 数関 数など、数多 くの演算を行うことができ ます。ただし、マトリックス同士の 演算ができるものとマトリ ックスと 数値の演算のみができるものとがあります。 画像の重ね合わせ この パッチでは、2つ の jit.qt.movie オブジ ェクトから異 なる画像が出 力されますの で、それらを jit.op オブ ジェクトに受 け取って、マトリ ックス同士の演 算をします。ここ では掛け算( *)を指 定しています ので、 マ ト リ ッ ク ス の セル ご と に、す な わ ち 画 像 のピ ク セ ル の ARGB 値 ご と に 掛 け 算 さ れた 結 果 が 出 力 さ れ、 jit.pwindow オブジェク トに表示されます。演 算の種類は op メッセージで変更 することができま す。演算の 種類によって画像がどのように重ね合わされるか確認しておくと良いでしょう。 48 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 20 マスク合成 20 マスク合成 グ レ ー ス ケ ー ル・マ ップ に 基 づ い て 2 つ の 画 像 を合 成 す る マ ス ク 合 成(ア ルフ ァ・チ ャ ン ネ ル 合 成)は、 jit.alphablend オブジェクトによって行うことができます。jit.alphablend オブジェクトは、2つのイ ンレ ットに受け取っ た画像を合成 して出力します が、第1 インレットの画 像のアルファ・チ ャンネルをマス ク画 像として用います。 マスク合成 この パッチでは、2 つのムービー の画像を合成 していますが、マ スク画像は 別のムービー(例 えばグレース ケー ルの ピクチャ)から読み 出すようにし ています。そこで、画像 を jit.unpack オブジ ェクトで分解し、マ スク 画像とムービーの RGBデータを jit.pack オブジェクトで組み合わせています。マスク画像の白い部分は第 1イ ンレ ットの画像が用 いられ、黒い部分 は第2 インレットの 画像が用いら れます。マスク画 像のグレーの部 分は、 その強度に応じて両方の画像がブレンドされます。ただし、modeアトリビュートが 1 であれば、この関係は反対 になります。 ちなみに、あ らかじめムービーのアルフ ァ・チャンネルにマスク画像を 含めておくことも考えられ ます。多くの 3DCGア プリケーション では、レンダリング 時にモデリング した物体のマス ク画像も含めて ムービーを作成 する 機能を持っていますので、これを利用すれば、他のムービーを背景として 3D キャラクタが動くような合成が可能 です。 50 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 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 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} マトリックスのセル番号 {9, 7} QuickDrawの座標系 (10, 8) 画像のピクセルまたはマトリックスのセル 領域指定方法の違い 53 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 24 特定色の検出 24 特定色の検出 画像 から特定 の色を検出 したい場合 は、jit.findbounds オ ブジェク トを利用し ます。jit.findbounds オブジェクトは、画像から指定された範囲の色を見つけだし、それらを含む最小の領域を出力します。 特定色の検出 jit.findboundsオブジェクトで検出する色の範囲は、最小値を min メッセージで、最大値をmax メッセージ で指 定します。いずれも 色を表す 4つの実数 をアーギュメ ントとします。指定 した範囲の色 のピクセルが画 像中 に見つかれば、jit.findbounds オブジェクトは、そのようなピクセルを含む最小の矩形として、その左上の セルの 位置を第1 アウトレットから、右下 のセルの位置を第 2アウトレ ットから出力します。これ らは2つ の整数 のリストです。指定した範囲の色が見つからない場合は、これらの座標値はすべて -1 になります。このパッチで は、検出され た領域に基づいて jit.lcdオ ブジェクトで矩形を描き、それ を元の画像とビット XOR演 算で合成 しています。 55 24 特定色の検出 ここで掲載したような単純明快な画像であれば、jit.findbounds オブジェクトだけで赤いボールを追いかけ るような 処理ができます。しかし、実際の ビデオ映像等では、照明が一様 でなかったり、画像が荒れて いたりな ど、検出の障 害となる要因があるかもし れません。そのような場合には、検 出する物体や周囲の環境に 応じてカ ラースペースを変換することや、ノイズの除去を行うことなど、正確な検出のための工夫が必要になります。 56 25 動きの検出 25 動きの検出 ビデオな どの変化のある映像の場合、現在 のフレーム画像と直前のフ レーム画像を比較することに よって、画像 がどのよ うに変化したかを知ることが できます。固定カメラからの映 像であれば、画像の変化はカメラ の前にあ る物体が動いたことになりますので、映像による動体検出といった用途に利用できます。 動きの検出 このパッチでは、まず、jit.change オブジェクトで映像フレームごとに画像を通過させ、jit.scalebias オブジェクトで画像をグレイスケール化し、 jit.unpack オブジェクトで 1プレーンだけを取り出します。これ で 画 像 変 化 を 知 る の に 必 要 最 小 限 の 情 報 と し ての 画 像 が 得 ら れ た こ と に な り ま す。次 に、演 算 の 種 類 を absdiff とした jit.op オブジェクト によって、2つの 画像の差の絶対 を得ます。この時、「t l l」と して trigger オブジェク トから同じ画像を 出力しますが、パッチ・コ ードをたすきがけ にして jit.op オブ ジェク トに送っ ています。これにより、現在のフレ ームと直前のフレームとの 間で画像演算を行うことに なります。こ のように して得られた画像は、直前のフレ ームと現在のフレームとの 間に生じた変化を表し、白いピク セルほど 変化が大きいことを示しています。 57 25 動きの検出 次に、 jit.3m オブジェクトで は画像の全ピクセルの最小値、平 均値、最大値を求めることができ ますが、ここ では平均値のみをナンバー・ボックスに表示し、MultiSlider オブジェクトを使って数値の推移をグラフ表示 していま す。従って、この数値が一定の値 を超えれば、画像に変化が生 じたと判断することがで きます。また、 変化量を表す画像に jit.findbounds オブジェクトを用いて、画像のどの部分に変化が生じたかを求めても良 いでしょう。 58 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 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 27 ビデオ機器からの画像入力 27 ビデオ機器からの画像入力 DV カ メ ラな どの ビ デオ 入力 デ バイ スか ら 映像 を 取り 込む に は、jit.qt.grab オブ ジ ェク トを 用 いま す。 jit.qt.grabオブジェクトでは、DVカメラはもちろん、Web Cam やキャプチャー・ボードなどQuickTimeに対 応したビデオ入力デバイスを利用できます。 ビデオ機器からの画像入力 61 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 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 28 ビデオ機器のコントロール jit.avc オブジェ クトは、これら以外 にも多くのメッ セージを用意し ていますが、どのよ うなメッセージ に対 応しているかはビデ オ機器によって異なります。また、jit.avc オブジェクトが用意していない AV/Cプロトコ ルについては、AV/Cプロトコルに従った整数のリストをアーギュメントとするcustomメッセージを利用するこ と ができ ます。AV/Cプ ロトコ ルの詳 細は、1394 Trade Association(1394ta.org <http://1394ta.org/>)とい う標準 化 団体から、各種仕様書を有償で入手することができます。 64 29 ビデオ機器への画像出力 29 ビデオ機器への画像出力 Jitter が処理した画像を jit.qt.videoout オブジェクトによってビデオ機器に出力し、そのビデ オ機器で表示 した り、録画する ことができ ます。jit.qt.videoout オブジェク トは、QuickTime のビデオ出 力コンポ ーネ ントに対応し たビデオ機器を扱いますが、これには DV ビデオ・カメラやDV ビデオ・デッキやビデ オ出力機能を 持ったビデオ・カードなどがあります。 ビデオ機器への画像出力 ビデオ機 器に画像出力するには、まず、ビデ オ出力コンポーネントをコ ンピュータに正しく接続し、正 常に動作 す るよう に設定 してお く必要 があり ます。DV ビデ オ機器 を用い るので あれ ば、前項の「 ビデ オ機器 のコン ト ロール」の説明を参考にしてください。 次に、 jit.qt.videoout オブジ ェクトに open メ ッセージを送り、ビ デオ出力コンポ ーネントを開き ます。 そして、 jit.qt.videoout オブジェクト に画像を送れば、その画像がビ デオ出力コンポーネントに 出力され 65 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 30 音量による画像処理 30 音量による画像処理 音楽によ って画像を変化させる方法は いくつも考えられますが、ここでは 音楽の音量に従って画像の明 るさを変 化させる簡単なパッチを紹介しましょう。Maxでは MSPによってオーディオを扱うことができます。 音量による画像処理 このパッチでは、ま ず、ムービー・ファイルとオーディオ・ファイル(AIFFファイルな ど)を読み込みます。次 に、オ ーディオ 処理を 開始する ために、ス ピーカ のアイコ ンの ezdac~ オブジ ェクトを クリッ クします。そ し て、ムービー とオーディオの再生を開始 すれば、オーディオの音量に 応じて、ムービー映像が明るく なったり、 暗くなっ たりするはずです。使用する オーディオ・ファイルは、ドラム・ソロ など音量変化が明確なも のであれ ば、効果がはっきりと確認できます。 ここ での処理は、オーデ ィオ・ファイルの再 生音、すなわち sfplay~ オブジェクトが 出力するシグナ ルを、レ ベル・メータの形 をした meter~ オブジェクトに送ります。 meter~ オブジェクトは音量 を検出し、バー・グラ フ と し て 表 示 す る と と も に、ア ウ ト レ ッ ト か ら 実 数 と し て 音 量 値 を 出 力 し ま す。そ こ で、そ の 数 値 を brightnessメッセージとして jit.brcosa オブジェクトれば、再生音の音量に応じて、ムービーの画像の明 るさが変化することになります。 67 31 波形の描画 31 波形の描画 次 の パ ッチ は、MSP が扱 う オ ーデ ィ オ・シ グ ナル を 波 形 とし て Jitter で 描 画し て い ま す。シグ ナ ル はMSP の scope~ オブジェクトを使って波形表示できますが、Jitterを用いれば多彩な映像表現が可能になります。 オーディオの波形描画 68 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 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 32 3次元描画の基本 また、OpenGLによる描画では、metroではなく qmetroを使う点が重要です。処理負荷が高い時に、 metro で あればメ ッセージが停滞しますが、qmetro は処理の負荷に応じ て時間間隔を自動的に調整してく れます。ただ し、jit.qt.movie や jit.qt.grab など のオブ ジェク トは、自動 的に bang を間引 く機能 を持っ ている の で、metro を用いて構いません。 なお、物体を 描くオブジェクトには様々な 種類があり、適切なオブジェク トを使うことで効率的な描画 ができま す。どのようなオブジェクトが用意されているかを、ヘルプ・パッチなどで確認しておくと良いでしょう。 71 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 33 3次元物体の操作 をチェックし、Nameでウィンドウ名を設定することが必要です。また、多くのサンプル・パッチではウィンドウ 名として stage を使っていますので、ひとつのパッチだけを開くようにしてください。 73 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 34 3次元物体のマウス操作 なお、 jit.gl.handle に reset メッセー ジを送れば、移動も回転もしていない状態に戻すこ とができます。 また、Options メニューの「Help in Locked Patchers」を有 効にしている場合 は、Optionキー を押しながらク リック すれば ヘルプ・パッチが開きま すので、この設定を無効 にするか、クリックした後 でOption キーを押すよ うにし ます。 75 35 複数の物体の描画 35 複数の物体の描画 jit.gl.gridshape のような 物体を描くオ ブジェクトを いくつか用意 すれば、複数の物体 を描くことが でき ます。いずれ の物体も描画するウィンドウ は同じ名前でなければなり ませんが、それ以外のアトリビュ ートを変 えることで、それぞれの物体の形や位置、回転などを個別に操作することができます。 次のパッチでは、2つの jit.gl.gridshape を用いて、ひとつは球、もうひとつはトーラスを描いています。 jit.gl.handle の出力は両方のオブジェクトに繋がっているので、マウス操作で 2つの物体を同時に回転移動 することができますが、いずれかのパッチ・コードを削除すれば、片方の物体だけを操作することになります。 2つのjit.gl.gridshapeによる2 つの物体の描画 76 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 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 37 テクスチャーの適用 37 テクスチャーの適用 Jitter では物体に画像をテ クスチャーとして貼り付けること もできます。テクスチャーはレンダー が管理しま すので、まず、レンダーに texture メッセージを送り、レンダーにテクスチャーを作成します。texture メッ セージの アーギュメントは、テクスチャー の名前とテクスチャー画像 の横と縦とのピクセル数です ので、ここで は image という名前のテクスチャーが作成されます。次に、物体に textureメッ セージを送れば、アーギュメ ントで指 定した名前のテクスチャーが 物体に貼り付けられます。デフォル トのテクスチャーは白と灰色 の市松模 様となっています。 デフォルトのテクスチャーを貼り付けた立方体 79 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 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 38 物体の透明表現 color アトリ ビュート のアルファ・チ ャンネルに 基づいて 透明度を指 定すると、物体 全体の透明 度が変化 しま す。これに対 して、テクスチャー画像に含 まれるアルファ・チャンネルを 使えば、任意の形状で部分的 な透明感 の表現が できます。この場合は、物体にテ クスチャーを貼り付け、そのテ クスチャー画像のアルフ ァ・チャンネ ルに透明度を示すグレースケール画像を持たせるだけです。 テクスチャーによる透明表現 ムービーや ピクチャにアルファ・チャンネルが含まれ ていない場合も多いので、ここでは jit.qt.movie オブ ジェクト が出力する画像の明度を アルファ・チャンネルにしてい ます。もちろん、適切なアルファ・チ ャンネル を持つ画像であれば、このような処理は不要です。また、color アトリビュートによる透明度の影響を避けるた めには、color の値を1. 1. 1. 1.に設定するほうが良いでしょう。 82 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 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 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 40 3次元空間の背景 ところ で、レンダーに eraseメ ッセージも draw_pixelsメ ッセージも送らず に物体を描画すると、ど うなる でしょ うか? パッチではラジオボタ ンで「背景なし」を選ぶと、この状態 を確かめられます。物体をマ ウスで ドラ ッグして移動 すれば、物体が何 重にも重なっ て描かれるこ とが分かりま す。この時、jit.gl.handle オ ブジェ クトの visible アト リビュートをオ フにして、補助円を描 かないほうが良い でしょう。このよう な描画 方法 は一般的で はありませ んが、あえて erase メッセー ジを送らな いことで、特殊 な効果を狙 うことがで きま す。 背景を描かずにトーラスを動かした結果 86 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 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 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 43 GPUによる画像処理 なお、 op.add.jxs を用いてクロス フェードを作成したところ、前項と 同じ条件で 60fps弱の処理速 度でした。 ふた つの jit.gl.videoplane によ る処理に比べ て、テクスチャ ー・データの jit.gl.videoplane への 貼り付けが増えているため、僅かに処理速度が劣るようです。 jit.gl.slab オブジェクトによるクロスフェード 90 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 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 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 46 日本語の表示 Op en GL で 2 次 元 ま た は 3 次 元 の テ キ ス ト を 表 示 し た い 場 合 は、 jit.gl.text2d オ ブ ジ ェ ク ト や jit.gl.text3dオブジェクトを用いますが、これらのオブジェクトでも text メッセージによる日本語表示に は 問題があ ります。し かし、テキ ストをシ フト JISコー ドに変 換し、そのコ ードを 1バ イトご とにセ ルに収め た char 型のマト リックスを送れ ば、正しく描画され ます。フォントは日 本語フォントを 指定しておきま す。例え ば、「表示」のシフト JISコードは「149 92 142 166」(16進数表記なら「0x95 0x5C 0x8E 0xA6」)です。 OpenGLによる日本語表示 94 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 47 映像のネットワーク転送 出 力さ れま す。送受 信 がで きな い場 合に は、IP アド レ スや ポー ト番 号の 設定 を確 認す る とと もに、フ ァイ ア ウォールによって通信が遮断されていないかも確認する必要があります。 なお、こ こでは送受 信するデー タ量を減ら すために、jit.argb2grbg オブジ ェクトによ って画像を ARGB 形 式か らGRGB 形式に変 換しています。GRGB 形式はア ルファ・チャンネ ルを含まず、視覚的 に重要度が低い 赤と 青の 要素を水平方 向に半分の解 像度にすること で、ARGB形 式の半分のデ ータ量になり ます。そして、GRGB 形 式を ARGB形式に戻すには、jit.grgb2argb オブジェクトを使います。 ま た、補 助的 な 機 能と し て、jit.net.send の 第 2イ ン レ ット に 入 力し た 任意 の メ ッセ ー ジ は、受信 し た jit.net.recv の第 2アウト レットから 出力されます。こ の機能を使っ て、パッチのリ モート・コントロ ール などを行うことができます。 96 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 を QuickTime Player などのス トリーミング 受信ができるア プリケーショ ンで開けば、配信さ れている映像 を受信すること がで きま す。同じコンピュ ータで受信を 確認する場合 は、IPア ドレスとして「127.0.0.1」を指定 しても構いま せん。 jit.qt.movie オ ブジェ クトで もス トリー ミング を受 信する 場合は、 read メ ッセ ージに URL 続け て送り ま す。 97 48 映像のストリーミング配信 QuickTime Playerによるストリーミング受信 URL からも分かるように、jit.broadcast オブジェクトは内部的にRTSP 形式のストリーミング・サーバを運 用し ています。jit.broadcast による映 像配信は、レイ テンシー(時間的 な遅れ)や画像 の劣化があり ます が、jit.net.send オブジェクトよりもデータ量が少なく、ネットワークに対する負荷が少なくて済みます。 な お、ストリ ーム配信 には jit.qt.broadcast オブジ ェクト も利用 できま す。jit.qt.broadcast で は SDP形 式のストリーミングを 行い、指定できるコーデッ クの数が多く、映像だけで なく音声も配信できる といっ た特徴があります。 98 おわりに おわりに 最初に記し たように、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
© Copyright 2024 Paperzz