NeHe的OpenGL教程 lesson1-5 学习心得

这两天学习了NeHe的OpenGL教程的前5个课程,了解并掌握了OpenGL较为基础的知识:多边形的绘制,上色,旋转等。

1.      X坐标轴从左至右,Y坐标轴从下至上,Z坐标轴从里至外。OpenGL屏幕中心的坐标值是X和Y轴上的0.0f点。中心左面的坐标值是负值,右面是正值。移向屏幕顶端是正值,移向屏幕底端是负值。移入屏幕深处是负值,移出屏幕则是正值。

 

2.      GL_TRIANGLES 三角形

GL_QUADS 正方形

GL_POLYGON 多边形

 

3.      我们使用顺时针次序来画正方形-左上-右上-右下-左下。采用顺时针绘制的是对象的后表面。这就是说我们所看见的是正方形的背面。逆时针画出来的正方形才是正面朝着我们的。

 

4.      使用Flat coloring(单调着色)给四边形涂上固定的一种颜色。使用Smooth coloring(平滑着色)将三角形的三个顶点的不同颜色混合在一起,创建漂亮的色彩混合。

glShadeModel(GL_FLAT)采取最后一点的颜色作为刚绘制的多边形的整体颜色。

glShadeModel(GL_SMOOTH)则采取渐变色绘制多边形。(默认为此模式)


彩色的多边形:

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
}

在windows消息循环机制中添加改变着色方式的代码(F2单调着色,F3平滑着色,默认为平滑着色模式)

int WINAPI WinMain(	HINSTANCE	hInstance,				// 当前窗口实例
				   HINSTANCE	hPrevInstance,				// 前一个窗口实例
				   LPSTR		lpCmdLine,				// 命令行参数
				   int		nCmdShow)				// 窗口显示状态
{

	MSG	msg;								// Windowsx消息结构
	BOOL	done=FALSE;							// 用来退出循环的Bool 变量
	// 提示用户选择运行模式
	if (MessageBox(NULL,"你想在全屏模式下运行么?", "设置全屏模式",MB_YESNO|MB_ICONQUESTION)==IDNO)
	{
		fullscreen=FALSE;						// FALSE为窗口模式
	}
	// 创建OpenGL窗口
	if (!CreateGLWindow("cc's 颜色实例",640,480,16,fullscreen))
	{
		return 0;							// 失败退出
	}
	while(!done)								// 保持循环直到 done=TRUE
	{
		if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))			// 有消息在等待吗?
		{
			if (msg.message==WM_QUIT)				// 收到退出消息?
			{
				done=TRUE;					// 是,则done=TRUE
			}
			else							// 不是,处理窗口消息
			{
				TranslateMessage(&msg);				// 翻译消息
				DispatchMessage(&msg);				// 发送消息
			}
		}
		else								// 如果没有消息
		{
			// 绘制场景。监视ESC键和来自DrawGLScene()的退出消息
			if (active)						// 程序激活的么?
			{
				if (keys[VK_ESCAPE])				// ESC 按下了么?
				{
					done=TRUE;				// ESC 发出退出信号
				}
				else						// 不是退出的时候,刷新屏幕
				{
					DrawGLScene();				// 绘制场景
					SwapBuffers(hDC);			// 交换缓存 (双缓存)
				}
			}
			if (keys[VK_F1])					// F1键按下了么?
			{
				keys[VK_F1]=FALSE;				// 若是,使对应的Key数组中的值为 FALSE
				KillGLWindow();					// 销毁当前的窗口
				fullscreen=!fullscreen;				// 切换 全屏 / 窗口 模式
				// 重建 OpenGL 窗口
				if (!CreateGLWindow("cc's 颜色实例",640,480,16,fullscreen))
				{
					return 0;				// 如果窗口未能创建,程序退出
				}
			}
			if (keys[VK_F2])
			{ 
				glShadeModel(GL_FLAT);
			}
			if (keys[VK_F3])
			{ 
				glShadeModel(GL_SMOOTH);
			}
		}
	}
	// 关闭程序
	KillGLWindow();								// 销毁窗口
	return (msg.wParam);							// 退出程序
}



旋转的3D体:

先设置全局变量

GLfloat		rtri;						// 用于三角形的角度
GLfloat		rquad;						// 用于四边形的角度

