Lazy.h

Kinectとかのハードウェアからとってきた値を使うような処理をしていると、値の細かなブレが歓迎されない状況が多いので、ブレを吸収するためのテンプレートクラスを作ってみました。

Lazy.h on gist

組み上げたアプリへの導入が簡単になるよう、=で代入して右辺値で取り出すっていうシンプルな使い方にしていますので、目的の値の宣言をLazy<>で囲むだけで導入できます。

実際、すでに作った処理に対して組み込む作業を自分でもやってますが、かなり楽ちんです。

例えばfloatならLazy<float>、oFでofPointならLazy<ofPoint>にすればOK。

コンストラクタの第一引数か、もしくはsetSize関数でバッファの大きさを指定してやれば、それだけでブレ補正してくれるはずです。この値が大きいほど補正が強くなります。

以下軽く注意。

  1. 左辺値としては=演算子しか実装してないので、それ以外の使い方をしてるところがあればコンパイルエラーがでます。適切に処理してあげてください。
  2. setSize(unsigned int), clear(), reset(const T&)という関数がもともと定義してある場合、おそらく意味が変わっている上にコンパイル時にエラーとならないので、適切に処理してください。
    ※Tは<>内で指定した型
  3. コンストラクタの意味が変わっているので、そこはチェックしてください。
  4. テンプレートなのでどんなクラスでも使えますが、=演算子、+演算子、/(float)演算子が(適切に)実装されていることが必要です。

 

ちなみに、細かい設定はできませんがアニメーションにも使用できます。

以下のコードは0から1までの値を10分割補間して出力します。
※whlieの条件が環境によってはヤバそうですが、サンプルってことでご容赦を。

Lazy<float> value(10);
value = 0;
while(value < 1.0f) {
	printf("%f\n", value);
	value = 1.0f;
}

 

Amazon EC2(linux) で Tower.js

AmazonEC2 上の linux で Tower.js を試してみました。

Node.js を動かすところまでは検索でいろんな情報が見つかるんですが、Tower.jsで検索すると見つからなかったもので記録しておきます。

(別に特殊なことはないんですけどね・・)

  1. Amazon EC2 に登録する
    Amazon EC2を始める(導入編) – .zip -
  2. シェルを起動する

    AWS にログイン


    EC2 Console を開く


    Instances を選択


    インストールしたいインスタンスを選択して Instance Actions から Connect を選択


    今回は用意されているSSHクライアントを使用しました。

  3. MongoDBをインストール
    MongoDBのReplica SetsをUbuntuで試してみる - shinodogg.com -
    (この記事を書いている時点での最新版2.2.0を使いました)
  4. NVMからNode.jsをインストール
    Amazon EC2からnode.jsを使ってみる – .Develop -
    (この記事を書いている時点での最新版0.8.9を使いました)
  5. Tower.jsをインストールしてプロジェクトを作成
    さらばExpressよ!Tower.jsを試すの巻 - コードで一言 -

    僕の場合、プロジェクト作成後の npm tower install の行で下記のエラーが出ました。
    cb() never called!

    npm list を見ると kue というパッケージで unmet dependencies があったので npm install kue して解決。
    無事インストールできました。
    node_modules 内の node_modules へのインストールが危ういっぽい?

  6. 起動!
    $mongod –dbpath /path/to/db/ –logpath /path/to/logfile/ –fork
    $node server.js

ぱちぱちぱちぱち。

ポイントスプライトでテクスチャアニメーション

前回ジオメトリシェーダでポイントスプライトを実装しましたが、

このへんを見ると当然、テクスチャ座標を自分で設定したくなりますよね。

gl_TexCoord[0].st = vec2(0,0);
gl_TexCoord[0].st = vec2(0,1);
gl_TexCoord[0].st = vec2(1,0);
gl_TexCoord[0].st = vec2(1,1);

やることは至って単純で、右辺の0と1にあたる数値をCPUから設定してやるだけです。

0がUV位置、1がUV範囲と思えばわかりやすいかと思います。

両方をuniform変数で渡しても良いのですが、汎用性を考えてUV位置は頂点ごとに設定できるようにしました。

  • バーテックスシェーダ

    前回に加えて、glTexCoord2dでCPUから渡されたテクスチャ座標をジオメトリシェーダに渡してます。

    #version 120
    void main()
    {
     gl_Position = gl_Vertex;
     gl_TexCoord[0] = gl_MultiTexCoord0;
    }
    
  • ジオメトリシェーダ

    前回に加えて、テクスチャ座標の計算が入ってます。

    #version 120
    #extension GL_EXT_geometry_shader4 : enable
    uniform vec2 size; // 描画サイズ(CPUからglUniform2fで渡す)
    uniform vec2 size_uv; // UV範囲(CPUからglUniform2fで渡す)
    void main() {
     gl_Position = gl_ModelViewProjectionMatrix * gl_PositionIn[0];
     gl_Position.x -= size.x/2;
     gl_Position.y += size.y/2;
     gl_TexCoord[0] = gl_TexCoordIn[0][0];
     EmitVertex();
     gl_Position.y -= size.y;
     gl_TexCoord[0].t += size_uv.t;
     EmitVertex();
     gl_Position.x += size.x;
     gl_Position.y += size.y;
     gl_TexCoord[0].s += size_uv.s;
     gl_TexCoord[0].t -= size_uv.t;
     EmitVertex();
     gl_Position.y -= size.y;
     gl_TexCoord[0].t += size_uv.t;
     EmitVertex();
    }
    
  • フラグメントシェーダ

    そのまんまです。

    #version 120
    uniform sampler2D tex0;
    void main (void)
    {
     gl_FragColor = texture2D(tex0, gl_TexCoord[0].st);
    }
    

CPU側では、表示したいテクスチャをglBindTextureしてglUniform1iした上でこんな感じで描画しましょう。

glBegin(GL_POINTS)
glTexCoord2d(s,t);
glVertex3d(x,y,z);
glEnd();

これで、頂点に渡すテクスチャ座標を時間変化させるだけでテクスチャアニメーションができますね。

ジオメトリシェーダでポイントスプライト

OpenGLに、ポイントスプライトという機能があります。

点(Vertex)に対してテクスチャを貼り付けて表示するもので、パーティクルの表示等によく使われるみたいです。

もうちょっと自由度ほしいなーというのと、シェーダのお勉強のために、同等の機能をシェーダを使って実装してみました。

  • バーテックスシェーダ

    CPUから渡された座標をそのままジオメトリシェーダに渡します。

    #version 120
    void main()
    {
     gl_Position = gl_Vertex;
    }
    
  • ジオメトリシェーダ

    四角形ポリゴンを作ってテクスチャ座標を指定します。

    ※GL_GEOMETRY_INPUT_TYPE_EXTにはGL_POINTSを、GL_GEOMETRY_OUTPUT_TYPE_EXTにはGL_TRIANGLE_STRIPを指定しておきます。

    #version 120
    #extension GL_EXT_geometry_shader4 : enable
    uniform vec2 size; // 描画サイズ(CPUからglUniform2fで渡す)
    void main() {
     gl_Position = gl_ModelViewProjectionMatrix * gl_PositionIn[0];
     gl_Position.x -= size.x/2;
     gl_Position.y += size.y/2;
     gl_TexCoord[0].st = vec2(0,0);
     EmitVertex();
     gl_Position.y -= size.y;
     gl_TexCoord[0].st = vec2(0,1);
     EmitVertex();
     gl_Position.x += size.x;
     gl_Position.y += size.y;
     gl_TexCoord[0].st = vec2(1,0);
     EmitVertex();
     gl_Position.y -= size.y;
     gl_TexCoord[0].st = vec2(1,1);
     EmitVertex();
    }
    
  • フラグメントシェーダ

    テクスチャを参照して色を設定します。

    #version 120
    uniform sampler2D tex0;
    void main (void)
    {
     gl_FragColor = texture2D(tex0, gl_TexCoord[0].st);
    }
    

CPU側では、表示したいテクスチャをglBindTextureしてglUniform1iした上でこんな感じで描画しましょう。

glBegin(GL_POINTS)
glVertex3d(x,y,z);
glEnd();

福島ゲームジャム2012に参加しました

Global Game Jamという、参加者で結成される即席のチームで、毎回設定されるあるテーマに基づいて48時間でゲームをつくる、というなんともクレイジーなイベントがあります。

