计算机图形学 授课教师:陈荣钦 短号:665850 单位:数信学院
考核方式 平时考勤(20%) 期末考核(50%) 实验(30%) 形式:使用OpenGL编程实现一个游戏或者交互式图形程序,现场答辩。 评分依据:原创性、难易程度、效果 实验(30%) 在TOJ提交,每次实验包括报告和程序附件 2
期末考核 方式:自主命题,期末答辩 警告:若源代码从网络上拷贝或者稍作修改本质上没有原创性,直接记为0分
期末最终提交的材料 文件夹以学号+姓名命名并打包,最后一节课演示(加5分)或者交到6304,不接受任何网络发送,并需要一个答辩过程。 材料包括: OpenGL源码方式: 项目工程及可执行程序 PPT:阐述设计思路和方法
资源 所有资源在ACM论坛“3D图形设计与游戏开发”版块提供下载 http://acm.tzc.edu.cn/forum/bbs_forum.do?forumID=16
学习方法 理解图形学基本概念 从最简单的代码开始模仿 有一点点创意不妨试着去编程实现 Just Do It!!! 推荐NeHe教程及其源码,边看边练 有一点点创意不妨试着去编程实现 Just Do It!!!
什么是计算机图形学 图形学应用领域 图形学应用开发基础 第一章 绪论 什么是计算机图形学 图形学应用领域 图形学应用开发基础
什么是计算机图形学 计算机图形学(Computer Graphics,CG)是一门研究如何利用计算机表示、生成、显示和处理图形的学科。 什么是图形? 图形通常由点、线、面、体等几何属性和颜色、纹理、线型、线宽等非几何属性组成。 计算机图形学(Computer Graphics,CG)是一门研究如何利用计算机表示、生成、显示和处理图形的学科。
计算机图形学应用领域 请列举哪些领域是用到计算机图形学的? 有用不到的吗? 图形学主要领域 影视、游戏、工业设计、科学研究、艺术、医学、广告、教育、培训、军事。。。
影视特效或3D动画
影视特效或3D动画 推荐2款软件 好莱坞3D影视特效揭秘 3DS MAX MAYA 偏3D动画和游戏方面,入门相对简单 非常不错的教程,方便自学: http://www.jsj.tzc.edu.cn/teacher/crq/chmjiaochen/3dmax/jinying/3dmax.htm http://www.jsj.tzc.edu.cn/teacher/crq/list.asp?id=77 http://www.jsj.tzc.edu.cn/teacher/crq/list.asp?id=90 MAYA 偏3D动画和影视方面,入门较难,但功能更强大。 好莱坞3D影视特效揭秘
游戏设计 网络游戏《传奇3》 射击游戏 网络游戏《魔兽争霸 》 网络游戏《魔兽争霸 》
游戏设计 计算机游戏是一种新兴的娱乐形式,其巨大的市场与电影业不相上下。 计算机游戏为游戏参与者提供了一个虚拟的空间,从一定程度上让人可以摆脱现实中的自我,在另一个世界中扮演真实世界中扮演不了的角色,因而吸引了众多的玩家。计算机游戏是计算机图形学发展的另一个重要推动力。 课外阅读:越靠近越吸引:游戏制作流程、分工、薪酬全揭秘.doc 魔兽世界宣传片幕后制作
计算机辅助设计和计算机辅助制造 建筑设计 电路设计 汽车外形设计 飞机外形设计 船舶设计 家用电器等设计
计算机辅助设计和计算机辅助制造
汽车外形设计 机械产品设计
计算机辅助设计和计算机辅助制造 流行软件: AutoCAD UG Pro/E SolidWorks
浙大大天GS-CAD
科学计算可视化 数值仿真、气象卫星、石油勘探、遥感卫星、医学影像、蛋白质分子结构等都会产生大量的数据,即使是专业人员也们很难从一大堆枯燥乏味的数字中迅速发现其内在规律和变化趋势。 图形学帮助科技人员更直观形象地理解大规模数据所蕴涵的科学现象和规律。
蛋白质结构的显示 可视人
图形用户界面 我们所用的绝大部分应用软件都提供了友好的图形用户界面(GUI) 。 图形界面的一特色是图标,它是表示某种选项的形象直观的图形符号。 Photoshop的图形用户界面
计算机艺术 计算机艺术是科学和艺术相结合的一门学科。 计算机艺术不需要传统的纸和笔等材料,所有的创作都在电子画布上实现。 许多绘画软件如Adobe公司的Photoshop提供了丰富的绘画工具,如软硬铅笔、炭笔、彩色铅笔、色粉笔、钢笔、签字笔、油画棒、毛笔、水彩笔、油画笔、喷笔等,而且还提供了色彩丰富的调色板和各式各样的笔触。 Wacom公司的数位板和无线压感笔则有效地解决了电脑笔输入的难题,使得艺术创作能以接近传统的方式进行。
WACOM数位板
计算机模拟中国绘画
计算机模拟中国绘画
计算机图形开发 两个重要的3D图形应用接口 OpenGL:一个开放的图形标准,由OpenGL架构委员会严格制定,可移植,其成员为各大图形硬件厂商。 DirectX:微软的API,除了图形部分,还包括音频API,存在的最大问题是接口复杂、版本不兼容。 两者在图形渲染上功能相当,但是由于Windows的流行,因此目前中国的游戏开发以DirectX为主。
OpenGL入门材料 书籍: 红宝书(英文版OpenGL Programming Guide):详细介绍OpenGL基础知识
推荐学习网站 http://nehe.gamedev.net/ http://www.xmission.com/~nate http://www.gamea.com.cn/ http://www.zeuscmd.com http://www.opengl.org http://www.gametutorials.com http://www.azure.com.cn
NeHe1:创建一个OpenGL窗口 基础知识: 几个库函数特点 Windows专用函数,只能用于Windows平台 以gl开头,可以运行于任何的OpenGL工作平台。 OpenGL实用库函数 以glu开头,是基于OpenGL核心函数而比其更高一层的函数。它们也可以运行于任何OpenGL平台。 Windows相关函数 Windows专用函数,只能用于Windows平台 以wgl开头,用于连接OpenGL和Windows窗口系统 以glaux开头,有导入位图、绘制简单模型函数
NeHe1:创建一个OpenGL窗口 具体见教程及源代码 步骤: 创建Win32 Application 加入链接库:opengl32.lib glu32.lib glaux.lib 创建源文件main.cpp 包含头文件: #include <windows.h>//Windows专用 #include <gl\gl.h>//核心库 #include <gl\glu.h>//实用库 #include <gl\glaux.h>//windows平台相关
HDC hDC=NULL; // 图形设备句柄 HGLRC hRC=NULL; // OpenGL渲染句柄 HWND hWnd=NULL; // 窗口句柄 HINSTANCE hInstance; // 应用程序句柄 创建窗口的过程(见CreateGLWindow函数): (1)注册窗口类:RegisterClass (2)创建窗口:CreateWindowEx (3)创建图形设备句柄:GetDC (4)选择像素格式:ChoosePixelFormat (5)设置像素格式:SetPixelFormat (6)创建OpenGL渲染句柄:ChoosePixelFormat (7)为图形设备句柄启用渲染句柄:wglMakeCurrent
OpenGL初始化,见InitGL函数,必须在窗口创建之后调用 void glShadeModel ( GLenum mode); //设置着色模式。参数mode可以是GL_SMOOTH(默认值)或GL_FLAT glClearColor(1.0f, 0.0f, 0.0f, 0.5f);//设置清除颜色,颜色R,G,B,A值 glClearDepth(1.0f); //只有深度小于等于1的才可见 glEnable(GL_DEPTH_TEST);//启用深度检测 glDepthFunc(GL_LEQUAL);//小于等于
Windows消息处理函数,见WndProc函数,这个函数的前面有CALLBACK返回类型,称为回调函数,即由Windows系统来调用(参考Windows编程)。开发者主要编写响应消息的代码,主要处理的消息有: WM_ACTIVATE:窗口被激活 WM_SYSCOMMAND:选择窗口控制菜单 WM_CLOSE:窗口关闭 WM_KEYDOWN:键盘按下: WM_KEYUP:键盘弹起 WM_SIZE:窗口大小变化 WM_LBUTTONDOWN:鼠标左键按下(左键L,还有R,M) WM_LBUTTONUP:鼠标左键弹起(同上…) WM_LBUTTONDBLCLK:双击左键(同上…)
窗口变化时会发生图形变形,因此我们需要响应该消息并重新调整,见ReSizeGLScene函数 glViewport(0,0,width,height);//创新调整视口大小,因为图形大小得随窗口变化 glMatrixMode(GL_PROJECTION);//准备修改投影矩阵,这个矩阵可以规定我们的立体视图效果,即近处大远处小 glLoadIdentity();//将投影矩阵改成单位矩阵,理解为重置 gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);//注意这里分母height不能为0,否则会出错 glMatrixMode(GL_MODELVIEW);//模型观察矩阵,只有这个这个矩阵模式下,我们才可以绘图
一切就绪,就等我们绘图了 绘图代码见DrawGLScene, int DrawGLScene(){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//相当于用黑板檫擦了一遍,黑板檫是什么颜色的? glLoadIdentity(); //从这里开始我们需要绘制了,试试这个 glTranslatef(0.0f,0.0f,-10.0f); auxSolidTeapot(2.0); //若要继续,请先自习NEHE后面的教材 return TRUE; }