アニメ「衛宮さんちの今日のごはん」PV 15秒ver
アニメ『衛宮さんちの今日のごはん』(2017-2019)
どこかで見たキャラクタが。プリズマイリヤのイリヤがいます。というか、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:~$
実行結果は前回と同じなので省略します。



コメント