VMWareにCentOS入れるところまでできたので、次はOpenGLを動かすことにする。
背景
CentOS上でopenCV使ってカードの検出を行うことができた。
次は検出した情報をもとに3Dモデルのレンダリングを行いたい。(カードの位置、傾きに応じてレンダリングしたりetc.)そうAR。
ただ、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)
実行結果
いい感じ。
今後の課題
とりあえずVMWare上でOpenGLを使った3Dレンダリングができるところまでできた。OpenGLを使ってやりたいことをざっと列挙
- 3Dモデルの表示(MMDとか)
- エフェクトの表示(演出のため)
こんくらいかな。
MMDモデルの頂点形式は変換かけてあげるとしても、サポートできない機能があるかもしれない。以前ひっかかった現象だとandroidの端末でスフィア非対応とか。
懸念点は色々あるけども、その都度対応していきましょう。