您的位置:首页 > 运维架构

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

2014-07-06 16:05 337 查看
这两天学习了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
}


真正的挑战还在后面!坚持下去!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: