2011年10月27日木曜日

nikki_20111027

今日はkinectで人型のマスクを調整した。

人の形にくっきり投影できるようにしたかったが、どうしてもズレてしまう。いいアルゴリズムがあればいいんやけどな。

後、人型の深度情報を色相情報に変換する処理を加えた。kinectからの距離によって色相が変化してサーモグラフィーのようなエフェクトになった。

まだまだ詰められる箇所は多分にある。明日には全回復しているといいけど、風邪ひいて死んでた分を取り返そうと思う。

・人型の中にオブジェクトを生成→音と同期
・文字を人型の中に出す
・色がカラフルすぎるので、もう少し彩度を下げたりして調整を行う


今日途中で布に投影したらめちゃくちゃ綺麗に映った。あれで一つインスタレーションを作りたい。布の層に投影するような仕掛けのものを。
層にしてそこに映像を投影するとかなり綺麗なのでそれで一つ絶対作りたい。後は、中間のコンテンツがまだ形になっていないので、それを仕上げたいな。

卒業までにはBPコンテンツも一つ形にしたい。ゲームかな。
ゲームにしてしまうと、どうしても「複数人による一体感」っていうのが弱くなってしまいそうな気がしてたまらん。kinectを使おうにも、遅延は無視できないし。
でも卒業までには必ず形にしたい仕事。

2011年10月26日水曜日

nikki_20111026

風邪をひいた。
今日が山な気がする。熱もありそうだし全身が気だるい。

明日には回復して欲しいが、どうも最近風邪の治りが遅い。たぶん風邪をひいても普通に学校に来たりしてるからに決まってるが。

Bloggerをケータイにインストールした。この記事はケータイから投稿しています。

今日の活動内容と言えば、昔作ったCM映像の手直しに大半を使ってしまいそう。

プログラムの方はあまりいじる暇がなかった。風邪が治らない限りちゃんとした作業にならない。よってはよ風邪治せ。

2011年10月22日土曜日

nikki_20111021

今日は全く作業が進まなかった。

音入力の導入を始めようと思ったら、授業やら雑務やらに追われてしまった。

愚痴っぽくなるのは自分が弱い証拠。余裕はできるものではなく、作るもの。雑務に追われてしまったとか言い訳に過ぎない。

そう言えば、結局インターンのゲームも全く進めてないな。全然だめだ。

今日一日中、気落ちした気分になっていた。何故かはわからない。夜一人で帰っている時もどこか前向きな気分になれないでいた。


常に心の片隅に一抹の不安というか心の影の部分があるのが自分でもわかる。前にも言った通り、やりたい事とか目標とか理想がはっきりしないのが原因なのだと思う。

現状、映像もある程度作れる、プログラミングもある程度できる、CGもある程度できる、そんな中途半端な能力になってしまっている所に、やりたい事がはっきりしない自分の気持ちというのが色濃く出ているのだと思う。

やりたい事やるべき事できる事を見極める時間が必要なのかもしれない。自分探しとか気持ち悪いけど。


// 昔の日記を読み返した----------

めっさおもろい。最高のクズ野郎。なんでそこまで堕落できるといわんばかりの堕落と、どこから湧き出るか全く不明の自尊心!

元気出ました。これを読めば何でもできるような気がしますた。

2011年10月21日金曜日

nikki_20111020

今日した事を簡単に。

kinectで取得した2値画像をOSCで送るのは厳しい。640個の値を一気に送るのが限度のようだ。

VGAの分配を注文してそれで多面ミラーリングでやろうかと思うが、グラフィックの処理に負荷がかかってしまわないか少し不安である。たぶん大丈夫だろうとは思うが。

とりあえず640/16個の値を30フレーム毎に送るようにしている。それはそれでカクカクした映像で逆に面白かったりするんだが。

また、ImageSaverクラスを作ってスクリーンショットを撮れる様にした。画像をどこかのサーバーにアップするか、そのまま送信できるシステムがあれば画像を送ることができる。

これからやる事は、

①テキストシステムの実装
②音の入力
③VJツールシステム(motion diveみたいな)
④グラフィックのパターン

とまあこんな感じかな。

たぶん体に投影するのは違和感なくいけそうやけど、どういう配線でいくのか、映像の切り替えはどのように行うのか、など全然詰めきれていない。



今回の自分の内のテーマとして自分が楽しめるようなものを作りたい。DJが自分のプレイに酔うかのようなプレイと呼べるようなものにしたい。ライブ性、即興性、一体感、こんな感じのキーワードのイメージ。

2011年9月5日月曜日

nikki_20110905

【FLASH】

GraphAPIからFacebookの情報をFlashで取得しようとしたけどうまい事いかない。

エラーが出てビルドできない。

Facebookのインスタンス(?)がないと言われる。

井尻寮のサイトの改変はもう手を付け始めてもいいかもしれない。

