読者です 読者をやめる 読者になる 読者になる

catalinaの備忘録

ソフトウェアやハードウェアの備忘録。後で逆引きできるように。

Vmwareでopenglを実行する

VMWareCentOS入れるところまでできたので、次はOpenGLを動かすことにする。

 

背景

CentOS上でopenCV使ってカードの検出を行うことができた。

次は検出した情報をもとに3Dモデルのレンダリングを行いたい。(カードの位置、傾きに応じてレンダリングしたりetc.)そうAR。

3Dレンダリングの王道としてOpenGLでやってみる。

ただ、VirtualBox上のCentOSになぜかOpenGLが入らない問題が起きているのでVMWare上のCentOSで実行することにした。仮想環境依存の問題は今は気にしない。

(やりたいことの最終目標では3Dアクセラレーションが必須になるので、仮想環境の構築みたいにムダなところで時間とられたくない。)

 

openGLのインストール

 

sudo yum search flut

openglのパッケージを探す。develがついてるのが必要。

freeglut-develがよさそうなのでこれを使う。

sudo yum install freeglut-devel

 

後でこまったときにひけるように依存パッケージの一覧。

Installing:
 freeglut-devel                  x86_64            2.6.0-1.el6                   base               112 k
Installing for dependencies:
 freeglut                        x86_64            2.6.0-1.el6                   base               171 k
 libX11-devel                    x86_64            1.5.0-4.el6                   base               1.0 M
 libXau-devel                    x86_64            1.0.6-4.el6                   base                14 k
 libXdamage-devel                x86_64            1.1.3-4.el6                   base               9.3 k
 libXext-devel                   x86_64            1.3.1-2.el6                   base                74 k
 libXfixes-devel                 x86_64            5.0-3.el6                     base                12 k
 libXxf86vm-devel                x86_64            1.1.2-2.el6                   base                17 k
 libdrm-devel                    x86_64            2.4.45-2.el6                  base                83 k
 libxcb-devel                    x86_64            1.8.1-1.el6                   base               174 k
 mesa-libGL-devel                x86_64            9.2-0.5.el6_5.2               updates            479 k
 mesa-libGLU-devel               x86_64            9.2-0.5.el6_5.2               updates             82 k
 xorg-x11-proto-devel            noarch            7.6-25.el6                    base               274 k
Updating for dependencies:
 mesa-dri-drivers                x86_64            9.2-0.5.el6_5.2               updates            6.1 M
 mesa-libGL                      x86_64            9.2-0.5.el6_5.2               updates            110 k
 mesa-libGLU                     x86_64            9.2-0.5.el6_5.2               updates            196 k

 

そして以前に書いたエントリのopenglプログラムを適当に実行してみる。

とりあえずwindow表示することまでできた。

 

ポリゴンデータの描画

このままでは頂点データをもってきて描画できるのかどうか不安になってしまう。

とりあえずポリゴン描画の基本、三角形ポリゴンを描画してみる。

以下のサイトを参考にさせていただきました。

(http://asura.iaigiri.com/OpenGL/gl3.html)

 

以下ソースコード

(Test.cpp)


#include <GL/gl.h>
#include <GL/glut.h>


int WindowWidth = 512;
int WindowHeight = 512;

void Reshape(int x, int y)
{
    WindowWidth = x;
    WindowHeight = y;
    if ( WindowWidth < 1 ) WindowWidth = 1;
    if ( WindowHeight < 1 ) WindowHeight = 1;
}


void disp(void)
{
//    glClearColor(1 , 1 , 1 , 0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0, (double)WindowWidth/(double)WindowHeight, 0.1, 1000.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glViewport(0, 0, WindowWidth, WindowHeight);

    // 視点の設定
    gluLookAt(
        0.0, 0.0, -5.0,
        0.0, 0.0, 0.0,
        0.0, 1.0, 0.0 );

    /// 三角形を描画 ///
    glBegin(GL_TRIANGLES);

    // 頂点1
    glColor3d(1.0, 1.0, 0.0);        
    glVertex3d(0.0, 0.825, 0.0);

    // 頂点2
    glColor3d(0.0, 1.0, 1.0);
    glVertex3d(-1.0, -0.825, 0.0);

    // 頂点3
    glColor3d(1.0, 0.0, 1.0);
    glVertex3d(1.0, -0.825, 0.0);

    /// 描画終了 ///
    glEnd();

    glutSwapBuffers();
}

int main(int argc , char ** argv) {
    glutInit(&argc , argv);
    glutInitWindowPosition(100 , 50);
    glutInitWindowSize(WindowWidth , WindowHeight);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);

    glutCreateWindow("Window caption");
    glutDisplayFunc(disp);
    glutReshapeFunc(Reshape);
    glutMainLoop();
    return 0;
}

ついでに殴り書きしたMakefile

LDFLAGS =  -L/usr/X11R6/lib -lglut -lGLU -lGL -lXext -lX11 -lpthread -lm
all:
        g++ Test.cpp $(LDFLAGS)

 

実行結果

f:id:Catalina1344:20140621222058p:plain

いい感じ。

 

今後の課題

とりあえずVMWare上でOpenGLを使った3Dレンダリングができるところまでできた。OpenGLを使ってやりたいことをざっと列挙

  • 3Dモデルの表示(MMDとか)
  • エフェクトの表示(演出のため)

こんくらいかな。

MMDモデルの頂点形式は変換かけてあげるとしても、サポートできない機能があるかもしれない。以前ひっかかった現象だとandroidの端末でスフィア非対応とか。

懸念点は色々あるけども、その都度対応していきましょう。