2011年12月12日月曜日

作業メモ:尹さん、NOIR_CM、ゴルフ場

【尹さんプロジェクト】
・作業PC:総合研究棟3Fハイスペックwindows
・作業ディレクトリ:E:\kawabata\Mojiko

【NOIR_CM】
・作業PC:総合研究棟3Fハイスペックwindows
・作業ディレクトリ:E:\kawabata\Noir_CM
・プログラム:総合研究棟地下PC
・OFバージョン:v007

【ゴルフ場】
・作業PC:総合研究棟3Fハイスペックwindows(途中までノートPC)
・作業ディレクトリ:C:\Users\gendalab\Documents\maya\projects\default
・バックアップ:研究室サーバー

2011年12月9日金曜日

momo

ACC CM FESTIVAL
http://www.acc-cm.or.jp/festival/11fes_result/

こういうところからどんな制作会社があるのか調べるくらいしかないんだよね。

2011年11月27日日曜日

テクスチャのあれこれ

メモです。

openFrameworksのofImageで読み込んだ画像をopenGLのテクスチャで使用する方法

ofTextureの使い方がようわからんのと、時間が無いというのを理由に無理矢理やります。基本的に自分の備忘録なので、自分が分かればよいというのを大前提で書きます。


【.hファイル】

#define IMAGE_NUM 10 // とりあえず10枚画像を読み込む事にする


ofImage image[IMAGE_NUM];

// テクスチャ用
unsigned char *(Data[IMAGE_NUM]);
GLuint texture[IMAGE_NUM];
GLdouble float_Data[IMAGE_W * IMAGE_H * 3];
ofColor color_Data;



【.cppファイル】

// 画像の読み込み
for( int i = 0; i < IMAGE_NUM; i++)
{
        image[i].loadImage( "../bin/data/Image/Model_0.jpg");

        // テクスチャ初期化
        // テクスチャ読み込み配列を定義
Data[i] = new unsigned char[IMAGE_W * IMAGE_H * 3];
        //初期化
memset(Data[i], 0, sizeof(unsigned char) * IMAGE_W * IMAGE_H * 3);

        //ここでカラー設定
for(int loopY = 0; loopY < IMAGE_H; loopY++)
{
for(int loopX = 0;loopX < IMAGE_W; loopX++)
{
//unsigned char* getPixels =  texIMG_3D[i].getPixels();
int imgW = (int)ofMap( loopX, 0, IMAGE_W, 0, imageW[i]);
int imgH = (int)ofMap( loopY, 0, IMAGE_H, 0, imageH[i]);
color_Data = image[i].getColor( imgW, imgH);
float_Data[loopY * (IMAGE_W*3) + loopX*3 + 0] = color_Data.r;
float_Data[loopY * (IMAGE_W*3) + loopX*3 + 1] = color_Data.g;
float_Data[loopY * (IMAGE_W*3) + loopX*3 + 2] = color_Data.b;
Data[i][loopY * (IMAGE_W*3) + loopX*3+0] = static_cast<unsigned char>( float_Data[loopY * (IMAGE_W*3) + loopX*3 + 0] );//r
Data[i][loopY * (IMAGE_W*3) + loopX*3+1] = static_cast<unsigned char>( float_Data[loopY * (IMAGE_W*3) + loopX*3 + 1] );//g
Data[i][loopY * (IMAGE_W*3) + loopX*3+2] = static_cast<unsigned char>( float_Data[loopY * (IMAGE_W*3) + loopX*3 + 2] );//b
//Data[i][loopY * (IMAGE_W*3) + loopX*3+0] = static_cast<unsigned char>((255/IMAGE_W)*loopX);//r
//Data[i][loopY * (IMAGE_W*3) + loopX*3+1] = static_cast<unsigned char>((255/IMAGE_H)*loopY);//g
//Data[i][loopY * (IMAGE_W*3) + loopX*3+2] = static_cast<unsigned char>((255/IMAGE_NUM)*i);//b
}
       }
}
// ピクセルを自由に使える処理?

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
//数を知らせる
glGenTextures(IMAGE_NUM, &texture[0]);
for( int i = 0; i < IMAGE_NUM; i++)
{
glBindTexture(GL_TEXTURE_2D, texture[i]); //1枚目をバインド(設定する)
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);// 拡大フィルタ
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);// 縮小フィルタ
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, IMAGE_W, IMAGE_H, 0, GL_RGB, GL_UNSIGNED_BYTE, Data[i]);
delete Data[i];
}

/*------------------------------------------------
以下の2行が無いと、アルファ抜きはできてもテクスチャ同士のアルファ抜きはできない
------------------------------------------------*/
/* テクスチャ環境 */
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
/* アルファテストの比較関数 */
glAlphaFunc(GL_GREATER, 0.f);


//----------------------------------------------
こんな感じでセットアップ完了

あとは使いたいところで
//----------------------------------------------

glBindTexture(GL_TEXTURE_2D, texture[imageID]);
/**** アルファテスト開始 ****/
glEnable(GL_ALPHA_TEST);
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
glTexCoord2d(0.0, 1.0); glVertex3d(-500, 500, 0.f);
glTexCoord2d(0.0, 0.0); glVertex3d(-500,-500, 0.f);
glTexCoord2d(1.0, 0.0); glVertex3d( 500,-500, 0.f);
glTexCoord2d(1.0, 1.0); glVertex3d( 500, 500, 0.f);
glEnd();
glDisable(GL_TEXTURE_2D);
/**** アルファテスト終了 ****/
glDisable(GL_ALPHA_TEST);

//----------------------------------------------
みたいに使えばOK


流れとしてはofImageからカラー情報を取り出して、Data配列にぶち込んで、textureに値を渡すというなんとも回りくどいやり方をやっている。
我流にもほどがあるだろ。

openGLの知識が要るのは、glGenTextures(IMAGE_NUM, &texture[0]);以下の設定の所かな。
ここでテクスチャの基本設定を行っているっぽい。

3Dテクスチャもこれと同じ作り方してたんだなー。結構汎用性があっていいかも。
unsigned char型のDataを扱っているところあたりがかなりプリミティブな処理をしているから、コードから原理がわかる。

memo

田所先生のブログ?
色々tipsが載ってます。
http://yoppa.org/ma2_10/2214.html


WindowsLiveMeshについての記事
http://www.atmarkit.co.jp/fwin2k/win2ktips/1359livemesh/livemesh.html

http://sodakeblog.wordpress.com/2011/01/16/live-mesh-2011%E3%81%A7%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%81%AE%E5%90%8C%E6%9C%9F/

DigitalBoutique_01

今もらっているお仕事(?)お遊び(?)のお話。

仮想ブティックを映像で作りプロジェクターで空間そのものを作り出してしまおうという計画。

単純に、芸能事務所のCM作りなのだが、自分のやりたいようにやらせてもらう。

【作業メモ】
Cortexのキャリブレーションデータ保存ディレクトリ
D:\kawabata\20111127_Noir\2320

