ラベル openFrameworks の投稿を表示しています。 すべての投稿を表示
ラベル openFrameworks の投稿を表示しています。 すべての投稿を表示

2013年12月7日土曜日

earth.idlコンパイル方法

(1) Microsoft Visual C++ 2008 Express EditionからVisual Studio 2008 コマンド プロンプトを起動
(2) コマンドラインは以下の通り
  midl /cpp_cmd cl.exe /cpp_opt "/E" /out "出力先ディレクトリ" "earth.idlのあるディレクトリ"
*スペースに注意


参考:IDLコンパイル成功!
http://futr.cocolog-nifty.com/blog/2008/04/idl_f4f5.html

Google Earth COM API を C++ で使う
http://oshiro.bpe.es.osaka-u.ac.jp/people/staff/imura/computer/misc/google_earth_com_api/disp_content


------以下サンプルプログラムを空のプロジェクトから記述(追加のインクルードファイルにearth.hを追加)------
// main.cpp
#include     <windows.h>
#include     <iostream>

#include     "earth.h"

using namespace std;



int
main( int argc, char **argv )
{
     IApplicationGE     *app;
     ICameraInfoGE     *camera;
     HRESULT     hr;

     // COMの初期化

     CoInitialize( 0 );

     // IApplicationGE を得る
    
     hr = CoCreateInstance(
          CLSID_ApplicationGE,
          0,
          CLSCTX_LOCAL_SERVER,
          IID_IApplicationGE,
          reinterpret_cast<LPVOID *>( &app ));
     if ( FAILED( hr )) {
          cerr << "cannot create IApplicationGE" << endl;
          return -1;
     }

     // Google Earth の情報を得る

     AppTypeGE     app_type;
     int     major, minor, build;
     app->get_VersionAppType( &app_type );
     app->get_VersionMajor( &major );
     app->get_VersionMinor( &minor );
     app->get_VersionBuild( &build );
     cout << "You are using ";
     switch ( app_type ) {
     case EnterpriseClientGE:
          cout << "Google Earth Enterprise Client" << endl;
          break;
     case ProGE:
          cout << "Google Earth Pro" << endl;
          break;
     case PlusGE:
          cout << "Google Earth Plus" << endl;
          break;
     case FreeGE:
          cout << "Google Earth Free" << endl;
          break;
     default:
          cout << "Unknown" << endl;
          break;
     }
     cout << "version: " << major << "." << minor << "." << build << endl;

     // 初期化が終了するまで待つ

     BOOL     is_initialized;
     do {
          hr = app->IsInitialized( &is_initialized );
     } while ( is_initialized == false );

     // 現在のカメラ位置に関する情報を得る

     // まずカメラのインスタンスを取得する

     hr = app->GetCamera( true, &camera );
     if ( FAILED( hr )) {
          cerr << "IApplicationGE::GetCamera() failed" << endl;
          return -1;
     }

     // 各種パラメータの値を得る

     double     lat, lon, alt;
     AltitudeModeGE     alt_mode;
     double     range, tilt, azimuth;
     camera->get_FocusPointLatitude( &lat );          // 緯度
     camera->get_FocusPointLongitude( &lon );     // 経度
     camera->get_FocusPointAltitude( &alt );          // 高度
     camera->get_FocusPointAltitudeMode( &alt_mode );     // 高度の計測方法
     camera->get_Range( &range );
     camera->get_Tilt( &tilt );
     camera->get_Azimuth( &azimuth );
     cout << "現在の視点情報" << endl;
     cout << "注視点の緯度: " << lat << endl;
     cout << "注視点の経度: " << lon << endl;
     cout << "注視点の高度: " << alt << endl;
     cout << "高度の原点は地表: " << alt_mode << endl;
     cout << "注視点からの距離: " << range << endl;
     cout << "天頂角: " << tilt << endl;     // 水平だと90度
     cout << "方位角: " << azimuth << endl; // 注視点に対して視点が真南にあると
     // 0度。そこから時計まわりに角度が増える。

     // カメラを設定する

     app->SetCameraParams( 34.7316,     // 緯度
                                135.734,     // 経度
                                0.0,          // 高度
                                RelativeToGroundAltitudeGE,     // 高度の計測方法
                                300.0,     // 距離
                                0.0,          // 天頂角
                                0.0,          // 方位角
                                0.1 );     // 移動速度 (5.0より大きいと瞬時に移動)

     // 終了

     CoUninitialize();

     return 0;
}

