「がんばれない」けど「がんばりたい」

ITエンジニアの仕事のこと。AI、機械学習、ディープラーニング。地頭力。車のこと。

カメラ ofCamera position |3Dプログラミング整理

カメラの整理を今回からしよー。

ofCamera カメラを採用する事で3D空間ビューの、どの範囲が画面に投影されるかを決定出来ます。 これって、なんで必要なんだろう…という疑問は未だなんとなくしかイメージ出来ていないのですが、

言い換えるとカメラは「ユーザの視点=目の位置になる」…ので、 前回までに整理していた「回転」の対象をオブジェクトや座標空間から、 視点に移動する事で、カメラの移動で、回転を表現出来るようにもなるのかな…と思ってたりします。

で、今回は、ofCameraのメソッドの1つである、 setPositionからやってみようと思う。

これ、その名前の通り、 カメラの位置を決めるメソッド。 今日はz軸の位置を変化させてみます。

今回のテストは、

1)画面の中央に球を描画する。球の中央座標は(ofGetWidth()/2, ofGetHeight()/2, 0)にして、半径は100とする。

2)カメラの位置を設定する。z軸の位置を変化させてみる。

画面左上の数値がカメラのz位置になります。 この値が増加している時は、カメラ位置のz位置がワールド座標上で増加する事になります。 分かりやすく言うと画面の手前。今、自分(あなた)が画面に座っている(普通そうだと思いますが…)とすると、 自分の方へカメラが移動しているという事になります。

#include "testApp.h"

int centerx, centery;
float _z;
float _direction_z;
bool isStart;

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

    ofBackground(33, 33, 33);

    ofSetFrameRate(60);
    ofEnableSmoothing();
    glEnable(GL_DEPTH_TEST);
    
    centerx = ofGetWidth()/2;
    centery = ofGetHeight()/2;
    
    
    //  カメラのz軸座標
    _z = 0;
    
    
    //  カメラのz軸座標の変化量
    _direction_z = 1;
    
    isStart = false;
    
}

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

    if (isStart == false) return;
    _z += _direction_z;
    
    if ( _z > 500 ){
        _direction_z = -1;
    } else if ( _z < 500 && _direction_z > 0) {
        _direction_z = 1;
    }
        
    cam.setPosition( centerx, centery,  _z);
}

//--------------------------------------------------------------
void testApp::draw(){
    
    
    ofSetColor(255);
    string pos = "camera z = " + ofToString(_z);
    ofDrawBitmapString(pos, ofPoint(10,10,0));
    
    cam.begin();
        ofSetColor(255, 0, 0);
        ofNoFill();
        ofSphere(centerx, centery, 0, 100);
    cam.end();

}

//--------------------------------------------------------------
void testApp::keyPressed(int key){
    //  何かキーを押したらスタート
    isStart = true;
}