OpenGLを使ってみよう

とりあえず使ってみようということで,つぎのプログラムを書いてみました.オイラー法で素朴に斜方投射をシミュレート,描画するプログラムです.

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

int width = 300, height = 600;

/* 初期値 */
float y = .0;
float Vy = 200.;
float g = 9.8;
float t = .0;
float dt = .1;
float x = -1.;
float Vx = .03;

float yi[1000];  /* 軌跡データ格納用 */
float xi[1000];
int i=0, j=0;

void FreeFall(void){
  /* axis */
  glColor3f(.2, .3, .5);
  glBegin( GL_LINES );
    glVertex2d(-1, 0);
    glVertex2d(1, 0);
  glEnd();

  /* draw points */
  glColor3f( .9, .2, .2 );
  glPointSize(4.);
  glBegin( GL_POINTS );
    glVertex2f( x, y);
  glEnd();

  /* draw orbits */
  glColor3f( .5, .2, .2 );
  glBegin( GL_LINE_STRIP );
  for(j=0 ; j<i ; j++)
    glVertex2f( xi[j], yi[j]);
  glEnd();

  /* draw points par 10 */
  glColor3f( 1., 1., 1. );
  glPointSize(4.);
  glBegin( GL_POINTS );
  for(j=0 ; j<i ; j+=50)
    glVertex2f( xi[j], yi[j]);
  glEnd();
}

void display(void){
  glClearColor( .0, .0, .0, .0);
  glClear( GL_COLOR_BUFFER_BIT );
  FreeFall();
  glutSwapBuffers();
}

void idle(void){
  float a;

  y += Vy*dt;
  a = -g;  /* 加速度一定, 下向き */
  t += dt;
  Vy += a*dt;
  x += Vx*dt;
  
  /* 軌跡データ格納 */
  yi[i] = y;
  xi[i] = x;
  i++;
  
  /* 画面右端で停止 */
  if(x>=1.)
    glutIdleFunc( NULL );

  glutPostRedisplay();
}

int main(int argc, char** argv){
  /* init gult */
  glutInit( &argc, argv );
  glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB );
  glutInitWindowPosition( 0, 0 );
  glutInitWindowSize( width, height );
  glutCreateWindow( "FreeFall" );

  /* call-back */
  glutDisplayFunc( display );
  glutIdleFunc( idle );

  /* 2D-setup */
  glMatrixMode( GL_PROJECTION );
  glLoadIdentity();
  gluOrtho2D( -1., 1., -10000., 5000. );

  glutMainLoop();
  return 0;
}

Vine Linux 2.6とWindows XPの両方で,同じソースをそれぞれコンパイルし,実行してみました.

 fig1.png fig2.png

左がLinux上,右がWindows上の実行結果です. 見ての通り,同じ出力結果です.うれしいです.詳しいことはよくわかんないのですが,環境依存の激しいグラフィックという分野で同じソースが違うOS,違うコンパイラで使えるということに感動しました.このプログラムは,実際には時間発展とともにアニメーションします.アニメーションの速度はコンピュータの計算速度やグラフィックボードにかなり影響を受けます.

Valid XHTML 1.1! home > コンピュータ > グラフ・解析ツール >
リロード   新規 編集 凍結 差分 添付 複製 改名   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS
Modified by 物理のかぎプロジェクト PukiWiki 1.4.5_1 Copyright © 2001-2005 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-jiPowered by PHP 5.2.17HTML convert time to 0.065 sec.