やってること自体はこうクレイジーなんですが、メインの目的はゲームを作ることじゃなくて

交流を深めるとか、チームワークの大切さを学ぶとか、新しいことに挑戦するとか、やり遂げる楽しさややり遂げられなかった悔しさを体験するとか、とにかくいろんな体験ができるイベントです。

メインイベントとなるGlobal Game Jamの他にも、なんちゃらゲームジャムという名前でゲームジャムイベントが存在するのですが、昨年から福島ゲームジャムが立ち上がり、今回2回目を迎えました。

前置きが長くなりましたが、今年の福島ゲームジャム福岡会場(なんのこっちゃ)がanno labでしたので、場所の管理がてらちょこっと参加させていただきました。

福岡会場ではゲームでなく映像を制作するとのことでした。

今回のテーマは「RISE」。

企画のブレストでかき回すだけかき回して、あとは普段の仕事しながら見守っとこうかなーという心づもりだったんですが

なんだかんだしっかり参加しちゃいました。



志賀島まで朝日を撮影しに行ったり

音楽を作ったり

みんながつくった動画をまとめる作業をしたり

いろいろやりました・・・。

時間がない中での制作は久しぶりだったので刺激になりました。

特に、制作される映像の詳細がわからないまま音楽を作るという超絶体験・・・!

映像との長さのギャップがあり、音楽がイイトコロで終わっているので、音楽単体も聞いて欲しいところではあります。

プロジェクトページ:http://fgj12.ecloud.nii.ac.jp/dokuwiki/doku.php?id=team%3A%E3%81%8B%E3%81%BC%E3%81%A1%E3%82%83%E3%81%AD%E3%81%93

映像:http://www.youtube.com/watch?v=N_VYjisP4sA

音楽:http://soundcloud.com/nariaki-iwatani/rise-for-fgj12-in-fukuoka

ofxGuiの拡張addonをつくったよ(ofxParamEdit)

—————————————————————————
(追記 – 20121224)

アップデートによってGithubのバージョンとこの記事の内容とに差異があります。
Githubの方のREADMEを参照ください。
—————————————————————————

ofxGuiという、超便利なaddonがあります。

この動画の画面左のやつです。

Eden 1.2 + ofxComposer + ofxGui from Patricio Gonzalez Vivo on Vimeo.

スライダーやトグルボタンでグラフィカルに変数をコントロールできて、そのために書くコードの量もさほど多くないというスグレモノなんですが

  • int,float,bool としてしか使えない(charとかucharとか使いたいことあるじゃん)
  • 利用する変数の型が気持ち悪い(intが使いたいだけなのにofxIntSliderを持っとかなきゃいけないなんて!)
  • そのせいで利用時に処理が深い(ポインタ参照やら関数呼び出しが3回くらい?)
  • アプリの規模がでかくなった時にまとめて管理しづらい(お手軽に使える故なんですが。。。)

あたりがもうちょっと解消されればなあと思って作りました。こちらです。

ofxParamEdit on Github

良い特徴としては

  • char, uchar, short, ushort, int, uint, float, double, bool が使える(内部的にはint,float,boolなので値域のはみだすバグがあるかも)
  • intとかfloatとかの普通の変数を持ってれば使える(すでに作ったアプリに組み込むのも簡単!)
  • 利用時の処理コストなし(普通に変数を参照するのと同じ)
  • コントロール群をグループとして管理するので、複数箇所で使う際に分離がよい

悪い特徴としては

  • 値を編集したときの処理が増えてる
    →たかだか1フレームに1回のことなので問題にはならないでしょう
  • Guiを作るのにofxParamEditのインスタンスが必要
    →ofxParamEditを複数作れることに利点もあるのでまあ一長一短ってことで。。。
    アプリ側でシングルトンにする運用も可だと思います。

あと、プログラムのコメントにも書いてますが、ofEventのremoveの動作が怪しい(たぶん)ので、ofxGuiの一部ソースをコメントアウトして利用してください。

ofxSlider.cppとofxButton.cppとofxToggle.cppのofRegisterMouseEventsの行です。

Pull Request歓迎なんでプログラマの方よろしくお願いしまーす!

これ、ofxGuiの本家に組み込んでもらいたいなー。

