jit.gl 系のレンダリング結果をSyphonへ送るサンプル : #jitter #max6 #maxmsp

スクリーンショット 2014-05-30 19.23.39

jit.gl.render の最終出力をSyphonに送る場合に、jit.gl.node へ描画して @capture 1 をする方法でやっていましたが激重だったので、改善方法が無いかとCycling74のフォーラムを徘徊していたら、jit.gl.textureを使う方法を見つけました。

解説

  1. jit.gl.texture を作成 @name で syphontex などと名付けておく
  2. 3Dオブジェクト等をjit.gl.render にてレンダリング
  3. to_texture “テクスチャ名” メッセージをjit.gl.render へ送り、jit.gl.textureに最終画像をレンダリング
  4. jit.gl.texture に bang を送り jit_gl_texture メッセージを第1インレットから出力
  5. jit.gl.syphonserver へ テクスチャを送る

注意点

2のステップは、飛ばせなかったです。Syphonに最終レンダリングを送りたいだけでも、必ずサンプルにもある jit.window のようなレンダリング先を用意しておく必要があります。

MadMapper へ

スクリーンショット 2014-05-30 19.21.04

jit.gl.render のレンダリング結果を MadMapper で 表示できました!

Cyclopsを用いたJitter映像の簡易トラッキング:#jitter #max6

スクリーンショット 2014-05-30 2.18.31

Jitter映像を用いたインタラクション・トラッキングに使えるCyclopsというライブラリのサンプルです。画像をグリッドに分割して、グリッドの中で色や明るさ等が変化した時にトリガーを取得できます。OpenCV等で出来るような検出などはできないですが、動画を使った簡易的なインタラクションを組むのに利用できます。

サンプル解説

  • 画像をグリッドに分割
  • ゾーンを配置(点0)
  • ゾーンが含まれているグリッドの色・明るさ等が変化
  • jit.cyclops 第二インレットから結果を出力

サンプル動画 on Vimeo

Cyclops video tracking software from Eric Singer on Vimeo.

jit.gl.lua コルーチンのサンプル : #maxmsp #max6 #jitter

スクリーンショット 2014-05-29 6.00.09

Luaのコルーチンを使ったサンプルです。コルーチンは、関数の途中で処理を中断して呼び出し側に処理を戻し、また再度同じ箇所から処理を行える機能との事です。

状態を変更しながらの制御、フレーム毎のアップデート処理が思い場合にフレーム分割して計算、ジェネレーターとして数値の取得、Tweenといった処理をスッキリ書けそうです。local 変数を関数の中に定義し、スコープを限定してstatic変数のように何度も使いまわせるのも良さそうです。

このサンプルではコルーチン部分で、動画のスピードを上げ下げしています。

[javascript]

autowatch = 1
gc = 1

local mov1 = jit.new("jit.qt.movie",this.drawto)
mov1.adapt = 1;
mov1.rate = 0.1;
mov1:read("bball.mov")

local frame = jit.matrix();

local plane = jit.new("jit.gl.videoplane",this.drawto);
plane.scale = 0.8
plane.automatic = 1;

–coroutine
local update_co = coroutine.create(
function()

— 動画再生スピードを上げる
while true do
if mov1.rate < 50. then

mov1.rate = mov1.rate + 0.1;
mov1:matrixcalc(frame.name,frame.name)
else
break;
end

coroutine.yield ()
end

— 動画再生スピードを下げる
while true do

if mov1.rate > 0 then

mov1.rate = mov1.rate – 0.1;
mov1:matrixcalc(frame.name,frame.name)
else
break;
end

coroutine.yield ()
end

return

end
)

function draw()

if( coroutine.status(update_co) ~= "dead") then

print(coroutine.resume(update_co))
print(coroutine.resume(update_co))
print(coroutine.resume(update_co))

else

print(coroutine.status(update_co));
end

plane:jit_matrix(frame.name)

end

[/javascript]

coroutine.wrap( function ) で既存の関数をコルーチンとして扱う事もできますが、coroutine.* 系の関数を使えなくなるようなので、基本的には coroutine.create を用いてつくるのが良さそうです。

jit.gl.lua で jit.gl.slab シェーダーをかけるサンプル:#jitter #max6

スクリーンショット 2014-05-28 22.31.18

jit.gl.luaの内部で、シェーダーをかけるサンプルを書いてみました。

[javascript]

autowatch = 1
gc = 1

local mov = jit.new("jit.qt.movie",this.drawto)
mov.adapt = 1;
mov:read("bball.mov");

local frame = jit.matrix()

local plane = jit.new("jit.gl.videoplane",this.drawto);
plane.scale = 0.8
plane.automatic = 1;

local slab = jit.new("jit.gl.slab",this.drawto)
slab.file = "td.kaleido.jxs";
slab:param("div",4)

function draw()

mov:matrixcalc(frame.name,frame.name)

slab:jit_matrix({frame.name,frame.name})
slab:draw()

plane:jit_gl_texture(slab.out_name)
plane:draw();

end

[/javascript]

ちなみに初めは、jit.gl.pixを使おうと思ったのですが、.genjitを読みこませようとすると

jit_xml_document: error reading file at byte offset 0 / not well-formed (invalid token)

というエラーがでてしまい、上手く読み込ませる事ができなかったです。

ピクセルシェーダ jit.gl.pix による光るリングの描画 : #jitter #maxmsp

スクリーンショット 2014-05-20 19.25.52 jit.gl.pix を使ったシェーダーによる画像描画や処理を少しづつ学んで行こうと思います。今回は以下の参考サイトにあったコードを参考に光る輪っかを描画してみました。

コード

スクリーンショット 2014-05-20 19.26.28

  • snormで -1 ~ 1 に正規化した座標を取得
  • length によって原点からの距離に変換
  • !- 0.5 とabs により半径0.5の円周上の最も近い点から座標との距離に変換
  • !/ 0.02 により、座標における光の量を決定(半径0.5の円に近い点ほど、数値が高くなるため光が強くなる)
  • out 1 に光の強さを送る。自動的に vec 4 (R G B A)に変換されている

参考サイト

wgld.org – 時間経過とマウスカーソル座標