Cortex情報
【バージョン】
Cortex-64 2.0.2.917
【手順】
1、立ち上げて、connect to cameras→Raptar,Eagle両方使った
2、保存ディレクトリを決める
3、静的キャリブレーション
4、動的キャリブレーション→なんとなく成功した
5、MiscのIPアドレス"10.1.1.250"
6、VisualC++のプロジェクトのCortexのセットアップのコードで
if(RC_Okay != Cortex_Initialize(const_cast<char*>("10.1.1.250"),const_cast<char*>("10.1.1.250"))){
とMiscのIPアドレスをコピペ
7、D:\kawabata\of_preRelease_v0061_vs2008_FAT\apps\myApps\oscSenderFromCortex_v04
のOFのプロジェクトを実行すると、送られてきたマーカー数と座標(テンプレートなし)を確認できる


今回は隣のPCを立ち上げることなく、C++でマーカー情報を取得することができた。
今までは、隣のPCに接続して隣のPCのIPアドレスをMiscとCortexセットアップの所に書かなければならなかった。

配線は全くいじっていないので原状復帰は楽にできそうだ

いつもはCortexのセットアップだけで時間がとられてしまうので、スムーズにいったのが逆に怖い。
本番動かないとかになりかねない。


ofxSimpleGuiTooをOFのver007以降で使おうとすると、
ofGraphicsのofSetColor(int gray)でエラーが出るので、
これをコメントアウトしてofSetColor(const ofColor & color)の方だけを使うようにすると通る。

2011年11月18日金曜日

回顧録_01

今までの自分を振り返った。好きなことに没頭する人生だったと思う。

勉強にしろ部活にしろ恋愛にしろ制作にしろ、全部「好きこそ物の上手なれ」だった。

没頭している間は、圧倒的な時間と労力を割くことができるが、
没頭できる事や環境がないと堕落してしまう性分なのだなとつくづく感じた。


後は「他人と自分は違う」という線引きをよくしている。それがプラスに働く時とマイナスに働く時の差が非常に激しい。ここが自分の最大の短所であり長所だと思う。
「自分は他人よりも劣るから頑張ろう」と思っている時は、凄まじい努力をするが、
「どうせ自分は低レベルな人間だから、高レベルなことはできない」と思い始めたらとことん堕落する。
極力後者は考えないようにはしているが、頭の片隅にいつも暗い雲のように居座っている事は確か。


非常に大雑把にまとめると以上の2点に尽きる人生だったなと笑

後は、弟の事もあり、個を大切にできる性格でもあるとは思う。個性を大切にする人間なのかなと。



大学生活は、「デザインを勉強している」という意識が全く欠けていた。漠然と「デザインって何なんだろう」と思っていただけだ。これが今までの自分に足らない最大の要素。「デザインとは...」そこから出直した方がよさそうだ。
ただ、自分の軸は見失ってはいけないので、心の核にどんどん塊を粘土のように付け足していくようなイメージを心がける。

デザインのプロセスとして、立案・設計・作成という3つの機軸を今まで経験してきたわけであるが、大学生活において「作成」の部分の閉占める割合が圧倒的に多かった。これからは「立案/設計/作成」の3つのフェーズをちゃんと意識した制作を心がけようと思う。

2011年11月15日火曜日

ofxAddonsあれこれ
http://ofxaddons.com/

nikki_20111114

当面の方針を決めようと思う。

今週はかなりだらけてしまった。つくづく自己管理ができない人間なのだなと再認識した。
目標がないと何もできない、というか何もしない。目標すらたてない。だから終始憔悴した一週間だった。
自分で課題を設定して、それに合致する解答を提示する。問題発見能力と問題解決能力の基礎的なトレーニング。

・球面波グラフィック
・3Dモデルの大量の頂点を使ったグラフィック
・BPコンテンツのプロトタイプのアイデア

こんな感じかな。

2011年11月9日水曜日

20111109_nikki

一つ大きな仕事が終わった。

単なるVJなのだが、今回はできるだけプログラミングだけで映像を生成する事を心掛けた。今回の課題としては、映像のテーマ性の欠如とインターフェースの不十分さが挙げられる。

テーマ性に欠けるので、全て思いつきの映像の断片の集合という様相を呈してしまった。これからはテーマを持ってその文脈に沿った映像を作り、一つの作品とまではいかないにしても何か一貫性と統一性を持った映像にしたい。そうする事で演出に個性が出てきて、観客に経験として記憶に残るような演出ができると思う。
それとインタラクションの種類を増やしたい。今の所、音、Kinectしか使っていない。他にも使えそうなものはガンガン使ってやりたい。

あとパターンが少なすぎた。使い回しが多くて雑に見えてしまう。まぁ今回は時間が無かったと言ってしまえばそれまでだが、効率化とアイデアを形にするスピード感が必須。

インターフェースに関しては、まずUIを別ウィンドウで制御できるようにしたい。OSCでやるのではなく他のやり方がないかちょっと調べてみたい。
個々の値の制御を全てUIでやれるようにしたのはよかったがとは思うが、不必要な値が多すぎてUI自体が煩雑になってしまった。

必要な機能とそうでない機能の見極めっていうのはかなり難しいし、経験に由来する部分が圧倒的に大きい。今回のフィードバックをきっちり行って次に臨みたい。


これからやる事といえば、
・webを一人で構築できるようになる(Dormitoryのサイト、Labのサイト)
・Ramaコンテンツ
・CGのバイト

こんなもんかな。

2011年10月30日日曜日

how_to_"vector"

vectorの使い方メモ

【.hファイル】
float型のベクターを使う場合

//宣言
vector <flaot> vec;

【.cppファイル】

//新しく作る
vec.push_back( float() );
int last = vec.size() - 1;
vec[last] = 10.f; // 入れたい値を入れる

// 全て削除
vec.clear();

//末尾の要素を削除
vec.pop_back();

//要素の値を使用する
for(int i = 0; i < vec.size(); i++)
{
    float a = vec[i];
}

以上はほんの基礎の基礎なので、ある条件を満たす要素にだけアクセスしたい場合などはイテレータを使う。イテレータの使い方はまた後ほど。

【追記 2011.11.26】
ここが参考になります
http://www.cppll.jp/cppreference/cppvector.html

【追記 2012.2.18】
参考サイト C++標準ライブラリ
http://www.geocities.jp/ky_webid/cpp/library/021.html

ある条件を満たす要素の削除

【.hファイル】:叙述関数の定義
class Check
{
   bool operator()(const particle _vec) // ベクターを作成する型をparticleとする
   {
      return _vec.life <= 0; // lifeが0以下のものを消すとする
   }
};


【.cppファイル】
// remove_if関数を使う
vactor<vec>iterator end_it = remove_if( vec.begin(), vec.end(), Check() ); // ここで条件に該当する要素を抽出する

// 本当の意味での削除を行う
vec.erase( end_it, vec.end() );


以上でできるが、イテレーターが何なのかまだよくわかっていないし、叙述関数も全然分からない。

また、機会があれば勉強したい。

nikki_20111029

今日は昼過ぎに起きてそのまま家で作業してしまった。

Curveクラスに機能を追加。
カーブをドラッグで描けるようにしたが、なんか微妙だったので結局ラインエフェクトに落ち着いた。


FontAnimクラスに機能を追加した。
キー入力したテキストが音に反応して形が変化するようにした。
あとはBPMにシンクロして、個々の文字がランダムに動く機能も追加した。

あとは、プロジェクターの投影領域に合わせて描画領域を設定できるようにしたいかな。

2011年10月29日土曜日

nikki_20111028

今日やった事をつらつらと。

テキスト表示クラスを作って、たくさん文字を表示させるものを作った。

その後、予定していた打ち合わせを行い、色々会場の細かい寸法などを聞いた。
会場がかなり狭いので、スクリーンの設置場所に困る。結局DJブースの所までスクリーンを下げる事に決定した。
プロジェクターは丸台をステージの前に置かせてもらうので、そこに置く。

スクリーンに枠を前もって付けておく作業が必要になるそうなので、それはやっておこうと思う。
またハンズマンの出番かの。

その後テキスト表示のクラスに手を加え、音と同期するシステムを作った。
やっと音と同期させる事が出来た、今までソースが全然分からなかったが、丁寧に読んでいけば分かった。

これからやらなければならない事は
・操作用のPCとのOSC同期
・曲間の演出が重くなりそうなので、そっちも取りかかる(最悪作った映像でも可)

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

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


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

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

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


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

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

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


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

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

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

2011年6月22日水曜日

ofxAssimp_01

openFrameworksにofxAssimpというアドオンがある。

(openFrameworksは公式サイト以外でgithubというファイルストレージサイトでバンバン新しいのが作られていくのを最近知った)

それを導入してみます。


openframeworks-openFrameworks-1efe3cb
という謎のOF(ググっても出てこない)を使用します。

多分以下のURLの主が
openFrameworks最新版 (非公式なのか?多分誰かが勝手に作ったのをあげてくれてるのか)
https://github.com/openframeworks/openFrameworks/tree/613e8bd83068cec93c93fc89904a7996d2f21aee
ちなみに上のURLのやつはemptyExampleすら動かなかった。

なぜかofSoundの所で未解決のシンボルどうのこうのっていうエラーが出る。


まずopenframeworks-openFrameworks-1efe3cbのaddonsExampleにあるofxAssimpExampleを立ち上げてビルドしてみる。

エラー出る。


assimpのソースファイルやライブラリのリンクが全くなされていなかったのが原因。

追加のインクルードディレクトリを以下のようにする

..\..\..\libs\openFrameworks
..\..\..\libs\openFrameworks\gl
..\..\..\libs\openFrameworks\3d
..\..\..\libs\openFrameworks\graphics
..\..\..\libs\openFrameworks\app
..\..\..\libs\openFrameworks\sound
..\..\..\libs\openFrameworks\utils
..\..\..\libs\openFrameworks\communication
..\..\..\libs\openFrameworks\video
..\..\..\libs\openFrameworks\math
..\..\..\libs\openFrameworks\types
..\..\..\libs\openFrameworks\events
..\..\..\libs\tess2\include (デフォルトにはない)
..\..\..\libs\glut\include
..\..\..\libs\rtAudio\include
..\..\..\libs\quicktime\include
..\..\..\libs\freetype\include
..\..\..\libs\freetype\include\freetype2
..\..\..\libs\freeImage\include
..\..\..\libs\fmodex\include
..\..\..\libs\videoInput\include
..\..\..\libs\glew\include\
..\..\..\libs\glu\include
..\..\..\libs\poco\include
//以下デフォルトにはない
..\..\..\addons\ofxVectorMath\src
..\..\..\addons\ofxAssimpModelLoader\libs\assimp\include\Compiler
..\..\..\addons\ofxAssimpModelLoader\libs\assimp\include
..\..\..\addons\ofxAssimpModelLoader\src
..\..\..\addons

追加のライブラリディレクトリを以下のようにする。

..\..\..\libs\glut\lib\vs2010
..\..\..\libs\rtAudio\lib\vs2010
..\..\..\libs\FreeImage\lib\vs2010
..\..\..\libs\freetype\lib\vs2010
..\..\..\libs\quicktime\lib\vs2010
..\..\..\libs\fmodex\lib\vs2010
..\..\..\libs\videoInput\lib\vs2010
..\..\..\libs\glew\lib\win_cb
..\..\..\libs\glu\lib\vs2010
..\..\..\libs\Poco\lib\vs2010
//以下デフォルトにはない
..\..\..\libs\tess2\lib\vs2010
..\..\..\libs\assimp\lib\win_cb


追加の依存ファイルを以下のようにする。

openframeworksLib.lib
OpenGL32.lib
GLu32.lib
kernel32.lib
setupapi.lib
glut32.lib
rtAudio.lib
videoInput.lib
libfreetype.lib
FreeImage.lib
qtmlClient.lib
dsound.lib
user32.lib
gdi32.lib
winspool.lib
comdlg32.lib
advapi32.lib
shell32.lib
ole32.lib
oleaut32.lib
uuid.lib
glew32s.lib
fmodex_vc.lib
glu32.lib
PocoFoundationmd.lib
PocoNetmd.lib
PocoUtilmd.lib
PocoXMLmd.lib
//以下デフォルトにはない
tess2.lib
assimp.lib


特定の既定のライブラリの無視を以下のようにする。
atlthunk.lib
LIBC.lib
LIBCMT
libcpmtd.lib


これで準備完了と思って、デバッグモードでビルドするとエラー。

vectorというファイルにエラーが起こっているらしい。少し調べてみると、たぶん何も入っていないアドレスにアクセスしたのかな。

という事で、Releaseモードでビルドしてみたら、通った。


これからボーンを制御できるのかどうかやってみます。

2011年6月21日火曜日