脳の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();
}
コメント
コメントを投稿