地図を表示して、クリックすると特定の写真を閲覧できるものくらいならすぐに作れそうだ。



【3DTextureProjectionMapping】

前のソースコードを整理して、GLViewerクラスとCameraクラスを作って3D描画を使いやすくした。

3Dテクスチャのクラスはもう作っておいたので、3Dモデル表示のクラスも作りたい。

testApp.cppのソースコードが煩雑すぎるので、もっと整理したい。

[課題]
どのようなコンテンツに落とし込むか全く決まっていない。
場合によっては、お蔵入りになりかねない。少し考える期間を設けたいと思う。

2011年7月16日土曜日

realTimeProjectionMapping

昨日はopenFrameworks Tokyoがありましたね。Ustで見ました。

openFrameworks.jp
http://openframeworks.jp/

会場の無線環境のせいか少し途切れる場面がありましたが、だいたいは満足に見られました。

やっぱ会場にいくのと、中継とでは歴然の差があるのでしょうね。


昨日は上を見ながら、openFrameworksを使ったopenGLでの3Dtextureについてやってました。

だいたいはopenGL de プログラミング
http://wiki.livedoor.jp/mikk_ni3_92/d/%c8%af%c5%b8%ca%d406%3a%3a%a4%de%a4%c8%a4%e1%a5%b3%a1%bc%a5%c9

のサイトのサンプルコードを参考にしています。


人体のCTスキャンのような断面画像を3Dテクスチャ化して、どの断面を切っても中身が見れる、という状態を作りたい。

上記のサンプルコードを参考に3Dテクスチャの読み込み、初期化のクラスを作ってみました。

//以下"texture3D.h"-------------------------------------

#ifndef _TEXTURE_3D
#define _TEXTURE_3D

//#include "GL/glew.h"
#include "ofImage.h"

// テクスチャの縦横のピクセル数
#define TEX_WIDTH 256
#define TEX_HEIGHT 128
// 3Dテクスチャの奥行き
#define TEX_DEPTH 559


class texture3D {
public:
// コンストラクタ
texture3D();
// デストラクタ
~texture3D();

void setup( int _width, int _height, int _depth); // 初期化
void load( string _Img);
void loads( string _Img, int _ImgNum);
void end(); // 画像の消去

// 1枚だけ読み込み用変数(使わないと思うが)
ofImage texIMG_3D;
// 複数画像読み込み用配列
ofImage texIMGS_3D[TEX_DEPTH];
// 3Dテクスチャ用配列
unsigned char *Data;
GLuint texture[1];
GLdouble float_Data[TEX_WIDTH * TEX_HEIGHT * TEX_DEPTH * 3];
ofColor color_Data;

};

#endif
//以上--------------------------------------------------------

//以下"texture3D.cpp"------------------------------------------

#include "texture3D.h"


// コンストラクタ
texture3D::texture3D(){
        //特にないけど一応作った
}
texture3D::~texture3D(){
glDeleteTextures(1, &texture[0]);//本来は削除する
}

void texture3D::setup( int _width, int _height, int _depth){
int width = _width;
int height = _height;
int depth = _depth;

// 3次元テクスチャ用にテクスチャ読み込み---------------------------------------------
// テクスチャ読み込み配列を定義
Data = new unsigned char[width * height * depth * 3];
memset(Data, 0, sizeof(unsigned char)*width*height*depth*3);//初期化
//ここでカラー設定
    for(int loopZ = 0;loopZ < depth;++loopZ)
    {
            for(int loopY = 0; loopY < height;++loopY)
            {
                    for(int loopX = 0;loopX < width;++loopX)
                    {
//unsigned char* getPixels =  texIMG_3D[loopZ].getPixels();
color_Data = texIMGS_3D[loopZ].getColor( loopX, loopY);
float_Data[loopZ*(width*height*3) +loopY * (width*3) + loopX*3 + 0] = color_Data.r;
float_Data[loopZ*(width*height*3) +loopY * (width*3) + loopX*3 + 1] = color_Data.g;
float_Data[loopZ*(width*height*3) +loopY * (width*3) + loopX*3 + 2] = color_Data.b;
Data[loopZ*(width*height*3) +loopY * (width*3) + loopX*3+0] = static_cast<unsigned char>( float_Data[loopZ*(width*height*3) +loopY * (width*3) + loopX*3 + 0] );//r
                        Data[loopZ*(width*height*3) +loopY * (width*3) + loopX*3+1] = static_cast<unsigned char>( float_Data[loopZ*(width*height*3) +loopY * (width*3) + loopX*3 + 1] );//g
                        Data[loopZ*(width*height*3) +loopY * (width*3) + loopX*3+2] = static_cast<unsigned char>( float_Data[loopZ*(width*height*3) +loopY * (width*3) + loopX*3 + 2] );//b
//Data[loopZ*(width*height*3) +loopY * (width*3) + loopX*3+0] = static_cast<unsigned char>((255/width)*loopX);//r
                        //Data[loopZ*(width*height*3) +loopY * (width*3) + loopX*3+1] = static_cast<unsigned char>((255/height)*loopY);//g
                        //Data[loopZ*(width*height*3) +loopY * (width*3) + loopX*3+2] = static_cast<unsigned char>((255/depth)*loopZ);//b
                    }
            }
    }
glGenTextures(1, &texture[0]);
    glBindTexture(GL_TEXTURE_3D, texture[0]);
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glPixelStorei(GL_PACK_ALIGNMENT, 1);
    glTexParameterf(GL_TEXTURE_3D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); //フィルタ
    glTexParameterf(GL_TEXTURE_3D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexParameterf(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP);
    glTexParameterf(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP);
    glTexParameterf(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP);

    glGenerateMipmapEXT(GL_TEXTURE_3D);//ミップマップ自動生成
    glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB, width, height, depth, 0, GL_RGB, GL_UNSIGNED_BYTE, Data);
//glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB, width, height, depth, 0, GL_COLOR_INDEX, GL_FLOAT, float_Data); //これはだめ

delete Data;
}

