OpenFrameworksの覚書 ofxAssimpModelLoaderのおっせかい機能(サイズの規格化)の解除

昨年3Dモデルに少し足を踏み入れたが(脳の3DグラフィックをOpenFrameworksで作成)、特別アプリケーションを作っていなかったので脳の3Dモデルを使ってアプリケーションを作ろうと思う。
同様に、Brainder(http://brainder.org/download/brain-for-blender/)のモデルを使わせてもらうが、今回は大脳が領域ごとに独立したモデルを使いたい。
そのためには、モデルを70個くらい用意して、一つ一つにファイルをロードしなくてはいけない。そこは別になんとかなるんだけど、
すべてのモデルをfor文回して、描画したときに位置とかサイズとかおかしなことに。。。


こんな感じ。なんでしょうねこれは。。。
Blenderにインポートしてみてもちゃんと表示されるし、どうしたものかと数日悩んでいた。
で調べてみたら、
OFの知恵袋的なところで同じような問題を抱えている人が質問投げていて、理由がわかった。
どうやらofxAssimpModelLoaderってやつはtraditional OF coodinate systemに合うように、勝手にモデルのサイズを調整してくれちゃううらしい。マジおせっかいな機能だ。traditional OFなんちゃらってのが何かはさておき、そのおせっかい機能を無効にするためには、

model.setScaleNormalization(false);

とすればいいみたい。わかってしまえば単純な。
早速やってみると


まあきれい!


ソースコードは以下のような感じで、
ファイル読み込むところはtxtファイルにファイル名の一覧を作ってその文字列を頼りにloadModelをしています。(ディレクトリ内のファイル名をとってくる方法がわかんなかったので。)

ヘッダーファイル
#pragma once

#include "ofMain.h"
#include "ofxAssimpModelLoader.h"
#include "ofxGui.h"
#define modelNum 70

class ofApp : public ofBaseApp{

public:
void setup();
void update();
void draw();

void keyPressed(int key);
void keyReleased(int key);
void mouseMoved(int x, int y );
void mouseDragged(int x, int y, int button);
void mousePressed(int x, int y, int button);
void mouseReleased(int x, int y, int button);
void windowResized(int w, int h);
void dragEvent(ofDragInfo dragInfo);
void gotMessage(ofMessage msg);
    
    ofxAssimpModelLoader modelPial[modelNum];
    ofEasyCam cam;
    ofLight light;
    //gui
    ofxPanel gui;
    ofxToggle guiToggle[modelNum];
    Boolean pialVisible[modelNum];
};

実行ファイル
#include "ofApp.h"

//--------------------------------------------------------------
void ofApp::setup(){
    ofBackgroundHex(0x000000);
    ofSetFrameRate(30);
    ofEnableAlphaBlending();
    ofEnableBlendMode(OF_BLENDMODE_ALPHA);
    ofEnableDepthTest();
    glShadeModel(GL_SMOOTH);
    ofEnableSeparateSpecularLight();
    
    //camera
    cam.setDistance(4000);
    
    //
    ofFloatColor initAmbColor = ofFloatColor(0.8,0.8,0.8,1.0);
    ofFloatColor initDifColor = ofFloatColor(0.7,0.7,0.7);
    ofFloatColor initSpeColor = ofFloatColor(0.6,0.6,0.6);
    
    //light setting
    light.enable();
    light.setSpotlight();
    light.setPosition(100,100,100);
    light.setAmbientColor(initAmbColor);
    light.setDiffuseColor(initDifColor);
    light.setSpecularColor(initSpeColor);
    
    ofColor initColor = ofColor(100, 100, 100, 255);
    ofColor minColor = ofColor(0,0,0,0);
    ofColor maxColor = ofColor(255,255,255,255);

    //gui
    gui.setup();
    
    
    ifstream ifs("任意のディレクトリ/pial_DK_obj_list.txt");
    string buf;
    string dir;
    dir = "Pial_DK_obj/";
    
    int num;
    num = 0;
    while(getline(ifs, buf)){
        string tmp;
        istringstream stream(buf);
        while (getline(stream, tmp, ',')){
            tmp = dir + tmp;
            modelPial[num].loadModel(tmp,true);
            modelPial[num].setScaleNomalization(false);
            gui.add(guiToggle[num].setup(tmp, pialVisible));
            num++;
        }
    }
}

//--------------------------------------------------------------
void ofApp::update(){
}

//--------------------------------------------------------------
void ofApp::draw(){
    ofEnableDepthTest();
    cam.begin();
    
    ofPushStyle();
    ofSetColor(100, 100, 100, 255);
    for (int i = 0; i < modelNum; i++) {
        if(guiToggle[i]){
            modelPial[i].drawFaces();
        }
    }
    
    ofPopStyle();
    
    cam.end();
    
    ofDisableDepthTest();
    gui.draw();
}

コメント

このブログの人気の投稿

入力インピーダンスってなに?

脳の3DグラフィックをOpenFrameworksで作成

デトロイト美術館展 上野の森美術館