[[ノート>ノート/ノート]]~
訪問数 &counter();   最終更新 &lastmod();

>> [[MPS粒子法プログラム2>ノート/MPS粒子法プログラム2]]

**粒子法プログラム 〜 塚越先生の本を出発点にして [#k2f5d260]

出力ファイルmps.profをopenGLで表示したい。

[[ノート/raytracing]]~
和歌山大版OpenGLの使い方 [[GLUTによる「手抜き」OpenGL入門:http://www.wakayama-u.ac.jp/~tokoi/opengl/libglut.html#2.3]]

mps.profの形式:
 0.000000    時刻
 1122      粒子総数
 0 0.004000 0.004000 0.000000 0.000000 0.000000 6.539697
 0 0.012000 0.004000 0.000000 0.000000 0.000000 6.539697
 0 0.020000 0.004000 0.000000 0.000000 0.000000 6.539697
 種類番号 x座標 y座標 x速度 y速度 圧力 粒子密度

***OpenGLプログラミング [#a78401e4]
0)Cygwinでのインストール~
http://pepper.is.sci.toho-u.ac.jp/index.php?%A5%CE%A1%BC%A5%C8%2Fraytracing~
http://www.wakayama-u.ac.jp/~tokoi/opengl/libglut.html#2

1)外枠~
http://www.wakayama-u.ac.jp/~tokoi/opengl/libglut.html#3~
http://www.ics.kagoshima-u.ac.jp/edu/expIV3/basic-of-opengl.html

2)丸を描く~
openGLには円を書く関数が無い。~
方法1: pointを使い、pointの大きさを大きく(glPointSize(5); )する。~
この時、glEnalbe(GL_POINT_SMOOTH)をしないと、形が丸くならない。~
http://www.talisman.org/opengl-1.1/Reference/glPointSize.html~
http://www.ics.kagoshima-u.ac.jp/edu/expIV3/basic-of-opengl.html

3)色を付ける~
ウィンドウの色設定~
void glClearColor(r,g,b,a);             // 消去色を指定~
void glClear(GL_COLOR_BUFFER_BIT);      // 消去を実行~
http://www.ics.kagoshima-u.ac.jp/edu/expIV3/basic-of-opengl.html

描画対象の色設定~
void glColor3f(r,g,b);         // R,G,B成分を[0,1]の範囲で指定する~
void glColor3f(r,g,b,a);       // R,G,B,Alpha成分を[0,1]の範囲で指定する~
あと、オブジェクトの色という話もあるが、省略~
http://www.ics.kagoshima-u.ac.jp/edu/expIV3/basic-of-opengl.html

4)アニメーション~
http://wisdom.sakura.ne.jp/system/opengl/gl10.html~

 #include <GL/glut.h>
 GLfloat top = -0.9;
 
 void display(void)
 {
   glClear(GL_COLOR_BUFFER_BIT);
   glPointSize(5.0);
   glColor3f(0,0,0);
   glBegin(GL_POINTS);
 
   glVertex2d(top, top);
   glEnd();
   glFlush();
 }
 void init(void)
 {
   glEnable(GL_POINT_SMOOTH);
   glClearColor(1.0, 1.0, 1.0, 1.0);
 }
 void timer(int value) {
   static GLboolean isUp = GL_TRUE;
   if (top > 0.9) isUp = GL_FALSE;
   else if (top <= -0.9) isUp = GL_TRUE;
   top += (isUp == GL_TRUE ? 0.01 : -0.01);
 
   glutPostRedisplay();
   glutTimerFunc(5, timer,0);
 }
 int main(int argc, char *argv[])
 {
   glutInit(&argc, argv);
   glutInitDisplayMode(GLUT_RGBA);
   glutCreateWindow(argv[0]);
   glutDisplayFunc(display);
   init();
   glutTimerFunc(100, timer, 0);
 
   glutMainLoop();
   return 0;
 }

最後に、生成した画像を「取り出す」方法。取り出してファイル化するなどが必要なため。

基本は、glReadBuffer()関数を使う。~
http://opengl.jp/oglfaq/miscellaneous.htm~
http://sky.geocities.jp/freakish_osprey/opengl/opengl_capture.htm

>取り出した結果を所定のファイル形式に変換するためのライブラリがたくさんある。~
http://opengl.jp/oglfaq/miscellaneous.htm~
が、今欲しい形(MJPEGのyuv4mpegpipe方式)にはならないだろう。自分でプログラムを書くしかなさそうだ。

***VNCで遠隔端末表示 ⇒ [[ノート/oreganoにフロントエンド2]] [#f92bfb7e]

***2009/06/09 結果ファイルを読んでOpenGLで表示をするプログラム(MPSの本についているMPSViewの代わり) [#j3212795]

たとえば、こんなプログラム &ref(MPSView.c); を書いてみた。~
ダブルバッファにしないと絵がちらつく。ダブルバッファ導入。~
図の大きさは適当。(きちんとスケーリングを計算していない。そのままx,yを与えた。~
操作のボタン等は作っていない。いずれやればいいだろう。

***2009/06/09 いよいよ本格的に、「計算しながら表示」に挑戦。 [#v0877c50]
こんなプログラム &ref(yylab/MPS粒子法プログラム/mps.c); &ref(GLmps.c); になった。これでoregano上で動く。~
念のため、使ったMakefileは &ref(Makefile);~
元のプログラムを読みながら、全体の構造を入換えた。

***2009/06/27 スーパー手抜きの「計算しながら表示」の方法 [#xdb17c6e]
こんな方法も可能なことを思い出した。まずmpsプログラムでは元のままで、ただし出力をファイルに書くのではなく、UNIXのPIPE (FIFO) に書き出すことにする。
>UNIXの(名前つき)PIPEは、コマンドmkfifoで作ることが出来る。たとえば[[このページ:http://www.linux.or.jp/JM/html/GNU_fileutils/man1/mkfifo.1.html]]を参照。要するにコマンドプロンプトから、mkfifo mps.prof としてやると、名前mps.profのパイプが作られる。~

パイプは、プログラムからはストリームに対する入出力でアクセスできるから、mpsプログラムの出力ファイルとしてのmps.profの代わりに、名前つきパイプmps.profに出力するようになる。Cのソース上は何も変更は要らない。

表示側のプログラムMPSViewは、ファイルmps.profを読む代わりに、名前つきパイプmps.profを読ませる。これもCのソース上は何も変更は要らない。

それで、一方のコマンド入力画面からMPSViewを起動し、もう1つ別のコマンド入力画面からmpsを起動すると、表示ウィンドウが開き、実行が始まる。

名前つきパイプではなくて、シェル上の「|」縦棒を使っても同じことになる。但し、プログラムを、mps側はstdoutに書き出し、MPSView側はstdinから読み込むように書き直す必要がある。
名前つきパイプではなくて、シェル上の「|」縦棒を使っても同じことになる。但し、プログラムを、mps側はstdoutに書き出し、MPSView側はstdinから読み込むように書き直す必要がある。その上で、コマンド入力画面から、mps | MPSView とすればよいだろう。

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS