openFrameworks で 3DCG を行う方法です。

プロジェクト名は graphics3D とします。

simple3d.png


2次元の図形からはじめる

まずは2次元の図形を描くところからはじめます。

void ofApp::draw() {
    ofTranslate(ofGetWidth() / 2, ofGetHeight() / 2);    // 画面の中心を原点にする
    ofRotateRad(ofGetElapsedTimef() * 0.5);              // 回転させる

    ofSetColor(65, 105, 225);
    ofSetRectMode(OF_RECTMODE_CENTER);
    ofDrawRectangle(0, 0, 300, 300);
}

回転の方法を変更してみる

上記のプログラムの ofRotateRad() を、ofRotateXRad() に変更してみます。

void ofApp::draw() {
    ofTranslate(ofGetWidth() / 2, ofGetHeight() / 2);    // 画面の中心を原点にする
    // ofRotateRad(ofGetElapsedTimef() * 0.5);              // 回転させる
    ofRotateXRad(ofGetElapsedTimef() * 0.5);

    ofSetColor(65, 105, 225);
    ofSetRectMode(OF_RECTMODE_CENTER);
    ofDrawRectangle(0, 0, 300, 300);
}

長方形は、実は3次元空間にあったことがわかります。

ofRotateXRad() は、x軸を中心に3次元回転を行う関数です。この例では、時間経過に応じて長方形がX軸を中心に回転し続けるため、手前と奥に傾く動きになります。

ofRotateYRad()ofRotateZRad() もあります。それぞれを組み合わせることも可能です。


3Dプリミティブを配置してみる

3Dプリミティブの例として、球と立方体を作成・配置してみます。

...略...

class ofApp : public ofBaseApp {
    public:
    ...略...
    
    ofSpherePrimitive sphere;    // 球プリミティブ
    ofBoxPrimitive box;    // 立方体プリミティブ
};
void ofApp::setup() {
    sphere.set(90, 8);                // 引数は半径と分割数
    sphere.setPosition(-150, 0, 0);   // 球の中心位置を設定

    box.set(180);                  // 引数は幅、高さ、奥行き
    box.setPosition(150, 0, 0);    // 立方体の中心位置を設定
}

void ofApp::draw() {
    ofTranslate(ofGetWidth() / 2, ofGetHeight() / 2);    // 画面の中心を原点にする
    sphere.drawWireframe();    // ワイヤーフレームで描画
    box.drawWireframe();       // ワイヤーフレームで描画
}