Shadeで作った3Dモデルをofx3DModelLoaderで読み込んでみる

March 21, 2010
タイトルの通りですが、Shadeで作った3Dモデルをofx3DModelLoaderで読み込んでみます。

addonsExamplesの3DModelLoaderExampleを見ると、3dsのリスのモデルデータを読み込んでいます。
(どーでもいいですが、このモデル、JOJO第二部のカーズが腕から作り出したリスみたいでちょっと怖い。)
ソースを見るとofx3DModelLoaderオブジェクトを作って、loadさせるだけのようです。

//load the squirrel model - the 3ds and the texture file need to be in the same folder
squirrelModel.loadModel("squirrel/NewSquirrel.3ds", 20);


■Shade から3dsの書き出し
Shadeでモデルを作ります。oF側のデフォルトで表示させた場合、Shade内の10mmくらいのサイズで、ちょうどいい大きさになります。大きすぎるとカメラがモデルの中に入ってしまい、表示されなくなります。





次に、3ds形式に書き出します。[エクスポート][3D Studio]を選択。グループ名は[インデックス]。他のを選ぶとoFに読み込まれませんでした。


保存先は、プロジェクトのbin/dataの中です。テクスチャを貼ってある場合は自動的に同階層に保存されます。

■openFrameworks

testApp.h

#ifndef _TEST_APP
#define _TEST_APP

#include "ofMain.h"
#include "ofx3DModelLoader.h"

class testApp : 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);

ofx3DModelLoader modelObj;
};

#endif



testApp.cpp

#include "testApp.h"

//--------------------------------------------------------------
void testApp::setup(){

// 基本設定 --------------------------
ofBackground(0, 0, 0);
ofSetFrameRate(60);
ofEnableSmoothing();

// 隠面消去 --------------------------
glClearDepth(1.0);
glClear(GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);

// 照明 -----------------------------
GLfloat lt0_position[] = { 100, 100, 200}; //ライトの位置
GLfloat lt0_ambient[] = { 0.5, 0.5, 0.5, 0.5 }; //環境光
GLfloat lt0_diffuse[] = { 1.0, 1.0, 1.0, 1.0 }; //スポットライト

glLightfv(GL_LIGHT0, GL_POSITION, lt0_position); //0番ライトに設定
glLightfv(GL_LIGHT0, GL_AMBIENT, lt0_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, lt0_diffuse);

glEnable(GL_LIGHTING); //ライティング開始
glEnable(GL_LIGHT0); //0番のライトを点灯

// モデルデータロード -----------------------------
modelObj.loadModel("modelSample.3ds", 20 );
}

//--------------------------------------------------------------
void testApp::update(){

}

//--------------------------------------------------------------
void testApp::draw(){
static float count = 0;
count+=0.5; //回転角度を増やす

glPushMatrix(); //現在の表示位置を記憶

glTranslatef(ofGetWidth()/2.0, ofGetHeight()/2,0); //画面中心に移動
glRotatef( count, 0, 1, 0 ); //Y軸に回転
modelObj.draw(); //モデルを描画

glPopMatrix(); //記憶した位置に戻す

}

// 以下略



FlashのPV3Dの感覚では、オブジェクトは個別に位置情報を持っていて、それぞれに移動や回転を行えばOKですが、oF(というかOpenGL)は毎回位置を設定して描画するので、glPushMatrix();とglPopMatrix();が必要になります。最初、この考え方が分からず悩みました。現在は、プリミティブな形状をクラス化して、PV3Dライクに使えるように準備をしています。

Related Article