(GLUT/C++)円の衝突


アニメ『衛宮さんちの今日のごはん』
どこかで見たキャラクタが。プリズマイリヤのイリヤがいます。というか、Fateシリーズたくさんあるんですね。で、これは料理アニメ。料理の絵がどれもすごく美味しそうです。大判焼きもこんなに美味しそうにアニメにできるんですね。

ということで大判焼きの絵を3Dで美味しそうに描いてみようとしましたが、ただの円柱になり美味しそうになりませんでしたので断念。アニメからの思いつきで、やることを決めていると、思い通りにいかず何もできないことがよくあります。でも苦手なものを見つけることができているので失敗でも成功です。バカボンのパパみたいですが。

今回は大判焼きの代わりに、 「(GLUT)円の衝突」の改良版。変更しすぎると差分が分からなくなるので、少しだけ改良してC++版にしました。

食べられない大判焼きの大量生産で時間を使ってしまったため、改良したソースだけです。そのうち説明を追加するかもしれません。

takk@deb9:~$ cat -n collision3.cpp
     1  #include <GL/glut.h>
     2  #include <math.h>
     3
     4  #define DEG2RAD(deg) deg * 2.0 * M_PI / 360.0
     5
     6  GLdouble colors[][4]={
     7  {0.0, 0.0, 0.0, 0.0},   //0 BLACK
     8  {1.0, 1.0, 1.0, 0.0},   //1 WHITE
     9  };
    10
    11  #define BLACK 0
    12  #define WHITE 1
    13
    14  #define MARU_NUM 2
    15  #define STOP 0
    16  #define RUN 1
    17
    18  #define COLOR(n) colors[n][0],colors[n][1],colors[n][2],colors[n][3]
    19
    20  class Maru
    21  {
    22  public:
    23      GLdouble rx;
    24      GLdouble ry;
    25      GLdouble rsize;
    26      int color;
    27      double dir;
    28      int status;
    29      Maru(GLdouble rx, GLdouble ry, GLdouble rsize, int color)
    30      {
    31          this->rx = rx;
    32          this->ry = ry;
    33          this->rsize = rsize;
    34          this->color = color;
    35          this->status = STOP;
    36      }
    37      void Run(double dir)
    38      {
    39          this->dir = dir;
    40          this->status = RUN;
    41      }
    42  };
    43
    44  Maru* maru[MARU_NUM];
    45
    46  void maru_disp(GLdouble x, GLdouble y, GLdouble r, int color)
    47  {
    48      GLdouble xx, yy;
    49      int i,n=20;
    50      double deg,offs = 90.0;
    51
    52      glBegin(GL_LINE_LOOP);
    53      glColor4f(COLOR(color));
    54
    55      for(i=0; i<n; i++){
    56          deg = (360.0/n) * i + offs;
    57          xx = x + r * cos(DEG2RAD(deg));
    58          yy = y + r * sin(DEG2RAD(deg));
    59          glVertex2d(xx, yy);
    60      }
    61
    62      glEnd();
    63  }
    64
    65  void callback_timer(int value)
    66  {
    67      glutPostRedisplay();
    68      glutTimerFunc(10,callback_timer,0);
    69  }
    70
    71  void maru_collision_check(int my_index)
    72  {
    73      Maru *my;
    74      Maru *p;
    75      int i;
    76      my = maru[my_index];
    77      for(i=0;i<MARU_NUM;i++){
    78          if(i!=my_index){
    79              p = maru[i];
    80              if((my->rsize + p->rsize) >=
    81                  sqrt(pow(my->rx - p->rx,2)+pow(my->ry - p->ry,2))){
    82                  my->status = STOP;
    83              }
    84          }
    85      }
    86  }
    87
    88  void maru_move()
    89  {
    90      Maru* p;
    91      int i;
    92
    93      for(i=0;i<MARU_NUM;i++){
    94          p = maru[i];
    95          if(p->status == RUN){
    96              p->rx += 0.01 * cos(p->dir*M_PI/180.0);
    97              p->ry += 0.01 * sin(p->dir*M_PI/180.0);
    98          }
    99      }
   100  }
   101
   102  void callback_display()
   103  {
   104      Maru* p;
   105      int i;
   106      glClearColor(COLOR(WHITE));
   107      glClear(GL_COLOR_BUFFER_BIT);
   108
   109      maru_move();
   110      for(i=0;i<MARU_NUM;i++){
   111          p = maru[i];
   112          maru_disp(p->rx, p->ry, p->rsize,p->color);
   113          if(p->status == RUN){
   114              maru_collision_check(i);
   115          }
   116      }
   117
   118      glFlush();
   119  }
   120
   121  void maru_init()
   122  {
   123      maru[0] = new Maru(0.0, 0.4, 0.1, BLACK);
   124      maru[1] = new Maru(0.1,-0.8, 0.1, BLACK);
   125      maru[1]->Run(90.0);
   126  }
   127
   128  int main(int argc, char *argv[])
   129  {
   130      maru_init();
   131
   132      glutInit(&argc, argv);
   133      glutInitDisplayMode(GLUT_RGBA);
   134      glutCreateWindow("collision2");
   135
   136      glutTimerFunc(5000,callback_timer,0);
   137      glutDisplayFunc(callback_display);
   138
   139      glutMainLoop();
   140
   141      return 0;
   142  }
   143
takk@deb9:~$

batファイルのようで意味ないですがmakefileも用意しておきます。

takk@deb9:~$ cat -n makefile
     1  all:
     2          g++ -lglut -lGLU -lGL -lm collision3.cpp
takk@deb9:~$

実行結果は前回と同じなので省略します。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA