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

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

[javascript]

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
[/javascript]

参考図書

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

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

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

Main.lua

[javascript]

–この関数によって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()

[/javascript]

Dog.lua

[javascript]

— 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

[/javascript]

jit.gl.lua で使える OpenGL の関数・定数一覧:Cycling74 Max,Jitter ,Lua

スクリーンショット 2013-10-26 01.32.13

Max6 から加わった jit.gl.lua やってます。 OpenGL2.1でopenFrameworksなんかと比べても古く、勉強しようにも世のOpenGLの解説書は大抵GLUT等のライブラリを使っているためMaxの環境との微妙な違いでサンプルコードが使いづらかったり、実行時エラーが出た行を、真っ黒に隠すというエディターだったりして、かなり苦行感もありますが、使いこなせれば結構面白そう!

さて、今日コバルト爆弾αΩのεに「jit.gl.luaで使える関数がわかんない・・・」と言われたので、記事に書いておきます。ちなみに一文字目が大文字なのが関数で、全部大文字が定数です。使い方は → OpenGL 2.1 Reference Pages

続きを読む jit.gl.lua で使える OpenGL の関数・定数一覧:Cycling74 Max,Jitter ,Lua

jit.gl.lua の OpenGL で FFT データを可視化してみた:Max6, Jitter, Lua

OpenGLの修行という事で、一先ずOpenGLでFFTのデータを可視化するパッチを組んでみました。

パッチ

スクリーンショット 2013-10-11 02.57.50

FFTデータをリストにして、jit.gl.luaのfft関数に可変長引数として与えています。

jit.gl.luaは可変長引数の長さが83を超えると、Maxが予期しない理由で終了するバグがあるようです。注意です。サンプル数の多いFFTデータ(例えば1024)をどうやってjit.gl.luaに渡すかを検討していきたいです。

スクリーンショット 2013-10-11 03.04.28

※FFTampは、Maxオデッセイに書いてあったコードを使いました。

TestVisualizeFFT.lua

[js]

this.autowatch = 1
this.gc = 1

local gl = require("opengl")
local GL = gl
local _fft = {};

function fft(…)
_fft = {…}
end

function draw()

gl.ClearColor(0,0,0,1);
gl.Clear(GL.COLOR_BUFFER_BIT);
gl.Begin(GL.TRIANGLES)
–gl.Begin(GL.POLYGON)
–gl.Begin(GL.LINE_LOOP)
–gl.Begin(GL.TRIANGLE_STRIP)

for i = 1 , #_fft do
local a = _fft[i];
gl.Color(_fft[i],_fft[(i + 1)%#_fft + 1],_fft[(i+2)%#_fft + 1],_fft[i]);
gl.Vertex(a * math.cos(2 * math.pi * (i-1)/#_fft),a * math.sin(2 * math.pi * (i-1)/#_fft,0));
end

gl.End();
gl.Flush();

end

[/js]

参考図書

jit.gl.lua で OpenGL をはじめる:Lua, Cycling ’74 Max6, Jitter

スクリーンショット 2013-10-09 00.07.30

jit.gl.lua で OpenGL を始めるにあたり、一先ずluaのテンプレートを作成してみました。js オブジェクト に無い scriptload 関数があったりとで便利です。ちなみにテンプレートのコードで灰色の四角形を描画しています。

テンプレートファイル – templete.lua

[js]
this.autowatch = 1
this.gc = 1

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

function loadbang()
print("loadbang was called")
end

function scriptload()
print("scriptload was called")
end
function float(v)
print("float", v, "inlet", this.last_inlet)
end

function int(v)
print("int", v, "inlet", this.last_inlet)
end

function list(…)
local values = {…}
print("list", table.concat(values, ", "), "inlet", this.last_inlet)
end

function dest_changed()
print("dest was changed")
end

function dest_closing()
print("dest was closed")
end

function draw()
local pos = math.random();

gl.Clear(GL.COLOR_BUFFER_BIT);
gl.Begin(GL.POLYGON)
gl.Vertex(-pos,-pos);
gl.Vertex(pos,-pos);
gl.Vertex(pos,pos);
gl.Vertex(-pos,pos);
gl.End();
gl.Flush();

end
[/js]

Max6 OpenGL バージョン確認

Top > Option > OpenGL Status で確認できます。OpenGL 2.1 / GLSL 1.20 のようです。最近の書籍などでは、OpenGL4.0対応の物もでているようなので、少し古いのかな・・・?

スクリーンショット 2013-10-08 23.57.29

Max6 で扱えるOpenGLの命令

OpenGLで使える命令は、 jit.gl.sketch のヘルプパッチで見ることができました。

スクリーンショット 2013-10-08 23.33.03

スクリーンショット 2013-10-08 23.33.11

※jit.gl.luaの場合は、glbegin → gl.Begin と書く必要があります。

OpenGL 2.1 Reference

OpenGL 2.1 Reference Pages

※jit.gl.lua で使う gl.Begin を調べたい場合 → glBegin で検索する必要があります。

 

OpenGL 参考ページ

手抜きOpenGL入門

OpenGLの先輩で、TMUG主催パーティ“ハロウィン・チャネル”でもご一緒する @irishoak 先輩オススメのページ。