更新DrawGLScene函数

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(rtri,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, 1.0f);					// 左下顶点
		glColor3f(0.0f,0.0f,1.0f);				// 设置当前色为蓝色
		glVertex3f( 1.0f,-1.0f, 1.0f);					// 右下顶点

		glColor3f(1.0f,0.0f,0.0f);			// 红色	
		glVertex3f( 0.0f, 1.0f, 0.0f);			// 三角形的上顶点 (右侧面)	
		glColor3f(0.0f,0.0f,1.0f);			// 蓝色
		glVertex3f( 1.0f,-1.0f, 1.0f);			// 三角形的左下顶点 (右侧面)
		glColor3f(0.0f,1.0f,0.0f);			// 绿色
		glVertex3f( 1.0f,-1.0f, -1.0f);			// 三角形的右下顶点 (右侧面)

		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, -1.0f);			// 三角形的左下顶点 (后侧面)
		glColor3f(0.0f,0.0f,1.0f);			// 蓝色
		glVertex3f(-1.0f,-1.0f, -1.0f);			// 三角形的右下顶点 (后侧面)

		glColor3f(1.0f,0.0f,0.0f);			// 红色	
		glVertex3f( 0.0f, 1.0f, 0.0f);			// 三角形的上顶点 (左侧面)	
		glColor3f(0.0f,0.0f,1.0f);			// 蓝色
		glVertex3f(-1.0f,-1.0f,-1.0f);			// 三角形的左下顶点 (左侧面)
		glColor3f(0.0f,1.0f,0.0f);			// 绿色
		glVertex3f(-1.0f,-1.0f, 1.0f);			// 三角形的右下顶点 (左侧面)
	glEnd();								// 三角形绘制结束

	glLoadIdentity();					// 重置模型观察矩阵

	glTranslatef(1.5f,0.0f,-7.0f);				// 右移1.5单位,并移入屏幕 6.0

	glRotatef(rquad,1.0f,1.0f,1.0f);			//  绕在XYZ轴上旋转立方体

	glBegin(GL_QUADS);							//  绘制正方形
		glColor3f(0.0f,1.0f,0.0f);					// 一次性将当前色设置为蓝色
		glVertex3f( 1.0f, 1.0f, -1.0f);					// 左上
		glVertex3f(-1.0f, 1.0f,-1.0f);					// 右上
		glVertex3f(-1.0f, 1.0f, 1.0f);					// 左下
		glVertex3f( 1.0f, 1.0f, 1.0f);					// 右下
		
		glColor3f(1.0f,0.5f,0.0f);			// 颜色改成橙色
		glVertex3f( 1.0f,-1.0f, 1.0f);			// 四边形的右上顶点(底面)
		glVertex3f(-1.0f,-1.0f, 1.0f);			// 四边形的左上顶点(底面)	
		glVertex3f(-1.0f,-1.0f,-1.0f);			// 四边形的左下顶点(底面)
		glVertex3f( 1.0f,-1.0f,-1.0f);			// 四边形的右下顶点(底面)

		glColor3f(1.0f,0.0f,0.0f);			// 颜色改成红色	
		glVertex3f( 1.0f, 1.0f, 1.0f);			// 四边形的右上顶点(前面)	
		glVertex3f(-1.0f, 1.0f, 1.0f);			// 四边形的左上顶点(前面)	
		glVertex3f(-1.0f,-1.0f, 1.0f);			// 四边形的左下顶点(前面)	
		glVertex3f( 1.0f,-1.0f, 1.0f);			// 四边形的右下顶点(前面)

		glColor3f(1.0f,1.0f,0.0f);			// 颜色改成黄色
		glVertex3f( 1.0f,-1.0f,-1.0f);			// 四边形的右上顶点(后面)	
		glVertex3f(-1.0f,-1.0f,-1.0f);			// 四边形的左上顶点(后面)
		glVertex3f(-1.0f, 1.0f,-1.0f);			// 四边形的左下顶点(后面)	
		glVertex3f( 1.0f, 1.0f,-1.0f);			// 四边形的右下顶点(后面)

		glColor3f(0.0f,0.0f,1.0f);			// 颜色改成蓝色
		glVertex3f(-1.0f, 1.0f, 1.0f);			// 四边形的右上顶点(左面)
		glVertex3f(-1.0f, 1.0f,-1.0f);			// 四边形的左上顶点(左面)
		glVertex3f(-1.0f,-1.0f,-1.0f);			// 四边形的左下顶点(左面)	
		glVertex3f(-1.0f,-1.0f, 1.0f);			// 四边形的右下顶点(左面)

		glColor3f(1.0f,0.0f,1.0f);			// 颜色改成紫罗兰色	
		glVertex3f( 1.0f, 1.0f,-1.0f);			// 四边形的右上顶点(右面)	
		glVertex3f( 1.0f, 1.0f, 1.0f);			// 四边形的左上顶点(右面)	
		glVertex3f( 1.0f,-1.0f, 1.0f);			// 四边形的左下顶点(右面)	
		glVertex3f( 1.0f,-1.0f,-1.0f);			// 四边形的右下顶点(右面)
	glEnd();								// 正方形绘制结束

	rtri+=0.2f;						// 增加三角形的旋转变量	
	rquad-=0.15f;						// 减少四边形的旋转变量

	return TRUE;								//  一切 OK
}

真正的挑战还在后面!坚持下去!

你可能感兴趣的:(NeHe的OpenGL教程 lesson1-5 学习心得)