グループ化の処理は置いといたとしても、Guiの機能を持ったクラスを利用側が保持しとく必要があるのはあんまり良くないと思うんだ。

フォーラムのどこで提案すればいいんだろう。

pull requestできるところまで作るには規模のでかい変更になるのでまずはお伺いをたてたいのだが。。。

展示会情報 – あのぱっくんガーデン~CO2ぱくぱく!~

新作です。

夏休み期間ずっと、福岡市少年科学文化会館に置かせていただいています。

今日早速見に行ったんですが、子供たちのエネルギーがすごい!!

製作者圧倒されてきました。。楽しそうに遊んでくれていたので大満足です。

もちろん科学好きなので他の展示物も見てきたんですが、やっぱりわくわくですね。

水素カーラジコンとかもうわっくわくどっきどきうっきうきですよ。

今日は時間がなくてじっくり見られなかったのでまた後日時間のあるときに行こうと思います。

2012/07/21~2012/08/30の期間中ずっと展示されていますのでぜひおいでくださいませー!

子供向けですが、大人でも楽しく遊べますよ。:)

合同企画展「FUKUOKA こども 地球防衛隊」~未来の地球を救うのはキミだ!~

夏休みに、九州大学の環境とエネルギーに関する研究(水素エネルギーやカーボン・ニュートラル・エネルギーなど)を生かし、児童・生徒が科学に対する興味や関心を高めるような合同企画展を実施します。今回は、「FUKUOKAこども地球防衛隊」というテーマで、、未来のFUKUOKAの環境を守るために、子ども達が環境やエネルギーについて学びながら活躍するというストーリーを展開する予定である。また、「水素カーラジコン」や「二酸化炭素に関する実験」「水素の利用」など様々なコーナーも設置する予定である。、様々なクラフト工作やぬり絵もできます。

Perfume Global Site Project #001 – Programmer’s Answer – by annolab

とんだモンスターを作ってしまいました。

とりあえずこちらをどうぞ。メイキングもあるよ。

Anno Perfume 養成ギプス

Perfumeのモーションデータと同じポーズの写真を全フレーム分撮って並べれば踊ってる動画が作れるじゃん、という工程を自動化してくれるツールです。

ものすごく大変でした・・・その大変さも含めてひとつまとまったコンテンツになったかなあと思います。

今後、ゲーセンに置くとか、商業施設に置くとかの発展が欲しいなあ、とぼんやり考えてます。

もっとカジュアルに楽しめて、かつ成果物のクオリティも維持できれば充分キャッチーになると思うんだよなあ・・・

今のところ弱点は、

  • 姿勢によってはポーズの検知がうまくできない
  • 動画ができるまでにかける時間が長い
  • お手本の姿勢が見て取りづらい

なところかなーと思っているので、

例えばカメラを増やして、フレームレートを落として(できればうまく補間して)、お手本にはちゃんと人っぽい3Dモデルを使って・・・とすればちゃんと楽しめるコンテンツになるんじゃないかなー。

あとは与太話ですが

いろんなコンセプトを無視して、ポーズ検出のシステムってことにすればもっと汎用性ありそう。

例えば脱出ゲームで扉を開ける鍵にするとか、それこそダンスの練習システムにするとか、観光地の記念写真撮影ブースに組み込むとかいろんな発展があるはず。

コントローラー持たなくていいJUST DANCEにもなるかも。

誰か一緒に(あるいは勝手に)やりませんか?

ご連絡はこちらまで。お待ちしてますよ:)

anno lab

ofxBox2dとofxOpenCvを同時に使用する際に発生する(かも知れない)コンパイルエラーについて(vc10)

ofxBox2dを使っていたプログラムでofxOpenCvを使用しようとしたらいきなり身に覚えがないところで見に覚えのないコンパイルエラーが発生してしばらくはまっていたのでメモ。

コンパイル時に出るエラーログは下記で始まるやつでした。

