总体思路:
第一步,使用viewpoint函数来建立两个分割的窗口
第二步,在两个视口分别绘制带光照效果的立体图形
第三步,使用进栈出栈函数和Rotatef函数实现两图像各自的旋转
关于glPushMatrix();和glPopMatrix();
OpenGL中图形变换实现的原理是通过矩阵进行操作的。在每次变换后,opengl都将会呈现一种新的状态。如果在经过一些变换后我们想回到原来的状态,opengl就帮我们提供了两个函数:glPushMatrix()和glPopMatrix();
具体代码如下:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79#include "stdafx.h" #include <GL/glut.h> GLint b; void display(void) { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glViewport(0, 0, 400, 400); glBegin(GL_LINES); glVertex2f(0.0, -1.0); glVertex2f(0.0, 1.0); glEnd(); //左侧 glPushMatrix();//进栈 glViewport(0, 0, 200, 400); glColor3f(1.0,0.0,0.0); glRotatef(b,1,0,0); glutSolidTeapot(0.5); glPopMatrix();//出栈 //右侧 glViewport(200, 0, 200, 400); glColor3f(0.0,0.0,1.0); glRotatef(b,0,1,0); glutSolidTeapot(0.5); glFlush(); } void time(int value) { b+=2; //为防止b的数据溢出 对b进行一个判断 if(b>=360) b=b-360; glutPostRedisplay(); glutTimerFunc(30,time,1); } void reshape(int w,int h) { glViewport(0,0,(GLsizei)w,(GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if(w<h) glOrtho(-1.5,1.5, -1.5,1.5 * (GLfloat)h / (GLfloat)w, -10, 10 ); else glOrtho(-1.5 * (GLfloat)w / (GLfloat)h, 1.5, -1.5 ,1.5, -10,10 ); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void init () { glClearColor(1.0,1.0,1.0,0.0); //glColor3f(1.0,0.0,0.0); GLfloat light0_diffuse[]= { 1.0, 1.0, 1, 1.0}; GLfloat light0_position[] = { 1.0, 1.0, 1.0, 0.0 }; glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse); glLightfv(GL_LIGHT0, GL_POSITION,light0_position); glShadeModel(GL_SMOOTH);//光滑着色,过渡色效果 glEnable(GL_LIGHTING);//启动光照,总开关 glEnable(GL_LIGHT0);//打开0号光源 glEnable(GL_DEPTH_TEST);//打开深度缓冲区,3D时候用 glEnable(GL_COLOR_MATERIAL); } int main(int argc, char* argv[]) { glutInit(&argc,argv); glutInitWindowPosition(200,200); glutInitWindowSize(500,500); glutCreateWindow("1"); init(); glutTimerFunc(30,time,1); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoop(); return 0; }
结果如下:
(动态的结果,我只截取里其中的一个状态)
最后
以上就是幽默朋友最近收集整理的关于使用OpenGL,在窗口中绘制两个立体图形,位置分别为窗口的左侧和右侧,添加光照,两个图形分别绕x轴和y轴旋转。的全部内容,更多相关使用OpenGL,在窗口中绘制两个立体图形,位置分别为窗口内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复