QtとC++とOpenGLで立方体で表示するよ2回目

I updated: 2017/06/03

※ここに書かれているやり方は古いので、こっちの方がベターです。

QtとC++OpenGLで立方体を表示させます!今回は色をつけますよ!

 以前、私が書いた立方体の表示は結構古い方法みたいです。例えば、glBegin()とglEnd()を使った描画は古い方法のようです。なので推奨される方法ではないです。

今回の方法もあまり推奨される方法ではないみたいですが気にしないことにします(´ε` )。前よりはちょっとは新しいやり方ですからいいとしましょう٩( 'ω' )و 

立方体の描画についてですが、3枚の四角形を描画して立体的に見えるようにしてます。そして各面を色付けしています。ソースでは頂点データがvx、色データがcolになります。

 


ソース中ではQtのQVector3Dという3点を持てるVector型を使ってます。これを使ってQVector<QVector3D>で各頂点と色を持つようにしてあります。<<オペレーターについてはpush_back()と同じ意味なので深い意味はないです。こっちのほうがキレイに書けたからこれを選びました。

それとSampleクラスとSampleGLクラスで分けてありますがぶっちゃけ分けなくても大丈夫です。SampleGLクラスには描画処理担当、Sampleクラスは他処理担当という感じに分けたかっただけです。

以下はソース。

#include <QApplication>
#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <QVector3D>

class SampleGL {
public:
  QVector<QVector3D> vx;
  QVector<QVector3D> col;
  GLuint buffers[2];
public:
  void init() {
    vx << QVector3D(-0.7,  0.8,  -7.0);
    vx << QVector3D(-0.1,  0.0,  -4.0);
    vx << QVector3D(-0.7, -0.2,  -7.0);
    vx << QVector3D(-0.1, -0.7,  -4.0);
    
    vx << QVector3D(-0.1,  0.0, -4.0);
    vx << QVector3D( 0.7,  0.0, -4.0);
    vx << QVector3D(-0.1, -0.7, -4.0);
    vx << QVector3D( 0.7, -0.7, -4.0);

    vx << QVector3D( -0.7, 0.8,  -7.0);
    vx << QVector3D(  0.6, 0.8,  -7.0);
    vx << QVector3D( -0.1, 0.0,  -4.0);
    vx << QVector3D(  0.7, 0.0,  -4.0);

    col << QVector3D(0.9, 0, 0);
    col << QVector3D(0.9, 0, 0);
    col << QVector3D(0.9, 0, 0);
    col << QVector3D(0, 0.9, 0);

    col << QVector3D(0, 0.9, 0);
    col << QVector3D(0, 0.9, 0);
    col << QVector3D(0, 0, 0.9);
    col << QVector3D(0, 0, 0.9);

    col << QVector3D(0, 0, 0.9);
    col << QVector3D(0.9, 0, 0.9);
    col << QVector3D(0.9, 0, 0.9);
    col << QVector3D(0.9, 0, 0.9);
				 //頂点、色のバッファを準備してバッファへ各データを転送
    glGenBuffers(2, buffers);
    glBindBuffer(GL_ARRAY_BUFFER, buffers[0]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(QVector3D)*vx.size(), 
vx.constData(), GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, buffers[1]); glBufferData(GL_ARRAY_BUFFER, sizeof(QVector3D)*col.size(),
col.constData(), GL_STATIC_DRAW); } void resize(int w, int h) { glViewport(0, 0, w, h); glEnable(GL_DEPTH_TEST); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum(-1.0, 1.0, -1.0, 1.0, 3.0, 100.0); glMatrixMode(GL_MODELVIEW); } void paint() { glClearColor(0.3f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //頂点と色を使う! glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_COLOR_ARRAY); //頂点配列を指定 glBindBuffer(GL_ARRAY_BUFFER, buffers[0]); glVertexPointer(3, GL_FLOAT, 0, 0); //色配列を指定 glBindBuffer(GL_ARRAY_BUFFER, buffers[1]); glColorPointer(3, GL_FLOAT, 0, 0); //描画! glDrawArrays(GL_TRIANGLE_STRIP, 0, vx.size()); } }; class Sample : public QOpenGLWidget, protected QOpenGLFunctions { private: SampleGL *sampleGL; public: Sample(QWidget *parent = NULL) : QOpenGLWidget(parent) { this->resize(350, 350); sampleGL = new SampleGL(); } ~Sample() { //不要になったらバッファを破棄 glDeleteBuffers(2, sampleGL->buffers); delete sampleGL; } protected: void initializeGL() { initializeOpenGLFunctions(); sampleGL->init(); } void resizeGL(int w, int h){ sampleGL->resize(w, h); } void paintGL() { sampleGL->paint(); } }; int main (int argc, char* argv[]) { QApplication appl(argc, argv); Sample sample; sample.show(); return appl.exec(); }

実行されたアプリケーション
quad