jit.gl.pix を jit.gl.lua 内で利用する

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


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);
local pix = jit.new("jit.gl.pix",this.drawto)
pix.gen = "aer.line.genjit"; -- readでは無く、genでファイルを読み込みます。
 

function draw()

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

    pix:jit_matrix({frame.name})
    pix:draw()

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

end


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

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

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

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

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


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

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


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

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

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


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

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

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

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


jit.gl.lua 内の jit.gl.videoplane へ jit_matrix の入力からテクスチャを貼る : #max6 #maxmsp #jitter

スクリーンショット 2014-05-14 3.17.17

解説

function jit_matrix(name)

    plane:jit_matrix(name);

end

緑線(jit_matrix)をjit.gl.luaにそのまま繋げる場合のコード。

function tex(...)

    local jit_matrix = {...}
    plane:jit_matrix(jit_matrix[2])

end

texをprependして,tex関数をコールした場合のコード。可変長配列で受け取ると2番めの要素にjit_matrixの名前が入っています。

緑線(jit_matrix)は、単に{ “jit_matrix” , jit_matrix の 名前 } のリストを送ってるだけなんですね。

コード


autogarbage = 1
autowatch = 1
gc = 1

local plane = jit.new("jit.gl.videoplane",this.drawto);
plane.blend_enable = 1;
plane.blend = "alphablend";

--1
function jit_matrix(name)

    plane:jit_matrix(name);

end

--2
function tex(...)

    local jit_matrix = {...}
     plane:jit_matrix(jit_matrix[2])

end


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

解説


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

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


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

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

 


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

plane:jit_matrix(frame.name);

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

コード

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

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


jit.gl.lua の出力に jit.gl.pix をかける : #maxmsp #max6 #jitter

スクリーンショット 2014-05-08 23.44.12

jit.gl オブジェクトのTIPSです。表題の通り、jit.gl.luaの出力にjit.gl.pixのエフェクトをかけたかったので、やってみました。jit.gl.luaのテクスチャ出力をゲットするのが少し難しかったです。

やり方

  1. 一旦 jit.gl.node へ jit.gl.luaを描画。※ jit.gl.luaの出力から青線( gpu上のtexture? ) を直接取得できなかったためです。他にやり方はありそうですが・・・
  2. jit.gl.node のアトリビュート @capture 1 にしておくと、第1outletからtexture出力(青い線)
  3. jit.gl.pix でテクスチャに画像処理
  4. jit.gl.videoplane にテクスチャを貼り付け
  5. jit.gl.render で jit.gl.window へ描画

補足 – Syphonを使う場合

jit.gl.*の描画をSyphonへ送る場合も、テクスチャかマトリクスをjit.gl.syphonserver送る必要があるため、上記の方法でluaで描画したtexture取得すると良さそうでした。jit.gl.renderから直接@matrixout 1 / @capture 1などしてマトリクスかテクスチャ取得出来た気がするけど、何故か上手くいかなかったです。


jit.gl.lua 動画テクスチャを利用する

jit.gl.lua内で動画テクスチャを扱う場合に、外部からmatrixで受け取り、jit.gl.textureと接続する方法がForumにありました。少しずつOpenGLとjit.gl.luaの使い方が分かってきました。

スクリーンショット 2014-01-29 01.43.17


local gl = require("opengl")
local GL = gl

local tex = jit.new("jit.gl.texture", this.drawto)

function jit_matrix(name)
tex:jit_matrix(name)
end

function draw()
jit.gl.bindtexture(tex.name, 0)
gl.Color(1., 1., 1., 1.)

gl.Begin(GL.QUADS)
--top left
gl.TexCoord(0., 1.)
gl.Vertex(-0.5, 0.5, 0.)

--bottom left
gl.TexCoord(0., 0.)
gl.Vertex(-0.5, -0.5, 0.)

--bottom right
gl.TexCoord(1., 0.)
gl.Vertex(0.5, -0.5, 0.)

--top right
gl.TexCoord(1., 1.)
gl.Vertex(0.5, 0.5, 0.)	
gl.End()

gl.PushMatrix()
gl.Translate(1,0,0)
gl.Begin(GL.QUADS)
--top left
gl.TexCoord(0., 1.)
gl.Vertex(-0.5, 0.5, 0.)

--bottom left
gl.TexCoord(0., 0.)
gl.Vertex(-0.5, -0.5, 0.)

--bottom right
gl.TexCoord(1., 0.)
gl.Vertex(0.5, -0.5, 0.)

--top right
gl.TexCoord(1., 1.)
gl.Vertex(0.5, 0.5, 0.)	
gl.End()
gl.PopMatrix()

jit.gl.unbindtexture(tex.name, 0)
end


jit.gl.lua で光源・マテリアルを設定して描画:Cycling’74 Max,OpenGL,Jitter

スクリーンショット 2014-01-27 01.30.13


this.autowatch = 1
this.gc = 1

local gl = require("opengl")
local glu = require("opengl.glu")
local GL = gl
local GLU = glu;
local _analogIn = {};

local vertexes = {
 {-0.5,0.5,0.5},
 {-0.5,-0.5,0.5},
 {0.5,-0.5,0.5},
 {0.5,0.5,0.5},
 {-0.5,0.5,-0.5},
 {-0.5,-0.5,-0.5},
 {0.5,-0.5,-0.5},
 {0.5,0.5,-0.5}
};

