WIN10+VS2019+OpenGL实现北斗七星和小恐龙
北斗七星(The Big Dipper)
点图及结果
#include <GL/glut.h>
void myInit(void) {
glClearColor(0.0, 0.0, 0.0, 0.0);//红、绿、蓝和 alpha 值,指定值范围均为[ 0.0f,1.0f ],背景颜色为灰色
glColor3f(1.0, 1.0, 1.0);//点的颜色为白色
glPointSize(5.0);//点的大小
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, 640.0, 0.0, 480.0);//gluOrtho2D是指屏幕区域对应的模型坐标范围,横向范围是0到640,纵向是0到480
}
void mydisplay() {
GLint vertices[7][2] = { {20, 10}, {74, 74}, {129, 83}, {194, 101},
{239, 67}, {320, 128}, {289, 190} };
glClear(GL_COLOR_BUFFER_BIT);//指定当前被激活为写操作的颜色缓存
glBegin(GL_POINTS); //点图
glVertex2iv(vertices[0]);
glVertex2iv(vertices[1]);
glVertex2iv(vertices[2]);
glVertex2iv(vertices[3]);
glVertex2iv(vertices[4]);
glVertex2iv(vertices[5]);
glVertex2iv(vertices[6]);
glEnd();
glFlush();
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(640, 480);
glutCreateWindow("The Big Dipper");
glutDisplayFunc(mydisplay);
myInit();
glutMainLoop();
}
线图及结果
#include <GL/glut.h>
void myInit(void) {
glClearColor(0.0, 0.0, 0.0, 0.0);
glColor3f(1.0, 1.0, 1.0);
glPointSize(5.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, 640.0, 0.0, 480.0);
}
void mydisplay() {
GLint vertices[7][2] = { {20, 10}, {74, 74}, {129, 83}, {194, 101},
{239, 67}, {320, 128}, {289, 190} };
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_LINE_STRIP); //线图
glVertex2iv(vertices[0]);
glVertex2iv(vertices[1]);
glVertex2iv(vertices[2]);
glVertex2iv(vertices[3]);
glEnd();
glBegin(GL_LINE_LOOP);
glVertex2iv(vertices[3]);
glVertex2iv(vertices[4]);
glVertex2iv(vertices[5]);
glVertex2iv(vertices[6]);
glVertex2iv(vertices[3]);
glEnd();
glFlush();
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(640, 480);
glutCreateWindow("The Big Dipper");
glutDisplayFunc(mydisplay);
myInit();
glutMainLoop();
}
说明
1.gluOrtho2D(-5.0,5.0,-5.0,5.0); 参数分别代表(左下角x坐标,右上角x坐标,左下角y坐标,右上角y坐标)——坐标全相对于窗口左下角--原点),near和far默认为-1和1,此函数决定一个平行六面体,即View Volume!
2.投影也是使用矩阵来实现的。如果需要操作投影矩阵,需要以GL_PROJECTION为参数调用glMatrixMode函数。
glMatrixMode(GL_PROJECTION);
通常,我们需要在进行变换前把当前矩阵设置为单位矩阵。
glLoadIdentity();
3.对于线状图,需要分为两部分,首先将0,1,2,3连线,再将3,4,5,6,3重新连成环,否则无法出现正确的北斗七星结果
小恐龙
小恐龙原图代码及结果
#pragma warning(disable:4996)
#include <stdio.h>
#include <GL/glut.h>
void myInit(void) {
glClearColor(1.0, 1.0, 1.0, 0.0);
glColor3f(0.0, 0.0, 0.0);
glPointSize(3.0);
//glLineWidth(3.0);//attribute changing function 使线条变粗
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, 640.0, 0.0, 480.0);
}
void drawPolyLineFile(const char* filename) {
FILE* ifp;
int i, j;
GLint numpolys, numLines, x, y;
ifp = fopen(filename, "r");
if (ifp == NULL) {
printf("Error: can't open file for reading.\n");
return;
}
glClear(GL_COLOR_BUFFER_BIT);
fscanf_s(ifp, "%d", &numpolys);
for (j = 0; j < numpolys; j++) {
fscanf(ifp, "%d", &numLines);
glBegin(GL_LINE_STRIP);
for (i = 0; i < numLines; i++) {
fscanf(ifp, "%d %d", &x, &y);
//添加颜色要放到glVertex2i前面,否则primitive state无法加上颜色
//glColor3f(1.0, 0.0, 0.0); //全部设为红色
//glColor3f(GLfloat(rand() % 10) / 10, (rand() % 10) / 10, (rand() % 10) / 10); //随机颜色版恐龙
glVertex2i(x, y); //the only primitive generating function
}
glEnd();
}
glFlush();
fclose(ifp);
}
void mydisplay() {
drawPolyLineFile("dinosour.txt");
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(640, 480);
glutCreateWindow("Dino");
glutDisplayFunc(mydisplay);
myInit();
glutMainLoop();
}
结果
随机颜色版恐龙
线条变粗版小恐龙
dinosour.txt文件位置
和cpp文件放在同一文件夹下
dinosour.txt文件内容
21
29
32 435
10 439
4 438
2 433
4 428
6 425
10 420
15 416
21 413
30 408
42 406
47 403
56 398
63 391
71 383
79 369
84 356
87 337
89 316
88 302
86 294
83 278
79 256
78 235
79 220
85 204
94 190
98 183
98 182
9
116 189
105 184
98 172
98 156
93 141
93 132
99 122
104 115
104 114
38
153 116
152 112
153 107
154 93
154 81
152 67
146 56
140 47
136 39
133 30
130 17
128 7
127 3
93 2
93 10
96 16
96 20
97 21
101 24
104 27
105 31
107 36
108 40
109 47
111 51
114 58
118 66
120 71
118 79
117 88
116 97
112 105
107 113
107 118
108 126
112 138
116 146
118 148
7
153 95
158 99
159 103
161 108
161 115
160 121
160 122
7
156 80
167 79
182 76
203 73
220 78
235 79
239 80
43
262 154
259 141
259 123
257 110
255 93
259 86
272 74
287 46
290 41
299 30
305 21
307 15
307 12
300 11
299 9
301 2
303 1
313 5
320 7
307 1
312 0
321 0
325 0
331 0
336 2
336 8
334 18
335 24
331 29
327 39
323 45
317 54
312 63
308 70
301 79
297 86
296 97
300 109
303 120
304 126
307 138
306 148
305 152
5
298 86
304 92
310 104
314 114
314 119
7
255 98
251 100
246 105
242 112
236 122
231 131
233 126
7
271 73
264 74
257 76
244 76
236 80
231 84
230 86
24
242 77
242 70
245 61
246 49
248 39
249 30
248 19
245 12
242 9
241 6
243 1
256 3
259 2
266 3
271 4
274 9
277 16
277 24
277 31
277 41
277 48
278 57
278 62
278 66
24
190 73
191 64
193 51
194 39
191 25
189 17
185 7
184 5
177 4
169 4
166 4
159 5
159 6
162 19
163 25
165 32
165 39
165 47
165 57
162 65
161 70
159 75
158 78
157 80
15
96 157
93 163
88 176
82 184
78 193
75 201
72 212
72 224
72 238
73 254
75 267
78 277
82 286
89 298
89 300
9
33 428
33 428
33 427
35 426
36 425
30 427
27 428
27 428
28 428
16
2 435
5 434
10 432
13 431
16 429
19 427
21 426
22 425
24 424
26 423
27 423
30 422
33 422
34 421
36 420
36 419
77
32 436
55 423
67 415
75 409
86 401
92 395
98 389
105 378
107 372
111 362
112 355
116 345
119 338
121 328
124 317
125 312
125 304
126 294
125 288
124 280
125 277
125 258
124 255
125 241
128 235
135 225
141 218
147 211
155 208
166 205
178 203
194 202
209 203
219 204
232 205
249 206
259 207
284 205
300 198
317 189
333 182
345 170
362 153
392 135
430 118
450 104
477 91
509 75
539 65
567 61
599 60
625 59
635 58
632 54
616 51
602 46
593 46
580 45
565 41
546 38
526 36
502 42
487 48
468 53
452 57
434 63
414 71
397 77
378 82
366 86
352 90
338 92
328 91
319 88
307 86
306 85
301 85
14
318 106
333 107
346 109
359 111
369 104
391 100
411 95
431 87
445 81
458 71
473 63
491 59
497 57
499 56
7
244 109
235 104
221 100
208 96
199 97
190 98
190 98
8
160 116
165 119
171 122
172 127
170 135
168 144
170 149
174 149
4
169 118
174 120
179 124
178 126
8
293 132
294 125
297 115
291 94
287 90
290 84
297 79
297 79
6
144 97
143 83
144 72
141 58
136 52
134 49
问题说明
在直接执行小恐龙代码的时候,会出现C4996错误,具体在使用fopen和fscanf的时候。
解决方案:
1.在文件顶部加一行代码
#pragma warning(disable:4996)
2.在文件顶部加一行代码
#define _CRT_SECURE_NO_WARNINGS
二者任选其一即可