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

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

回転 Quaternion その2 |3Dプログラミング整理

次にオブジェクトを起点(0, 0, 0)にして、 自転をquaternionで行ってみる。

前回との差は、ほんの少し。 ofTranslateで基準点を変更するのみ。

前回と違う箇所は、ofTranslateの1行と、 ofShpereの中心座標の指定が0,0,0になっている箇所。

#include "testApp.h"


//  ワールド座標の各x,y,z軸を回転軸として、
//  quaternionによる回転を行ってみる。

//  ------------------------------------------------------------
//  各軸の正規化されたベクトルを定義
ofVec3f Znormal(0,0,1);
ofVec3f Xnormal(1,0,0);
ofVec3f Ynormal(0,1,0);


//  ------------------------------------------------------------
//  roll, pitch, yaw
float roll, pitch, yaw;


//--------------------------------------------------------------
void testApp::setup(){
    
    ofSetFrameRate(60);
    
    //  姿勢の初期値
    roll = 0.0;
    pitch = 0.0;
    yaw = 0.0;
}

//--------------------------------------------------------------
void testApp::update(){
    //  x軸を回転軸とする場合
    pitch += 1;
    
    //  y軸を回転軸とする場合
//    yaw += 1.0;
    
    //  z軸を回転軸とする場合
//    roll += 1.0;
}

//--------------------------------------------------------------
void testApp::draw(){
    
    ofBackground(0, 0, 0);

    //  ワールド座標上でのx,y,z軸の描画
    ofPushMatrix();
    {
        ofSetLineWidth(10.0);
        
        //  x
        ofSetColor(255, 0, 0);
        ofLine(0.0, 0.0, ofGetWidth(), 0);
        
        //  y
        ofSetColor(0, 255, 0);
        ofLine(0.0, 0.0, 0.0, ofGetHeight());
        
        //  z
        ofSetColor(0, 0, 255);
        ofLine(0, 0, -30.0, 0, 0, 30.0);
    }
    ofPopMatrix();
    
    
    //  各x,y,z軸毎の回転をquaternionとして作成
    ofQuaternion qr (roll, Znormal);
    ofQuaternion qp (pitch, Xnormal);
    ofQuaternion qy (yaw, Ynormal);
    ofQuaternion qt;    //  total quaternion
    
    qt = qr * qp * qy;
    
    
    ofSetLineWidth(1.0);
    ofSetColor(255);
    ofPushMatrix();
    {
        ofNoFill();
        
        //  トータルquaternionよりトータルな回転軸と回転量を取得
        ofVec3f qAxsis;
        float   angle;
        qt.getRotate(angle, qAxsis);
        
        ofTranslate(ofGetWidth()/2, ofGetHeight()/2, 0.0);
        
        //  そして回転
        ofRotate(angle, qAxsis.x, qAxsis.y, qAxsis.z);
        ofSphere(0.0, 0.0, 0.0,  100.0);
        
    }
    ofPopMatrix();
    
}