OpenGL的颜色机制和旋转机制

本文详细介绍了OpenGL着色机制中的单调着色和平滑着色,以及如何利用glRotatef函数实现对象在3D空间中的旋转。通过在特定场景中设置颜色并旋转对象,展示了旋转机制在3D图形绘制中的实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.颜色机制

OpenGL着色有两种方式单调着色(Flat coloring)和平滑着色(Smooth coloring),函数glColor3f()用来设置当前的绘制颜色,直到颜色被改变之前,所有绘制的实体颜色是固定的。如下所示,只需要在函数DrawGLScene(GLvoid)中控制好颜色变化的时机即可,

/*******************************************************************************************************************************************
*int DrawGLScene(GLvoid)		
*功能:绘图
*参数:无
*返回值:BOOL
********************************************************************************************************************************************/
int DrawGLScene(GLvoid)
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);	// 清除屏幕和深度缓存
	glLoadIdentity();	// 重置当前的模型观察矩阵
	//添加绘图代码
	glTranslatef(-1.5f,0.0f,-6.0f);	// 左移 1.5 单位,并移入屏幕 6.0
	glBegin(GL_TRIANGLES);	// 绘制三角形
		//开启平滑着色模式
		glColor3f(1.0f,0.0f,0.0f);		// 设置当前色为红色
		glVertex3f( 0.0f, 1.0f, 0.0f);	// 上顶点
		glColor3f(0.0f,1.0f,0.0f);		// 设置当前色为绿色
		glVertex3f(-1.0f,-1.0f, 0.0f);	// 左下
		glColor3f(0.0f,0.0f,1.0f);		// 设置当前色为蓝色
		glVertex3f( 1.0f,-1.0f, 0.0f);	// 右下
	glEnd();

	glTranslatef(3.0f,0.0f,0.0f);	// 右移3单位
	//开启单调着色模式
	glColor3f(0.5f,0.5f,1.0f);		// 一次性将当前色设置为蓝色
	glBegin(GL_QUADS);		//  绘制正方形
		glVertex3f(-1.0f, 1.0f, 0.0f);	// 左上
		glVertex3f( 1.0f, 1.0f, 0.0f);	// 右上
		glVertex3f( 1.0f,-1.0f, 0.0f);	// 左下
		glVertex3f(-1.0f,-1.0f, 0.0f);	// 右下
	glEnd();	// 正方形绘制结束

	return TRUE;	//  一切 OK
}

运行效果如下:



2.旋转机制

函数glRotatef(Angle,Xvector,Yvector,Zvector)负责让对象绕某个轴(方向)旋转,Angle 通常是个变量代表对象转过的角度。 Xvector , Yvector 和 Zvector 三个参数则共同决定旋转轴的方向。OpenGL的坐标轴是右手坐标系。一个重要的问题是,当进行过一次旋转之后,坐标轴会发生改变,此时如果想要恢复原始的坐标系,应该用函数glLoadIdentity()重置模型观察矩阵。一个典型示例如下:

/*******************************************************************************************************************************************
*int DrawGLScene(GLvoid)		
*功能:绘图
*参数:无
*返回值:BOOL
********************************************************************************************************************************************/
int DrawGLScene(GLvoid)
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);	// 清除屏幕和深度缓存
	glLoadIdentity();	// 重置当前的模型观察矩阵
	//添加绘图代码
	glTranslatef(-1.5f,0.0f,-6.0f);	// 左移 1.5 单位,并移入屏幕 6.0
	glRotatef(30.0f,0.0f,1.0f,0.0f);	// 绕Y轴旋转三角形
	glBegin(GL_TRIANGLES);	// 绘制三角形
		//开启平滑着色模式
		glColor3f(1.0f,0.0f,0.0f);		// 设置当前色为红色
		glVertex3f( 0.0f, 1.0f, 0.0f);	// 上顶点
		glColor3f(0.0f,1.0f,0.0f);		// 设置当前色为绿色
		glVertex3f(-1.0f,-1.0f, 0.0f);	// 左下
		glColor3f(0.0f,0.0f,1.0f);		// 设置当前色为蓝色
		glVertex3f( 1.0f,-1.0f, 0.0f);	// 右下
	glEnd();

	glLoadIdentity();	// 重置当前的模型观察矩阵
	glTranslatef(1.50f,0.0f,-6.0f);	// 右移1.5单位,并移入屏幕6个单位
	glRotatef(45.0f,1.0f,0.0f,0.0f);	// 绕X轴旋转四边形
	//开启单调着色模式
	glColor3f(0.5f,0.5f,1.0f);		// 一次性将当前色设置为蓝色
	glBegin(GL_QUADS);		//  绘制正方形
		glVertex3f(-1.0f, 1.0f, 0.0f);	// 左上
		glVertex3f( 1.0f, 1.0f, 0.0f);	// 右上
		glVertex3f( 1.0f,-1.0f, 0.0f);	// 左下
		glVertex3f(-1.0f,-1.0f, 0.0f);	// 右下
	glEnd();	// 正方形绘制结束

	return TRUE;	//  一切 OK
}

结果如下所示:


从坐标轴正向往负向看,旋转方向为逆时针。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值