void texture3D::load( string _Img){
string Img = _Img;
texIMG_3D.loadImage( Img );
}
void texture3D::loads( string _Img, int _ImgNum){
int ImgNum = _ImgNum;
string Img = _Img;
// 複数画像の読み込み
texIMGS_3D[ImgNum].loadImage( Img );
}
void texture3D::end(){
// 画像を消去したい場合
glDeleteTextures(1, &texture[0]);//本来は削除する
}
//以上-------------------------------------------------------

普段openGLでの画像の読み込みは結構面倒なのですが、ofImageを使うとかなり楽にできます。

void loads( string _Img, int _ImgNum);の関数で_Imgに画像のファイルパス、_ImgNumに画像の連番のIDをぶち込みます。

使い方としては、
10枚の連番画像を使うときは、


for( int i = 0; i < 10; i++){
tex3D.loads( "picture_" + ofToString( i ) + ".tga", i);
}


とすると、picture_0.tgaからpicture_9.tgaまでの画像が読み込まれます。


次に
void setup( int _width, int _height, int _depth);で初期化してあげます。(正確には初期化ではない)

縦横の幅とdepthは画像の枚数です。



openGLのテクスチャの貼り方なんですが、まだ勉強中でよく分かりません。どなたか教えてください。


glGenTextures(1, &texture[0]);
glBindTexture(GL_TEXTURE_3D, texture[0]);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glPixelStorei(GL_PACK_ALIGNMENT, 1);
glTexParameterf(GL_TEXTURE_3D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); //フィルタ
glTexParameterf(GL_TEXTURE_3D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameterf(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameterf(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameterf(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP);

glGenerateMipmapEXT(GL_TEXTURE_3D);//ミップマップ自動生成

ここまではだいたい分かるのですが、

glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB, width, height, depth, 0, GL_RGB, GL_UNSIGNED_BYTE, Data);

このglTexImage3Dに関する説明が書かれている書籍などが周りになくて...

だいたいglTexImage2Dの延長と考えれば何が書かれているのかわかるんですがね。

こんな感じで(大雑把!)できた画像が下です。










右が元の画像で、元の画像は人間を真上から見た状態の写真です。

それに対して、左の3Dテクスチャ化した画像は人間を前から見た状態になっています。

もう一枚



また、補足ですが、

glTexParameterf(GL_TEXTURE_3D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); //フィルタ
glTexParameterf(GL_TEXTURE_3D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);

の第三引数のGL_LINEARがGL_NEARESTになっていて、depthの補完が段階的になっていて、汚かったです。

おそらく補完の方法の指定でGL_LINEARは文字通り線形補完なのだと思います。



追記

①512*512の画像だと、100枚くらいしか使えなかった。

その際のエラーが「配列サイズは0x7FFFFFF(2147483647)まで」と出たが、計算しても配列サイズはそれに収まる。なーぜ。

2011年7月14日木曜日

waveSystem_01

張り切ってブログ始めたけど、もう半月以上放置してしまった。相変わらずの三日坊主っぷりだ。


所で、今何をやっているのかというと、

表面に波を発生させる球を前々に作って、今度それを授業の課題として提出しようとしている。

もう基本的なシステムは完成している。


こんな感じのイメージになる。

昔に作ったものではあるが、まったく日の目を浴びることなく、お蔵入りになっていたので、今回晴れて作品として落ち着かせることができる。

これをオーディオのビジュアライザのようにしようと画策中。


そこで、この球面波の部分だけをクラスにしようとしているけど、うまくいかなーい!アクセスバイオレーションが発生してしまう。

うまくいったと思ったら今度は無茶苦茶な座標値となって球にならなーい。

クラスってどうやって作るんだって所からやり直し!