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

I updated: 2017/06/03

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

QtとC++OpenGLを使って立方体を表示してみました。

OpenGLAPIの中には立方体を直接描画するものはおそらく無いので、
自力で立体的に描画する必要があると思う。

簡単に立方体の表示方法を説明すると、左側、正面側、上側に正方形を描画して、
それぞれに光源を設定すれば、立方体に見えるという仕組みになっています。

正直、光源設定がよく分かっていない!難しい!(。ŏ﹏ŏ)

 


以下はソース

#include <QApplication>
#include <QGLWidget>

class SampleGL {
public:
  void init() {}
  
  void resize(int w, int h) 
  {
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glEnable(GL_LIGHTING);	// 光源関係の設定①
    glEnable(GL_LIGHT0);	// 光源関係の設定②
    glEnable(GL_NORMALIZE);	// 光源関係の設定③
    glFrustum(-1.0, 1.0, -1.0, 1.0, 3.0, 1000.0);
    glMatrixMode(GL_MODELVIEW);
  }

  void paint() 
  {
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_QUADS);
      // 左側の面
      glNormal3f(1,1,1);	// 光源
      glVertex3f(-0.7,  0.8,  -7.0);
      glVertex3f(-0.1,  0.0, -4.0);
      glVertex3f(-0.1, -0.7, -4.0);
      glVertex3f(-0.7, -0.3,  -7.0);
      // 正面
      glNormal3f(0,1,1);	// 光源
      glVertex3f( -0.1,  0.0, -4.0);
      glVertex3f( 0.7,  0.0, -4.0);
      glVertex3f( 0.7, -0.7, -4.0);
      glVertex3f( -0.1, -0.7, -4.0);
      // 上側の面
      glNormal3f(1,0.4,1.0);	// 光源
      glVertex3f( -0.7, 0.8,  -7.0);
      glVertex3f( 0.6, 0.8, -7.0);
      glVertex3f(0.7, 0.0, -4.0);
      glVertex3f(-0.1, 0.0,  -4.0);   
    glEnd();
    glFlush();
  }
};

class Sample : public QGLWidget {
private:
    SampleGL *sampleGL;
public:
  Sample(QWidget *parent = NULL) : QGLWidget(parent) {
    this->setWindowTitle("Sample");
    this->resize(350, 350);
    sampleGL = new SampleGL();
  }
  ~Sample() { delete sampleGL; }
protected:
  void initializeGL() { 
    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(); 
}


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