OpenGLを使ってみよう のバックアップの現在との差分(No.1)


とりあえず使ってみようということで,つぎのプログラムを書いてみました.オイラー法で素朴に斜方投射をシミュレート,描画するプログラムです.
 
  #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の両方で,同じソースをそれぞれコンパイルし,実行してみました.
 
 #ref(fig1.png,nolink)
 #ref(fig1.png,nolink)
  &ref(fig1.png,nolink);
 &ref(fig2.png,nolink);
 
 水平投射のシミュレーション on Linux
 水平投射のシミュレーション on Windows
 左がLinux上,右がWindows上の実行結果です.
 見ての通り,同じ出力結果です.うれしいです.詳しいことはよくわかんないのですが,環境依存の激しいグラフィックという分野で同じソースが違うOS,違うコンパイラで使えるということに感動しました.このプログラムは,実際には時間発展とともにアニメーションします.アニメーションの速度はコンピュータの計算速度やグラフィックボードにかなり影響を受けます.
 
 見ての通り,同じ出力結果です.うれしいです.詳しいことはよくわかんないんですが,環境依存の激しいグラフィックという分野で同じソースが違うOS,違うコンパイラで使えるということに感動しました.このプログラムは,実際には時間発展とともにアニメーションします.アニメーションの速度はコンピュータの計算速度やグラフィックボードにかなり影響を受けます.
 <Prev]
 [Next>
 OpenGLのインストールとコンパイル
 GLUT関数覚え書き
 Valid XHTML 1.1! [home] [プログラミング] [OpenGL] [ページの先頭]
 初版:2003-01-04 / 最終更新:2004-11-11 00:23:47
 
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.3.29HTML convert time to 0.004 sec.