颜色切换
目的:实现按c使颜色在红、绿、蓝三种颜色切换
要实现这个效果,首先得搞懂在哪个地方修改颜色。
查看代码,发现给出了一行注释
void display(void)
{
GLfloat mat[4];
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(8, 8, 0.0);
//teapot的颜色
mat[0] = 0.2,mat[1] = 0.2, mat[2] = 0.9;
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat);
glutSolidTeapot(3.0);
glPopMatrix();
glFlush();
}
mat就是一个float类型的数组,分布对应R\G\B\透明度
我们可以通过每次按下c键之后,修改这一个数组,然后重绘达到修改颜色的目的
声明两个全局变量用于控制和保存当前颜色
static int keyNum = 3;
static GLfloat color[4] = { 0.2,0.2,0.9,1.0 };
查看键盘输入函数
void keyboard(unsigned char key, int x, int y)
{
switch (key) {
case 27:
exit(0);
break;
case 'c':
reDraw();
break;
default:
cout<<key;
break;
}
}
自定义绘制函数为reDraw(),在函数点击c时调用。
void reDraw() {
GLfloat mat[4];
#清理屏幕
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
#设定当前茶壶的位置
glTranslatef(8, 8, 0.0);
//teapot的颜色
switch (keyNum++ % 3)
{
case 0:
mat[0] = 0.5;
mat[1] = 0.0;
mat[2] = 0.0;
break;
case 1:
mat[0] = 0.0;
mat[1] = 0.5;
mat[2] = 0.0;
break;
case 2:
mat[0] = 0.0;
mat[1] = 0.0;
mat[2] = 0.5;
break;
default:
break;
}
#保存当前颜色
color[0] = mat[0];
color[1] = mat[1];
color[2] = mat[2];
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat);
glutSolidTeapot(3.0);
glPopMatrix();
#清空缓存区,必须要有这句否则不会运行
glFlush();
}
点击运行查看效果

键盘输入c呈现不同颜色
image.png
image.png
image.png
实现w \ a \ s \ d控制光源移动
同样,查看控制光源的部分,在initial函数里
//光源位置
GLfloat position[] = { 1.0, 1.0, 1.0, 0.0 };
//设置光源
glLightfv(GL_LIGHT0, GL_POSITION, position);
我们设置一个全局变量记录光源的位置
static GLfloat light[4] = { 1.0,1.0,5.0,0.0 };
思路如下:
- 通过键盘响应事件调用函数reLight(char),传进去的就是我们的方向键
- 在函数内部实现修改光源位置
- 自定义reLightDraw函数,不用reDraw的原因是这次我们不修改颜色,而是只用当前的颜色重绘,所以我们重写了一次函数。
- 重绘,完成
键盘响应事件
void keyboard(unsigned char key, int x, int y)
{
switch (key) {
case 27:
exit(0);
break;
case 'c':
reDraw();
break;
case 'a':
case 'w':
case 'd':
case 's':
reLight(key);
break;
default:
cout<<key;
break;
}
}
实现reLight修改光源位置
void reLight(char num) {
switch (num)
{
case 'a':
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
light[0] -= 0.5;
glLightfv(GL_LIGHT0, GL_POSITION, light);
reLightDraw();
glFlush();
break;
case 'w':
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
light[1] += 0.5;
glLightfv(GL_LIGHT0, GL_POSITION, light);
reLightDraw();
glFlush();
break;
case 's':
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
light[1] -= 0.5;
glLightfv(GL_LIGHT0, GL_POSITION, light);
reLightDraw();
glFlush();
break;
case 'd':
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
light[0] += 0.5;
glLightfv(GL_LIGHT0, GL_POSITION, light);
reLightDraw();
glFlush();
break;
default:
break;
}
}
reLightDraw重绘
void reLightDraw() {
glPushMatrix();
glTranslatef(8, 8, 0.0);
glMaterialfv(GL_FRONT, GL_DIFFUSE,color);
#这里的color是我们自定义的保存颜色的数组。
glutSolidTeapot(3.0);
glPopMatrix();
}
运行查看效果


网友评论