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とバージョンがあっているため、この書籍は勉強しやすいです。

動的に生成したパッチを繋ぐサンプル2:Max6,JavaScript

スクリーンショット 2014-01-26 17.53.54

大量のパッチを繋ぐの面倒くさい!のでjsパッチで書いてみました。[generate 200]を押すと、一気に200個のcounterオブジェクトが生成され、かつrouterオブジェクトに繋ぐ事が可能です。function patch の内容を変えて使ってみてください。ようやくjsパッチのお作法が掴めてきたかなという感じです。JSパッチによる自動生成は、失敗するとパッチが全部見えなくなったり、Maxが落ちたりするので、気をつけてご利用ください。

JSパッチのメモ

  • this は jsthis のインスタンス
  • jsthis は maxobject を継承してる
  • patcher は maxobject を継承している。maxobjectのコンテナな扱い。
  • maxobject は、それを含んでいるpatcherへの参照を保持してるので辿れる。

[javascript]
"use_strict"

autowatch = 1;
inlets = 1;
outlets = 0;

var p = this.patcher;
var generatedObjects = [];
var GENERATE_CLASS_NAME = "counter"
var CONNECT_OBJECT_CLASS_NAME = "route";

function generate(num){

if(num <= 0) return;

var windWidth = p.wind.size[0];
var windHeight = p.wind.size[1];

var rect = this.box.rect;
var width = rect[2] – rect[0];
var height = rect[3] – rect[1];

var x = rect[0];
var y = rect[1];

for(var index = 0 ; index < num ; index++){

var numRow = Math.floor(windWidth / width);
var column = Math.floor(index / numRow);
post("numRow:" + numRow);
var row = index % numRow;
generatedObjects.push(p.newdefault(width * row,y + height * (2 * (1 + column)),GENERATE_CLASS_NAME));
}

patch()
}

function remove(){

for ( var index = generatedObjects.length-1; index >= 0; index–)
{
p.remove(generatedObjects[index]);
}

generatedObjects = [];
}

function patch(){

//find object for outlet
var connectOutletObject = findObjectFromClass(CONNECT_OBJECT_CLASS_NAME);
post("find:" + connectOutletObject.maxclass);
post();

//connecting
for(var index = 0 ; index < generatedObjects.length ; index++){

if(generatedObjects[index].valid == 1){

p.connect(connectOutletObject,0,generatedObjects[index],0);
}
}
}
patch.local = 1;
//varname tsu kau
function findObjectFromClass(className){

post("objectCount:" + p.count);
post();

var object = p.firstobject;

while(object){

post(object.maxclass);
post();

if(object.maxclass == className){

return object;
}

object = object.nextobject;
}

return nil;
}
findObjectFromClass.local = 1;

[/javascript]

Mac OS X Marvericks で Arduino Fio + Funnel + Processing を使いたいー!

Marvericks 環境で Arduino Fio + Funnel を構築するのに苦労したのでメモ。基本的にはFunnel Libraryに含まれているドキュメント通りにセッティングします。
写真

メモ

  • Processing は 1.5.1 を利用する。Processing 2.0 には非対応。
  • Funnel Library は、funnel-1.0-r801.zip を使う。
  • 806の方だとProcessingのExampleが全く立ち上がらない。
  • 801でもExample起動した段階でNullPointerException が出ますが無視。
  • XBee S1 を使う。XBee S2 ではFunnel 対応していないようです。

Arduino Fio の Analog 8 入力取得

スクリーンショット 2014-01-24 14.47.51

2014年に「XBeeで作るワイヤレスセンサーネットワーク」をやってみる:Arduino,XBee

picture_large978-4-87311-530-6

2014年の環境でXBee本やってみる

オライリーから出版されている「XBeeで作るワイヤレスセンサーネットワーク」を読みつつXBeeをやっているのですが、2014年現在のMac + Mavericks + Arduino 1.0の環境で上手くできなかったり、突っかかる部分があったのでメモをしておきます。

  • Arduino1.0 から Serial.print が利用できなくなっているので、サンプルコードのSerial.print は  Serial.write へ変更する。(例 : Serial.print(0x7E, BYTE);  → Serial.write(0x7E);
  • Mac版 XCTUでてた
  • Mac版 XCTUでATモードのXBeeであれば、設定ができるようになっている。
  • Mac版 XCTUだとAPIモードのファームを書き込んだXBeeが読みこめない。なぜだろう。Win版の古いx-ctuでならAPIモードのXBee設定変更できた。
  • baud rate が9600でやっているつもりが、いつの間にか  57600 に設定されていた。ファームの初期値が変更されたのか・・・?baud rateが合ってないと、xctuと全く通信できないので困る。
  • CoolTerm 等を利用した “+++”から始まるATモードの設定が全くできない。baud rateの問題かも・・・

追記

いままでXBeeの設定をArduino用のWIRELES PROTO SHIELDでやってたんですが、XBee FTDI Breakout Board (XBee USB アダプター)買ったらMacのXCTUでも簡単に設定変えられるようになった・・・!困っている方いたら、ご参考ください。

ロマンチック照明センサー

BdsqUbwCAAIPe0y

色々問題にぶつかりつつも、Coordinator側をAPIモードに設定し、「ロマンチック照明センサー」作れました。

参考サイト