1>c:program files (x86)microsoft visual studio 10.0vcincludexcomplex(441): error C2143: 構文エラー : ')' が 'const' の前にありません。
1>c:program files (x86)microsoft visual studio 10.0vcincludexcomplex(441): error C3861: 'dot': 識別子が見つかりませんでした
1>c:program files (x86)microsoft visual studio 10.0vcincludexcomplex(441): error C2059: 構文エラー : ')'
1>c:program files (x86)microsoft visual studio 10.0vcincludexcomplex(448): error C2065: '_Ty' : 定義されていない識別子です。
1>c:program files (x86)microsoft visual studio 10.0vcincludexcomplex(449): error C2143: 構文エラー : ';' が '{' の前にありません。
1>c:program files (x86)microsoft visual studio 10.0vcincludexcomplex(449): error C2447: '{' : 対応する関数ヘッダーがありません (旧形式の仮引数リスト?)

で、問題(っぽい)xcomplexの441行目付近は下記。

		// TEMPLATE FUNCTION norm
_TMPLT(_Ty) inline
	_Ty norm(const _CMPLX(_Ty)& _Left)
	{	// return squared magnitude
	return (real(_Left) * real(_Left) + imag(_Left) * imag(_Left));
	}

‘const’の前に’)'がないって言われてるってことは’norm(‘がおかしいんだろうなーと思ったんだけど、ちゃんと関数宣言してるからおかしいところないし・・・と思って次のエラーを見てみると

‘dot’ってなんやねん。

ってことで’#define norm dot’的なやつを探してみると、ありました。(VisualStudio使用なのでF12押しただけですけど)

ofxBox2dPolygonUtils.h(38)

// dot product (3D) which allows vector operations in arguments
//#define dot(u,v)   ((u).x * (v).x + (u).y * (v).y + (u).z * (v).z)
#define norm2(v)   dot(v,v)        // norm2 = squared length of vector
#define norm(v)    sqrt(norm2(v))  // norm = length of vector
#define d2(u,v)    norm2(u-v)      // distance squared = norm2 of difference
#define d(u,v)     norm(u-v)       // distance = norm of difference

で、ここからはもう別に調べる必要ないんですけど一応。問題の行は

_Ty sqrt(dot(const complex<_Ty>& _Left, const complex<_Ty>& _Left))

こんな風に展開されてて、コンパイラさんに「引数あるなら書いて欲しいんですけど’dot(‘とか知らんしwwwww’const’とか書く前に括弧閉じろしwwwwwww」

って言われてたわけですね。すっきり!でも腹立たしい!

で、とりあえずの解決策としてはofxBox2dPolygonUtils.hよりも前にxcomplexを#includeしてほしいので

ofxOpenCv.hをofxBox2d.hの前に#includeしてやれば通るようになりました。

(ちなみに#include <complex>はopencv2/core/core.hppにあります)

とりあえずはこれでいいけど、根本的にはofxBox2dでこんなに一般的な名前を#defineしてるほうが腹立たしくてしょうがないんですけどね!!!せめて#undefしろ!

(追記)

ofxBox2dPolygonUtils.hの#defineあたりのコードはどうやらofPolyline.cppを元にしているようでした。

僕はlibにビルドして使用してるからcppに書いてある分には問題ないけど、

プロジェクトにoFのソースまで含めて作ってる人(少なからずいると思うんだ)の間で問題になってないんだろうか・・・?

【WordPress】サブカテゴリを深い階層まで取得する関数

WordPressの話です。

query_posts(“cat=カテゴリID”)は、指定したカテゴリの記事を、そのサブカテゴリを最下層まで下って取得してくれます。

サブカテゴリはいりませんよ、というときはこの方法をどうぞ。

こちらで紹介されているget_subcat_idを使用してます。(直下のサブカテゴリのリストを返してくれます)

サブカテゴリを最下層までたどってそのリストを返す関数get_subcat_id_recursiveを使用して、

category__not_inを設定してはじく、という流れになります。

get_subcat_id_recursiveはget_subcat_idと一緒にfunction.phpにおいておくといいんじゃないでしょうか。


query_posts(array( 'cat' => カテゴリID, 'category__not_in' => get_subcat_id_recursive(カテゴリID) ));


function get_subcat_id_recursive($id) {
$cats = get_subcat_id($id);
$ret = $cats;
foreach($cats as $cat) :
$ret = array_merge($ret, get_subcat_id_recursive($cat));
endforeach;
return $ret;
}

しかし全体的に二度手間感が漂っているのが気になるところ…

もし、サブカテゴリを含まずにポストを取得するクエリがあるなら教えて下さいな。