SHOW:
|
|
- or go back to the newest paste.
1 | #include <math.h> | |
2 | #include <stdlib.h> | |
3 | - | |
3 | + | |
4 | #if defined(__APPLE__) | |
5 | #include <OpenGL/gl.h> | |
6 | #include <OpenGL/glu.h> | |
7 | #include <GLUT/glut.h> | |
8 | #else | |
9 | #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) | |
10 | #include <windows.h> | |
11 | #endif | |
12 | #include <GL/gl.h> | |
13 | #include <GL/glu.h> | |
14 | #include <GL/glut.h> | |
15 | #endif | |
16 | - | |
16 | + | |
17 | struct Vector { | |
18 | float x, y, z; | |
19 | - | |
19 | + | |
20 | Vector(float v = 0) : x(v), y(v), z(v) { } | |
21 | Vector(float x, float y, float z) : x(x), y(y), z(z) { } | |
22 | Vector operator+(const Vector& v) const { return Vector(x + v.x, y + v.y, z + v.z); } | |
23 | Vector operator-(const Vector& v) const { return Vector(x - v.x, y - v.y, z - v.z); } | |
24 | Vector operator*(const Vector& v) const { return Vector(x * v.x, y * v.y, z * v.z); } | |
25 | Vector operator/(const Vector& v) const { return Vector(x / v.x, y / v.y, z / v.z); } | |
26 | float length() const { return sqrt(x*x + y*y + z*z); } | |
27 | - | void glTranslatef() { ::glTranslatef(x, y, z); } |
27 | + | void translate() { glTranslatef(x, y, z); } |
28 | - | void glRotatef(float angle) { ::glRotatef(angle, x, y, z); } |
28 | + | void rotate(float angle) { glRotatef(angle, x, y, z); } |
29 | - | void glScalef() { ::glScalef(x, y, z); } |
29 | + | void scale() { glScalef(x, y, z); } |
30 | }; | |
31 | - | |
31 | + | |
32 | Vector x_axis(1, 0, 0), y_axis(0, 1, 0), z_axis(0, 0, 1); | |
33 | - | Vector pos_crate(0, 0, -5), pos_left_base(1, 0, 0), pos_right_base(-1, 0, 0), scale_base(1, 1, 3), pos_main_arm(0, 0, -2), |
33 | + | Vector pos_crate(0, 0, -5), pos_left_base(1, 0, 0), pos_right_base(-1, 0, 0), scale_base(1, 1, 3), pos_main_arm(0, 0, -2), |
34 | - | scale_main_arm(1, 1, 4), pos_lower_arm(0, 0, -1.5f), scale_lower_arm(0.7f, 0.7f, 3.0f), scale_wrist(1, 1, 1), |
34 | + | scale_main_arm(1, 1, 4), pos_lower_arm(0, 0, -1.5f), scale_lower_arm(0.7f, 0.7f, 3.0f), scale_wrist(1, 1, 1), |
35 | pos_left_finger(0.5f, -1.0f, 0.0f), pos_right_finger(-0.5f, -1.0f, 0.0f), scale_finger(0.2f, 1.0f, 0.2f); | |
36 | - | |
36 | + | |
37 | float rot_base = 0, rot_main_arm = 70, rot_lower_arm = -60, rot_finger = 20, rot_finger_relative = 20; | |
38 | - | |
38 | + | |
39 | void onDisplay() { | |
40 | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | |
41 | - | |
41 | + | |
42 | glPushMatrix(); { | |
43 | - | y_axis.glRotatef(rot_base); |
43 | + | y_axis.rotate(rot_base); |
44 | - | |
44 | + | |
45 | // Jobb oldali alap | |
46 | glPushMatrix(); { | |
47 | - | pos_right_base.glTranslatef(); |
47 | + | pos_right_base.translate(); |
48 | - | scale_base.glScalef(); |
48 | + | scale_base.scale(); |
49 | glutSolidCube(1.0f); | |
50 | } glPopMatrix(); | |
51 | - | |
51 | + | |
52 | // Bal oldali alap | |
53 | glPushMatrix(); { | |
54 | - | pos_left_base.glTranslatef(); |
54 | + | pos_left_base.translate(); |
55 | - | scale_base.glScalef(); |
55 | + | scale_base.scale(); |
56 | glutSolidCube(1.0f); | |
57 | } glPopMatrix(); | |
58 | - | |
58 | + | |
59 | - | x_axis.glRotatef(rot_main_arm); |
59 | + | x_axis.rotate(rot_main_arm); |
60 | - | pos_main_arm.glTranslatef(); |
60 | + | pos_main_arm.translate(); |
61 | - | |
61 | + | |
62 | // Felkar | |
63 | glPushMatrix(); { | |
64 | - | scale_main_arm.glScalef(); |
64 | + | scale_main_arm.scale(); |
65 | glutSolidCube(1.0f); | |
66 | } glPopMatrix(); | |
67 | - | |
67 | + | |
68 | - | pos_main_arm.glTranslatef(); |
68 | + | pos_main_arm.translate(); |
69 | - | |
69 | + | |
70 | - | x_axis.glRotatef(rot_lower_arm); |
70 | + | x_axis.rotate(rot_lower_arm); |
71 | - | pos_lower_arm.glTranslatef(); |
71 | + | pos_lower_arm.translate(); |
72 | - | |
72 | + | |
73 | // Alkar | |
74 | glPushMatrix(); { | |
75 | - | scale_lower_arm.glScalef(); |
75 | + | scale_lower_arm.scale(); |
76 | glutSolidCube(1.0f); | |
77 | } glPopMatrix(); | |
78 | - | |
78 | + | |
79 | - | pos_lower_arm.glTranslatef(); |
79 | + | pos_lower_arm.translate(); |
80 | - | |
80 | + | |
81 | // Csukló | |
82 | glPushMatrix(); { | |
83 | - | scale_wrist.glScalef(); |
83 | + | scale_wrist.scale(); |
84 | glutSolidCube(1.0f); | |
85 | } glPopMatrix(); | |
86 | - | |
86 | + | |
87 | // Jobb 'ujj' | |
88 | glPushMatrix(); { | |
89 | - | z_axis.glRotatef(-rot_finger); |
89 | + | z_axis.rotate(-rot_finger); |
90 | - | |
90 | + | |
91 | glTranslatef(0, pos_right_finger.y, 0); | |
92 | - | |
92 | + | |
93 | glPushMatrix(); { | |
94 | glTranslatef(pos_right_finger.x, 0, 0); | |
95 | - | z_axis.glRotatef(-rot_finger_relative); |
95 | + | z_axis.rotate(-rot_finger_relative); |
96 | - | scale_finger.glScalef(); |
96 | + | scale_finger.scale(); |
97 | glutSolidCube(1.0f); | |
98 | } glPopMatrix(); | |
99 | - | |
99 | + | |
100 | - | pos_right_finger.glTranslatef(); |
100 | + | pos_right_finger.translate(); |
101 | - | z_axis.glRotatef(rot_finger_relative); |
101 | + | z_axis.rotate(rot_finger_relative); |
102 | - | scale_finger.glScalef(); |
102 | + | scale_finger.scale(); |
103 | glutSolidCube(1.0f); | |
104 | } glPopMatrix(); | |
105 | - | |
105 | + | |
106 | // Bal 'ujj' | |
107 | glPushMatrix(); { | |
108 | - | z_axis.glRotatef(rot_finger); |
108 | + | z_axis.rotate(rot_finger); |
109 | - | |
109 | + | |
110 | glTranslatef(0, pos_left_finger.y, 0); | |
111 | - | |
111 | + | |
112 | glPushMatrix(); { | |
113 | glTranslatef(pos_left_finger.x, 0, 0); | |
114 | - | z_axis.glRotatef(rot_finger_relative); |
114 | + | z_axis.rotate(rot_finger_relative); |
115 | - | scale_finger.glScalef(); |
115 | + | scale_finger.scale(); |
116 | glutSolidCube(1.0f); | |
117 | } glPopMatrix(); | |
118 | - | |
118 | + | |
119 | - | pos_left_finger.glTranslatef(); |
119 | + | pos_left_finger.translate(); |
120 | - | z_axis.glRotatef(-rot_finger_relative); |
120 | + | z_axis.rotate(-rot_finger_relative); |
121 | - | scale_finger.glScalef(); |
121 | + | scale_finger.scale(); |
122 | glutSolidCube(1.0f); | |
123 | } glPopMatrix(); | |
124 | - | |
124 | + | |
125 | } glPopMatrix(); | |
126 | - | |
126 | + | |
127 | // Láda | |
128 | glPushMatrix(); { | |
129 | - | pos_crate.glTranslatef(); |
129 | + | pos_crate.translate(); |
130 | glutSolidCube(1.0f); | |
131 | } glPopMatrix(); | |
132 | - | |
132 | + | |
133 | glutSwapBuffers(); | |
134 | } | |
135 | - | |
135 | + | |
136 | enum keys_enum {q, a, w, s, e, d, r, f, num_keys}; | |
137 | bool is_pressed[num_keys]; | |
138 | void updateCratePos(float dt); | |
139 | - | |
139 | + | |
140 | void onIdle() { | |
141 | // Itt nem szükséges a pontos diszkrét idő szimuláció | |
142 | static int last_time = glutGet(GLUT_ELAPSED_TIME); | |
143 | int curr_time = glutGet(GLUT_ELAPSED_TIME); | |
144 | - | float dt = (curr_time - last_time) / 1000.0f; |
144 | + | float dt = (curr_time - last_time) / 1000.0f; |
145 | last_time = curr_time; | |
146 | - | |
146 | + | |
147 | if(is_pressed[q] && !is_pressed[a]) | |
148 | rot_finger += 32 * dt; | |
149 | else if(!is_pressed[q] && is_pressed[a]) | |
150 | rot_finger -= 32 * dt; | |
151 | - | |
151 | + | |
152 | if(is_pressed[w] && !is_pressed[s]) | |
153 | rot_lower_arm += 32 * dt; | |
154 | else if(!is_pressed[w] && is_pressed[s]) | |
155 | rot_lower_arm -= 32 * dt; | |
156 | - | |
156 | + | |
157 | if(is_pressed[e] && !is_pressed[d]) | |
158 | rot_main_arm += 32 * dt; | |
159 | else if(!is_pressed[e] && is_pressed[d]) | |
160 | rot_main_arm -= 32 * dt; | |
161 | - | |
161 | + | |
162 | if(is_pressed[f] && !is_pressed[r]) | |
163 | rot_base += 32 * dt; | |
164 | else if(!is_pressed[f] && is_pressed[r]) | |
165 | rot_base -= 32 * dt; | |
166 | - | |
166 | + | |
167 | updateCratePos(dt); | |
168 | glutPostRedisplay(); | |
169 | } | |
170 | - | |
170 | + | |
171 | void onKeyboard(unsigned char key, int, int) { | |
172 | switch (key) { | |
173 | case 'q': case 'Q': | |
174 | is_pressed[q] = true; | |
175 | break; | |
176 | case 'a': case 'A': | |
177 | is_pressed[a] = true; | |
178 | break; | |
179 | case 'w': case 'W': | |
180 | is_pressed[w] = true; | |
181 | break; | |
182 | case 's': case 'S': | |
183 | is_pressed[s] = true; | |
184 | break; | |
185 | case 'e': case 'E': | |
186 | is_pressed[e] = true; | |
187 | break; | |
188 | case 'd': case 'D': | |
189 | is_pressed[d] = true; | |
190 | break; | |
191 | case 'r': case 'R': | |
192 | is_pressed[r] = true; | |
193 | break; | |
194 | case 'f': case 'F': | |
195 | is_pressed[f] = true; | |
196 | - | break; |
196 | + | break; |
197 | } | |
198 | } | |
199 | - | |
199 | + | |
200 | void onKeyboardUp(unsigned char key, int, int) { | |
201 | switch (key) { | |
202 | case 'q': case 'Q': | |
203 | is_pressed[q] = false; | |
204 | break; | |
205 | case 'a': case 'A': | |
206 | is_pressed[a] = false; | |
207 | break; | |
208 | case 'w': case 'W': | |
209 | is_pressed[w] = false; | |
210 | break; | |
211 | case 's': case 'S': | |
212 | is_pressed[s] = false; | |
213 | break; | |
214 | case 'e': case 'E': | |
215 | is_pressed[e] = false; | |
216 | break; | |
217 | case 'd': case 'D': | |
218 | is_pressed[d] = false; | |
219 | break; | |
220 | case 'r': case 'R': | |
221 | is_pressed[r] = false; | |
222 | break; | |
223 | case 'f': case 'F': | |
224 | is_pressed[f] = false; | |
225 | - | break; |
225 | + | break; |
226 | } | |
227 | } | |
228 | - | |
228 | + | |
229 | void onInitialization(); | |
230 | - | |
230 | + | |
231 | void onMouse(int, int, int, int) {} | |
232 | - | |
232 | + | |
233 | void onMouseMotion(int, int) {} | |
234 | - | |
234 | + | |
235 | int main(int argc, char **argv) { | |
236 | glutInit(&argc, argv); | |
237 | glutInitWindowSize(600, 600); | |
238 | glutInitWindowPosition(100, 100); | |
239 | glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); | |
240 | - | |
240 | + | |
241 | glutCreateWindow("Grafika pelda program"); | |
242 | - | |
242 | + | |
243 | glMatrixMode(GL_MODELVIEW); | |
244 | glLoadIdentity(); | |
245 | glMatrixMode(GL_PROJECTION); | |
246 | glLoadIdentity(); | |
247 | - | |
247 | + | |
248 | onInitialization(); | |
249 | - | |
249 | + | |
250 | glutDisplayFunc(onDisplay); | |
251 | glutMouseFunc(onMouse); | |
252 | glutIdleFunc(onIdle); | |
253 | glutKeyboardFunc(onKeyboard); | |
254 | glutKeyboardUpFunc(onKeyboardUp); | |
255 | glutMotionFunc(onMouseMotion); | |
256 | - | |
256 | + | |
257 | glutMainLoop(); | |
258 | - | |
258 | + | |
259 | return 0; | |
260 | } | |
261 | - | |
261 | + | |
262 | - | // Ez a rész szükséges ahhoz, hogy a kockát 3d-ben lásd, |
262 | + | // Ez a rész szükséges ahhoz, hogy a kockát 3d-ben lásd, |
263 | - | // de a példa szempontjából most lényegtelen, hogy |
263 | + | // de a példa szempontjából most lényegtelen, hogy |
264 | // ténylegesen mit csinál. | |
265 | void onInitialization() { | |
266 | glEnable(GL_DEPTH_TEST); | |
267 | glMatrixMode(GL_PROJECTION); | |
268 | gluPerspective(60, 1, 0.1, 20); | |
269 | glMatrixMode(GL_MODELVIEW); | |
270 | gluLookAt(-9, 6, -6, 9, 0, 0, 0, 1, 0); | |
271 | glEnable(GL_LIGHTING); | |
272 | glEnable(GL_LIGHT0); | |
273 | float p[4] = {-2, 4, -1, 0}; | |
274 | glLightfv(GL_LIGHT0, GL_POSITION, p); | |
275 | // float c[4] = {0.0f, 0.4f, 1.0f, 1.0f}; | |
276 | // glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c); | |
277 | } | |
278 | - | |
278 | + | |
279 | Vector pos_left_finger_tip, pos_right_finger_tip, pos_grab; | |
280 | - | |
280 | + | |
281 | float crate_speed = 0.0f; | |
282 | - | |
282 | + | |
283 | - | // A példa program egy másik szépséghibája, |
283 | + | // A példa program egy másik szépséghibája, |
284 | // hogy a láda mefogásához hackelni kell egy kicsit. | |
285 | void updateCratePos(float dt) { | |
286 | glPushMatrix(); { | |
287 | glLoadIdentity(); | |
288 | - | y_axis.glRotatef(rot_base); |
288 | + | y_axis.rotate(rot_base); |
289 | - | x_axis.glRotatef(rot_main_arm); |
289 | + | x_axis.rotate(rot_main_arm); |
290 | - | pos_main_arm.glTranslatef(); |
290 | + | pos_main_arm.translate(); |
291 | - | pos_main_arm.glTranslatef(); |
291 | + | pos_main_arm.translate(); |
292 | - | x_axis.glRotatef(rot_lower_arm); |
292 | + | x_axis.rotate(rot_lower_arm); |
293 | - | pos_lower_arm.glTranslatef(); |
293 | + | pos_lower_arm.translate(); |
294 | - | pos_lower_arm.glTranslatef(); |
294 | + | pos_lower_arm.translate(); |
295 | - | |
295 | + | |
296 | glPushMatrix(); { | |
297 | - | z_axis.glRotatef(-rot_finger); |
297 | + | z_axis.rotate(-rot_finger); |
298 | glTranslatef(0, pos_right_finger.y, 0); | |
299 | - | pos_right_finger.glTranslatef(); |
299 | + | pos_right_finger.translate(); |
300 | - | z_axis.glRotatef(rot_finger_relative); |
300 | + | z_axis.rotate(rot_finger_relative); |
301 | - | scale_finger.glScalef(); |
301 | + | scale_finger.scale(); |
302 | glTranslatef(0, -0.5f, 0); | |
303 | - | |
303 | + | |
304 | float mx[16]; | |
305 | glGetFloatv(GL_MODELVIEW_MATRIX, mx); | |
306 | pos_right_finger_tip.x = mx[12]; | |
307 | pos_right_finger_tip.y = mx[13]; | |
308 | pos_right_finger_tip.z = mx[14]; | |
309 | - | |
309 | + | |
310 | } glPopMatrix(); | |
311 | - | |
311 | + | |
312 | glPushMatrix(); { | |
313 | - | z_axis.glRotatef(rot_finger); |
313 | + | z_axis.rotate(rot_finger); |
314 | glTranslatef(0, pos_left_finger.y, 0); | |
315 | - | pos_left_finger.glTranslatef(); |
315 | + | pos_left_finger.translate(); |
316 | - | z_axis.glRotatef(-rot_finger_relative); |
316 | + | z_axis.rotate(-rot_finger_relative); |
317 | - | scale_finger.glScalef(); |
317 | + | scale_finger.scale(); |
318 | glTranslatef(0, -0.5f, 0); | |
319 | - | |
319 | + | |
320 | float mx[16]; | |
321 | glGetFloatv(GL_MODELVIEW_MATRIX, mx); | |
322 | pos_left_finger_tip.x = mx[12]; | |
323 | pos_left_finger_tip.y = mx[13]; | |
324 | pos_left_finger_tip.z = mx[14]; | |
325 | } glPopMatrix(); | |
326 | - | |
326 | + | |
327 | } glPopMatrix(); | |
328 | - | |
328 | + | |
329 | pos_grab = (pos_right_finger_tip + pos_left_finger_tip) / 2; | |
330 | - | |
330 | + | |
331 | - | if((pos_right_finger_tip - pos_left_finger_tip).length() < 1.2f |
331 | + | if((pos_right_finger_tip - pos_left_finger_tip).length() < 1.2f |
332 | && (pos_grab - pos_crate).length() < 0.6f) { | |
333 | pos_crate = pos_grab; | |
334 | } else { | |
335 | if(pos_crate.y > 0) { | |
336 | crate_speed -= 0.1 * dt; | |
337 | pos_crate.y += crate_speed; | |
338 | } else { | |
339 | crate_speed = 0; | |
340 | } | |
341 | } | |
342 | } |