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

脳の3Dグラフィックを書きます。
3次元の位置座標データがあれば、どんなものでもかけます。
MRIで撮像した構造画像からも作れるはず(詳しいことは知りません)ので、個人の脳を3Dグラフィックにもできるし、さらには3Dプリンターで印刷もできるはず(そのうちやるかも)。

今回は、以下のサイトからデータはダウンロードしました。

Brainder
http://brainder.org/download/brain-for-blender/

皮質も皮質下もデータあるみたいです。とりあえず今回は皮質だけ。
今回の方法では、objファイルとplyファイルであれば読み込みできます。


OFのプロジェクトジェネレータで、アドオンを追加します。
ofxAssimpModelLoader :objファイルplyファイル等々を読み込める。



//左右別なので二つ用意
ofxAssimpModelLoader modelL;
ofxAssimpModelLoader modelR;

//モデルのロード
modelL.loadModel("lh.pial.ply",true);
modelR.loadModel("rh.pial.ply",true);

基本はこれだけ!モデルの読み込みに自分のPCだと一つにつき2分ほどかかりました。最初なんかプログラムがいけないのかと疑ってしまった。



こんな感じになります。アドオンでGUIつけて、色を変えられるようにしてみました。なぜか、depthcheckするようにするとGUIがちゃんと表示されない…なんでだろう。

ヘッダーファイル
#pragma once

#include "ofMain.h"
#include "ofxAssimpModelLoader.h"
#include "ofxGui.h"

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);
void mouseScrolled(double x, double y);

ofxAssimpModelLoader modelL;
ofxAssimpModelLoader modelR;
ofEasyCam cam;
ofLight light;

//gui
ofxPanel gui;
ofxColorSlider color;
ofxFloatColorSlider ambColor;
ofxFloatColorSlider difColor;
ofxFloatColorSlider speColor;
};


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

//--------------------------------------------------------------
void ofApp::setup(){
ofBackgroundHex(0x000000);
ofSetFrameRate(30);
ofEnableAlphaBlending();
ofEnableBlendMode(OF_BLENDMODE_ALPHA);  
    //ofEnableDepthTest();      
    glShadeModel(GL_SMOOTH);  
ofEnableSeparateSpecularLight(); 
//カメラ
cam.setDistance(800);

ofFloatColor initAmbColor = ofFloatColor(0.5,0.5,0.5,1.0);
ofFloatColor initDifColor = ofFloatColor(0.5,0.5,0.5);
ofFloatColor initSpeColor = ofFloatColor(0.8,0.8,0.8);
ofFloatColor minFloatColor = ofFloatColor(0,0,0,0);
ofFloatColor maxFloatColor = ofFloatColor(255,255,255,255);

//ライト設定
light.enable();
light.setSpotlight();
light.setPosition(100,100,100);
light.setAmbientColor(initAmbColor);
light.setDiffuseColor(initDifColor);
light.setSpecularColor(initSpeColor);

// colorの初期値、最小値、最大値を設定
    ofColor initColor = ofColor(200, 200, 200, 255);
    ofColor minColor = ofColor(0,0,0,0);
    ofColor maxColor = ofColor(255,255,255,255);

modelL.loadModel("lh.pial.ply",true);
modelR.loadModel("rh.pial.ply",true);

//gui
gui.setup();
gui.add(color.setup("color", initColor, minColor, maxColor));
gui.add(ambColor.setup("Ambient color", initAmbColor, minFloatColor, maxFloatColor));
gui.add(difColor.setup("Diffuse color", initDifColor, minFloatColor, maxFloatColor));
gui.add(speColor.setup("Specular color", initSpeColor, minFloatColor, maxFloatColor));
}

//--------------------------------------------------------------
void ofApp::update(){
light.setAmbientColor(ambColor);
light.setDiffuseColor(difColor);
light.setSpecularColor(speColor);
}

//--------------------------------------------------------------
void ofApp::draw(){

cam.begin();

ofPushStyle();
ofSetColor(color);
modelL.drawFaces();
modelR.drawFaces();
ofPopStyle();

cam.end();

gui.draw();
}

コメント

このブログの人気の投稿

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

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