シミュレーションの可視化

OpenGLによる可視化

シミュレーション結果を可視化することで 原子の動きを直接観察することができます。 可視化は結果の解析の重要な第一歩となり、更には、 明らかにおかしい動きをしている場合は、 プログラムミスを発見する手がかりともなります。

ここでは、OpenGLとglutを使用した可視化の例を示します。 OpenGLは様々なプラットフォームで使用できるグラフィックライブラリーで、 glutはOpenGLのためのユティリティーツールキットです。 OpenGLとglutを使ったプログラムはWindows, Linux, Machintosh で動作させることが出来ます。 また、通常コンピュータグラフィックを使用するためには、 複雑なプログラムを作成する必要がありますが、 glutを利用することで比較的簡単に 3次元グラフィックの機能を使用することが出来ます。

下記のプログラムはOpenGLとglutを使ったサンプルプログラム(GLsample.c)です。 OpenGLとglutを使用することでこのような短い プログラムでも立体的な球を描画することが出来ます。

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

void init_gl(void)
{
  GLfloat light_position[] = {1.0, 1.1, 1.2, 0.0};
  glShadeModel(GL_SMOOTH);
  glLightfv(GL_LIGHT0, GL_POSITION, light_position);
  glMatrixMode(GL_MODELVIEW);
}
void display(void)
{
  GLfloat color[4] = {1.0, 0.0, 0.0, 1.0};

  glClearColor(0.0, 0.0, 0.0, 1.0);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  glEnable(GL_DEPTH_TEST);
  glEnable(GL_LIGHTING);
  glEnable(GL_LIGHT0);

  glLoadIdentity();
  gluLookAt(7.0, 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0);

  glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
  glutSolidSphere(1.0, 20, 20);

  glDisable(GL_DEPTH_TEST);
  glDisable(GL_LIGHTING);
  glDisable(GL_LIGHT0);

  glutSwapBuffers();
}
void reshape(int w, int h)
{
  glViewport(0, 0, (GLsizei)w, (GLsizei)h);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluPerspective(30.0, (double)w / (double)h, 1.0, 800.0);
  glMatrixMode(GL_MODELVIEW);
}
int main(int argc, char** argv)
{
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
  glutInitWindowSize (300, 300); 
  glutInitWindowPosition (100, 100);
  glutCreateWindow ("GLsample");
  init_gl();
  glutDisplayFunc(display); 
  glutReshapeFunc(reshape);
  glutMainLoop();
  return 0;
}

Cygwinを使用したとき、このプログラムは以下のようなコマンドでコンパイル、 実行することが出来ます。 プログラムを終了させるためにはコマンドラインからCTRL+Cを入力します。

> gcc GLsample.c -o GLsample -lglut32 -lopengl32 -lglu32
> GLsample

プログラムの実行結果は以下のようになります。

プログラムの実行結果

OpenGLによるシミュレーションの可視化

上の球を表示するプログラムと 分子動力学シミュレーションプログラムを組み合わせることで、 シミュレーションを計算しながら結果を表示する リアルタイム表示のシミュレーションプログラムを作ることが出来ます。「シミュレーションプログラムの作成」 md_program6.cGLsample.cを組み合わせたものが、md_program9.cです。md_program6.c と同じ???が4箇所ありますので、 プログラムを完成させて実行してみてください。

> gcc md_program9.c -o md_program9 -lglut32 -lopengl32 -lglu32
> md_program9

Cygwinで上記のようにコンパイル、 実行すると以下のような3D表示付きのシミュレーションプログラムが動作します。

3D表示付きシミュレーション

スペースキーを押すとシミュレーションのON/OFF、 マウス左ドラッグで回転操作、マウス右ドラッグでズームの変更が出来ます。