2012年12月3日月曜日

Xcode4 with openFrameworks build


Xcode4 with openFrameworks

用意した Mac0SX10.6.sdk ディレクトリを/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs の中に置く

出典

2012年10月15日月曜日

openFrameworksでムービーテクスチャを3Dで使う


なんでできないんやろうって思ってたら、update()関数でidleMovie()してなかったわ。
これが諸悪の根源。昨日時間かなり使ってしまった。

てゆーかこれ、すごい楽。今までかなり回りくどいことしてテクスチャ生成してたな。
これやったら普通の画像でもつかえるやないかい。

/*---------------------------------------
テクスチャをgetTextureReference()でもってくる。
これをbind()するだけで普通のテクスチャと同じように扱えます。
当然UV座標もリソースの左上が原点です。
---------------------------------------*/
ofTexture &tex = MN_video.getTextureReference();// ←ofVideoPlayer()のインスタンス
tex.bind();

glMatrixMode(GL_TEXTURE);
glPushMatrix();
glLoadIdentity();

ofTextureData texData = tex.getTextureData();
if( texData.textureTarget == GL_TEXTURE_RECTANGLE_ARB)
{
glScalef( tex.getWidth(), tex.getHeight(), 1.0f);
} else {
glScalef( tex.getWidth() / texData.tex_w, tex.getHeight() / texData.tex_h, 1.0f);
}
glMatrixMode(GL_MODELVIEW);


glColor4f(1.f, 1.f, 1.f, 1.f);

// UV座標が
// 0-1
// | |
// 3-2 というイメージ
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
glTexCoord2d( 0.f, 0.f); glVertex3f( myPosition[3].x,  myPosition[3].y, myPosition[3].z);
glTexCoord2d( 1.f, 0.f); glVertex3f( myPosition[0].x,  myPosition[0].y, myPosition[0].z);
glTexCoord2d( 1.f, 1.f); glVertex3f( myPosition[1].x,  myPosition[1].y, myPosition[1].z);
glTexCoord2d( 0.f, 1.f); glVertex3f( myPosition[2].x,  myPosition[2].y, myPosition[2].z);
glEnd();
glDisable(GL_TEXTURE_2D);

MN_video.getTextureReference().unbind();

glMatrixMode(GL_TEXTURE);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);




2012年7月31日火曜日

XCode4.4でのOFビルド

mac osx 10.6のSDKがなくなってしまった。 http://qiita.com/items/3980a9082a2631565065

2012年6月21日木曜日

OFでios開発

openFrameworks 参考サイトまとめ
http://matome.naver.jp/odai/2133544611838053501



Retinaに映える!
美麗なiPhone/iPadアプリが作れるopenFrameworksとは


http://www.atmarkit.co.jp/fsmart/articles/openframeworks01/03.html


iOSのGUIをopenFrameworksのプロジェクトに追加する


http://yoppa.org/blog/2995.html
ボタンとかをつけれます。

2012年4月14日土曜日

Corelocationあれこれ


iPhoneアプリで位置情報と地図を使う
ための基礎知識


http://www.atmarkit.co.jp/fsmart/articles/geoios01/01.html

OFxiPhoneでデジタルコンパス
http://openframeworks.jp/forum/topic.php?id=26



2012年4月12日木曜日

ofxSimpleGuiToo導入

ofxAddons
http://ofxaddons.com/
上記のサイトから
ofxSimpleGuiToo
ofxMSAInteractiveObject
の2つのアドオンを入手。

追加のインクルードディレクトリの操作。


するとエラーが出る
fatal error C1083: include ファイルを開けません。'cairo-features.h': No such file or directory

'cairo-features.h'をインクルードしてあげる。
パスは
of_preRelease_v007_vs2010\libs\cairo\include\cairo


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を扱っているところあたりがかなりプリミティブな処理をしているから、コードから原理がわかる。

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() );


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

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

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モードでビルドしてみたら、通った。


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