BPMに同期した映像の再生 #maxmsp #jitter

BPMに同期した映像の再生

スクリーンショット 2014-08-12 00.56.26
transportで指定したBPMとjit.qt.movieを同期させて、映像を再生する方法です。phasor~が指定したBar/Beatsでtransportに同期して0~1の信号を出すことができるので、その値をframecountに掛ける事で現在のフレームへジャンプさせて同期再生をする事ができます。例えば、2小節でjit.qt.movieの再生を繰り返したい場合は、phasor~のfrequencyアトリビュートに”2 0 0″と指定します。

続きを読む BPMに同期した映像の再生 #maxmsp #jitter

Maxのパーティクルシステム その1: jit.p.shiva jit.p.vishnu jit.gen jit.gl.multiple #max6 #maxmsp #jitter #cycling74

スクリーンショット 2014-07-02 17.59.38

アニメのオープニング、特に芳文社系を見ているとタイトルが出現する辺りの画面遷移エフェクトとして、桜のパーティクルが多用されている事に気が付きました。さっそく桜パーティクルVJを行うべくjitterのパーティクルシステムを調査しました。

Jitter パーティクルシステム × jit.gl.multiple TIPS

  • jitter のデフォルトで付いてるパーティクルシステム jit.p.shiva / jit.p.vishnuでは、オブジェクトの回転処理が入っていないため、全部同じ向きに表示される。(トップの桜パーティクルは、全部同じ向きで残念な感じ。)
  • jit.gl.multiple に Rotate Array を指定できるので、jit.genなどで回転を考慮した処理を書けば、パーティクルを回転させら模様。
  • デフォルトのパーティクルシステムは、レファレンスを見る限り機能が少ない。ただしjit.p.shiva / jit.p.vishnu 自体は、32個までプレーンまで対応しているので、6プレーン以降に回転 / スケール / カラー などを保存してイジる処理を入れれば多機能なパーティクルシステムを実装できそう。
  • jit.gl.multiple を使って描画する場合には、寿命が無くなったパーティクルの描画をしないよう注意。
  • jit.gl.multiple & アルファチャンネル描画する場合は、オブジェクトの @depth_enable 0 @blend_enable 1 を設定。しないと、四角形の枠がでて酷い描画になる。

上記パッチを作るに辺り、ニコニ・コモンズのの素材を利用させて頂きました。今後、回転も考慮した桜パーティクルシステムを実装してみたいと思います。

パーティクルシステム テストパッチ

スクリーンショット 2014-07-02 18.30.10

jit.gen のコード (jit.p.vishnuに接続)

スクリーンショット 2014-07-02 18.26.11

jit.gl.multiple + アルファチャンネル無しのテクスチャ パーティクル

スクリーンショット 2014-07-02 16.59.29

透過を使わない場合は、depth_enable 1 で立体的なパーティクルが利用できる。画像は、NC帝國によるハンバーガーアイコン。1000個くらいが限界っぽい。

jit.gl.render によるプリミティブなパーティクル

スクリーンショット 2014-07-02 16.04.08

jit.gl.render のプリミティブな描画(Lines / strip) であれば、1万パーティクルで60fps近くで動作。

jit.gl.multiple と jit.gen を使って、 jit.gl オブジェクトを複数個描画 #maxmsp #jitter #gen

スクリーンショット 2014-06-21 5.32.03

jitterを使う上で避けては通れない、matrixとjit.gl.multiple(と、たぶん jit.meshも)を、そろそろ本腰入れて使って見ようと思いテストしてみました。jit.gl.videoplaneの動画をjit.genによるjit.matrixとjit.gl.multipleで大量に描画しています。

パッチ

スクリーンショット 2014-06-21 5.32.30

multiple の @targetname で複数個描画したいオブジェクト(今回は、jit.gl.videoplane)を名前で指定する必要があります。また、描画するオブジェクトのアトリビュートで @automatic 0 にしておかないと、コイツが別途描画されてしまいます。

jit.gen code

スクリーンショット 2014-06-21 5.32.33

メモ – jitterのパーティクルについて

jitterでパーティクル処理をするためには、個々のオブジェクトの状態をmatrixで保存するようですね。jit.genを使えばパーティクルを軽量かつ大量に描けるようです。ただjit.gen自体は、jit.gl.pixと違ってGPU処理では無く、CPU処理のコードにコンパイルされるので、jit.shivaなどのデフォルトのパーティクルオブジェクトと比較して、パフォーマンスがどうなのかは今度検証してみたいです。

jit.gl.lua 疑問点メモ : #jitter #maxmsp #max6

  • jit.qt.movie を jit.listener を使って、コールバック監視の方法がわからない。asyncreadを行ないたいが、listenerが使えないため困っている。

追記

jit.gl.luaの中でlistenerをつかった jit.qt.mov asyncread 後のevent受ける処理は、実装されてないそうです。Cycling74のサポートからのメールより

jit.gl.lua 内でjit.qt.mov + jit.gl.videoplane を使ってテクスチャを描画 : #maxmsp #jitter #max6

スクリーンショット 2014-05-12 17.55.48

 

Lua内でJitterのオブジェクトを使ってテクスチャ描画しよう!Lua以外は、jit.gl.* 系 で使ういつものパターンです。

結果

スクリーンショット 2014-05-12 17.54.52

解説

[javascript]

local mov = jit.new("jit.qt.movie");
local plane = jit.new("jit.gl.videoplane",this.drawto)

[/javascript]

jitterのオブジェクトをインスタンス化します。jit.qt.movieは、pngを読み込みテクスチャに変換できます。jit.gl.videoplaneは、テクスチャを使って描画をしてくれます。

[javascript]

mov.adapt = 1
mov:read("cobalt_logo_sun.png")

[/javascript]

ここではファイル名を指定して画像を読み込んでいます。luaにおけるオブジェクトのメソッド呼び出しは、 :(コロン)でプロパティは.(ドット)のようです。

 

[javascript]

local frame = jit.matrix(4,"char");
mov:matrixcalc(frame.name, frame.name)

plane:jit_matrix(frame.name);

[/javascript]

jit.gl.videoplane へ jit.qt.movieのテクスチャの流し込み方になります。直接テクスチャを渡せれば良かったのですが出来なくて、一旦、jit.matrixへテクスチャを描画 (mov:matrixcalc(frame.name,frame.name)し、それをplaneへマッピングしています。jitter系のオブジェクトの受け渡しは、名前でやってるのが理解できます。(内部的にはポインタ渡してるのかな?)

コード

[javascript]
autogarbage = 1
autowatch = 1
gc = 1

local mov = jit.new("jit.qt.movie");
local plane = jit.new("jit.gl.videoplane",this.drawto)

function scriptload()

mov.adapt = 1
mov:read("cobalt_logo_sun.png");

local frame = jit.matrix(4,"char");
mov:matrixcalc(frame.name, frame.name)

plane:jit_matrix(frame.name);
plane.blend_enable = 1;
plane.blend = "alphablend";

end

local rotate = 0;

function draw()

plane.rotate = {rotate,0,0,1};
rotate = rotate + 2;

end

[/javascript]

jit.gl.lua の勉強は参考文献が少なくて中々はかどりませんが、jitterオブジェクトをガンガン使えるようになると、また世界が広がりそうです。(テキストのコーディングが増えたら、oFとかUnity使ったら良いんじゃないかという話にもなりそうw)