local lightAmb = {0,0,0,1}
local lightDiff = {1,1,1,1}
local lightSpec = {1,1,1,1}
local lightPos = {1,1,1,0}

local goldAmb = {0.24725,0.1995,0.0745,1}
local goldDiff = {0.75164,0.60648,0.22648,1};
local goldSpec = {0.628281,0.555802,0.366065,1};
local goldShin = 51.2;

local _rot = {0,0,0};
local angle = 0;

function rot(...)

 _rot = {...};
end

function drawCube()

 --top
 gl.Normal(0,1,0);
 gl.Begin(GL.QUADS);
 gl.Vertex(vertexes[1])
 gl.Vertex(vertexes[4])
 gl.Vertex(vertexes[8])
 gl.Vertex(vertexes[5])
 gl.End();

 --buttom
 gl.Normal(0,-1,0)
 gl.Begin(GL.QUADS)
 gl.Vertex(vertexes[6])
 gl.Vertex(vertexes[7]);
 gl.Vertex(vertexes[3]);
 gl.Vertex(vertexes[2]);
 gl.End()

 --front
 gl.Normal(0,0,1)
 gl.Begin(GL.QUADS)
 gl.Vertex(vertexes[1])
 gl.Vertex(vertexes[2])
 gl.Vertex(vertexes[3])
 gl.Vertex(vertexes[4])
 gl.End()

 --back
 gl.Normal(0,0,-1)
 gl.Begin(GL.QUADS)
 gl.Vertex(vertexes[5])
 gl.Vertex(vertexes[8])
 gl.Vertex(vertexes[7])
 gl.Vertex(vertexes[6])
 gl.End()

 --left
 gl.Normal(-1,0,0)
 gl.Begin(GL.QUADS)
 gl.Vertex(vertexes[1])
 gl.Vertex(vertexes[5])
 gl.Vertex(vertexes[6])
 gl.Vertex(vertexes[2])
 gl.End()

 --right
 gl.Normal(1,0,0)
 gl.Begin(GL.QUADS)
 gl.Vertex(vertexes[4])
 gl.Vertex(vertexes[3])
 gl.Vertex(vertexes[7])
 gl.Vertex(vertexes[8])
 gl.End()

end

function scriptload()

 print("scriptload");

end

function draw()

 --init
 gl.ClearColor(1,1,1,1)
 gl.ClearDepth(1)
 gl.Enable(GL.DEPTH_TEST)

 gl.Light(GL.LIGHT0,GL.AMBIENT,lightAmb)
 gl.Light(GL.LIGHT0,GL.DIFFUSE,lightDiff)
 gl.Light(GL.LIGHT0,GL.SPECULAR,lightSpec)

 gl.Enable(GL.LIGHT0)
 gl.Enable(GL.LIGHTING)
 gl.Enable(GL.NORMALIZE)

 gl.Clear(GL.COLOR_BUFFER_BIT,GL.DEPTH_BUFFER_BIT)
 gl.LoadIdentity();
 glu.LookAt({0,0,2},{0,0,0},{0,1,0});

 --light
 gl.Light(GL.LIGHT0,GL.POSITION,lightPos)

 gl.PushMatrix()
 gl.Rotate(_rot)

-- gl.Rotate(angle,0,1,0)
 gl.Material(GL.FRONT_AND_BACK,GL.AMBIENT,goldAmb);
 gl.Material(GL.FRONT_AND_BACK,GL.DIFFUSE,goldDiff);
 gl.Material(GL.FRONT_AND_BACK,GL.SPECULAR,goldSpec)
 gl.Material(GL.FRONT_AND_BACK,GL.SHININESS,goldShin);

 drawCube();

 gl.PopMatrix()

 angle = angle + 1;
 if angle >= 360 then angle = 0 end

end

参考図書

はじめてのOpenGL―ライブラリを使った「3D‐CGプログラミング」の基本  – p.131 からのサンプルを利用しました。MaxのOpenGLとバージョンがあっているため、この書籍は勉強しやすいです。


jit.gl.lua で複数ファイル分割:Cycling74 Max, Lua, Jitter

jit.gl.lua で複数ファイル分割したい!という分けで調べてみました。Dog.lua は、こちらのサイトのソースを流用させて頂きました。

Main.lua


--この関数によってMain.luaのpathに置いてある .luaファイルもrequireで読み込めるようになる

function addmodulepath(path)
 -- add to package paths (if not already present)
 if not string.find(package.path, path, 0, true) then
 package.path = string.format("%s/?.lua;%s", path, package.path)
 package.path = string.format("%s/?/init.lua;%s", path, package.path)
 package.cpath = string.format("%s/?.so;%s", path, package.cpath)
 end
end

-- Main.lua のファイルパスを登録
addmodulepath(this.path)
-- Dog Class のロード
require("Dog")

--インスタンス化
jiro = Dog.new("jiro", 3)
sabu = Dog.new("sabu", 2)

jiro:showProfile()
sabu:showProfile()

Dog.lua


-- Dog クラスを定義

Dog = {}

Dog.new = function(name, age)

local obj = {}

obj.name = name

obj.age = age

obj.showProfile = function(self) s = string.format("[name=%s,age=%d]", self.name, self.age) print(s) end

return obj end