Download presentation
Presentation is loading. Please wait.
1
计算机动画 第二讲 计算机动画的编程基础
2
本讲内容提要 1.计算机动画的图形基础 1.1 图形及其动态显示 1.2 颜色模型 1.3 图形变换 1.4 曲线和曲面
2.计算机动画的关键技术 3.用编程语言设计动画简介 3.1用VB设计动画 3.2用java设计动画 3.3用VC++设计动画
3
1.1 图形及其动态显示 图形(矢量图)与图像(点阵图) 动态图形显示 计算机中表示图的方法 点阵表示:枚举出图形中所有的点
简称为图像(数字图像) 参数表示:形状参数+属性参数 简称为图形 动态图形显示 绘制-擦除-再画 亮-灭-亮
4
1.2 颜色模型 光与彩色 三基色原理 各种颜色模型 颜色管理技术
颜色管理是一个系统,用于确保彩色内容在任何位置的呈现效果都让您满意,包括不同设备。 为什么需要颜色管理? ----不同类型的设备往往会有不同的颜色特征和功能。 因为每个设备呈现彩色内容的过程是根本不同的。 如果没有一致的颜色管理系统,相同的图片在各个设备上的显示效果便会不同。 因此,颜色管理将维护彩色内容中的关系,从而在具有不同的颜色功能的设备上以及在不同的查看条件下能够获得可以接受的显示效果。
5
1.3 图形变换 坐标系 图形变换过程 正投影图与透视图 各种坐标系及其之间的变换 二维三维变换、齐次坐标、复合变换 窗口和视区的变换
观察坐标系中的投影变换
6
投影分类 投影中心与投影平面之间的距离为无限 投影中心与投影平面之间的距离为有限
7
三视图:正视图、侧视图和俯视图
8
1.4 曲线和曲面 基本概念 Bezier曲线和曲面 B样条曲线和曲面 非均匀有理B样条(NURBS)曲线和曲面
9
2、计算机动画关键技术 参数关键帧技术 样条驱动技术 变形技术 过程动画技术 关节动画与人体动画技术 基于物理模型的动画技术 行为动画技术
运动捕捉技术 三维扫描技术
10
2、计算机动画关键技术 1. 参数keyframe 给出两幅关键帧,计算机生成中间画面 刚体运动模拟 早期
仅仅用来插值帧与帧之间卡通画的形状 后来 对运动参数插值,实现对动画的运动控制
11
第1帧和第8帧是关键帧,其余各帧(2-7帧)可由插值算法生成
12
2、计算机动画关键技术 可归结为关键参数的插值问题 位置、色彩、纹理 9个运动参数决定 位置参数:Tx,Ty,Tz,
方向参数:Rx,Ry,Rz, 比例参数:Sx,Sy,Sz
13
2、计算机动画关键技术 与纯数学插值问题不同: 一个特定的运动从空间轨迹来看可能是正确的 但从运动学或动画设计角度看,则可能是错误的
关键帧插值要求: 能产生逼真的运动效果 用户能方便有效地控制运动的运动学特性 例如,通过调整插值函数改变运动的速度和加速度
14
2、计算机动画关键技术 匀速运动的模拟: 假定需在时间段t1与t2之间插入n(n=5)帧 终始关键帧之间的时间段被分为n+1个子段
其时间间隔为: △t = (t2 –t1)/(n +1) 则任一插值帧的时刻为: j = 1, 2, … ,n △t t1 t2
15
2、计算机动画关键技术 加速运动的模拟: 为使帧间的时间间隔增加 可使用下列三角加速函数来得到增加的间隔:
1 - cosθ, <θ< π/2 对于插值帧来说,第j个插值帧的时刻可由下式得到: j = 1,2,…,n 1-cosθ cosθ t1 t2
16
2、计算机动画关键技术 减速运动的模拟: 使用下列三角减速函数来得到减少的间隔: sinθ, 0 < θ < π/2 ,
则第j个插值帧的时间位置被定义成: j = 1,2,…,n sinθ t1 t2
17
2、计算机动画关键技术 混合增减速度的模拟: 先增加插值时间间隔后减少时间间隔 所使用的时间变化函数是:
1/2 (1 – cos θ) 0 < θ < π 得到第j个插值帧的时刻为: j = 1, 2,…, n (1-cos)/2θ cosθ t1 t2
18
2、计算机动画关键技术 关键帧动画存在的主要问题 交互响应慢 物体运动的物理正确性和自然真实性难以保证
19
2、计算机动画关键技术 2. 样条驱动技术 用户事先指定一条物体运动的轨迹 指定物体沿该轨迹运动,也称运动轨迹法 所要解决的基本问题
通常用三次参数样条表示 指定物体沿该轨迹运动,也称运动轨迹法 所要解决的基本问题 通过对样条曲线等间隔采样,求出物体在某一帧的位置,从而生成整个动画序列 如果直接对参数空间进行等间隔采样,势必带来运动的不均匀性 匀速运动时,需要对样条进行弧长参数化
20
2、计算机动画关键技术 为解决插值的时间控制问题(用双插值方法) 位置样条 运动样条 空间轨迹曲线 物体位置对关键帧的函数 速度曲线
关键帧对时间的函数
21
2、计算机动画关键技术 路径动画 路径动画就是由用户根据需要设定好一个路径后,使场景中对象沿着路径进行运动。
运动路径是用户画出的动画对象运动的曲线,由关键点控制。 比如模拟飞机的飞行,鱼的游动都可以使用路径动画来制作。 二维动画中的运动路径设计
22
2、计算机动画关键技术 3. 变形技术 柔性物体(soft object)动画技术 许多商用动画软件都提供变形工具
Softimage、Alias、Maya、3DS MAX
23
变形动画示例
24
2、计算机动画关键技术 Morphing技术
指将一个给定的数字图像或者几何形状S以一种自然流畅的、光滑连续的方式渐变为另一个数字图像或者几何形状T。在这种光滑过渡中,中间帧既具有S的特征,又具有T的特征。 基本思想: 移动顶点,通过顶点改变,达到变形 给出物体形变的几个状态 如两个物体或两幅画面之间特征的对应关系以及相应的时间控制关系 物体沿给定的插值路径进行线性或非线性的形变 基于物体表示的变形技术 适用于物体拓扑结构不发生变化的变形操作
25
2、计算机动画关键技术 自由变形技术( Free Form Deformation: FFD) 基本思想 优点: 缺点:
不对物体直接进行变形 而是对物体所嵌入的空间进行变形 引入一种基于三变量B样条体的变形工具lattice 优点: 最实用,适用面最广 间接的与物体表示无关的变形方法 物体的变形是任意的,可由动画师任意控制 对变形的可控性更强 缺点: 缺乏对变形的细微控制,如人脸表情
26
2、计算机动画关键技术 为了解决FFD的不足
基于约束的变形,在FFD中,lattice变形和物体变形之间的对应关系并不直观。简单约束变形法即用户定义一系列约束点、所需的偏移量和影响区域半径,在每个约束点处定义一个以该点为中心的局部B样条基函数,该函数在影响区域外取值为0。该方法计算量小,在工作站上可实时交互。 轴变形,在FFD中,控制点较多时交互性就较差。基于轴的变形是用物体轴线的变形来控制物体的变形。对轴线设置动画是很容易的。用该方法仿真鱼的游动,取得了很好的效果。
27
2、计算机动画关键技术 4. 过程动画技术 Procedural Animation或Random Animation
物体的运动和变形可由一个过程来控制 物体的变形不是任意的 遵循一定的数学模型或物理规律 水波运动,三维森林、草叶随风飘动,火光、烟雾等特殊光效
28
2、计算机动画关键技术 水波的模拟 过程动画模拟的水波效果
一个简单而有效的方法是用正弦波,动画效果可通过对诸如振幅、相位等参数来设置。水波可以用平行波,一种三维空间的正弦波状曲面来造型。 海洋波是一种复杂的波形,受风传递的动量所影响, 水波的物理过程,频谱成分能量的传递过程,可用由观测数据而得的Pierson-Moskowitz模型去模拟。 深水区域波的模拟,实际波的侧面轮廓线经常是多值的、连续改变形状的。随水深不同而有不同传播速度的波,并有溅水和泡沫。波在浅水区域减慢,较好地模拟接近海滩的水波。在波的传播方向上,波的截面轮廓线不一定是正弦波,受风驱动的波其形状是风速的函数。风速加快时,波峰变陡,正弦波只适合于小振幅的情况。可模拟出由风引起的波峰的改变,Alias软件能模拟非常逼真的水波效果。 过程动画模拟的水波效果
29
2、计算机动画关键技术 粒子动画 将随机景物想象成由大量的具有一定属性的粒子构成。根据各自的动画,每个粒子都要经历“出生”、“运动和生长”及“死亡”三个阶段。每个粒子都有自己的粒子参数,包括初速度、加速度、运动轨迹和生命周期等。这些参数决定了随机景物的变化,使用粒子系统可以产生很逼真的随机景物。动画剧本不仅可控制粒子的位置和速度,还可控制粒子的外形参数如颜色、大小、透明度等。由于粒子系统是一个有“生命”的系统,它充分体现了不规则物体的动态性和随机性,因而可产生一系列运动进化的画面,这使模拟动态的自然景色如火、云、水等成为可能,如火焰、气流、瀑布等。 粒子动画创作的真实感云层
30
2、计算机动画关键技术 群体运动 在生物界,许多动物如鸟、鱼等以某种群体的方式运动。这种运动既有随机性,又有一定的规律性。Reynolds提出的群体动画成功地解决了这一问题。Reynolds指出,群体的行为包含两个对立的因素,即既要相互靠近又要避免碰撞。他用三条按优先级递减的原则来控制群体的行为: (1) 碰撞避免原则,即避免与相邻的群体成员相碰; (2) 速度匹配原则,即尽量匹配相邻群体成员的速度; (3) 群体合群原则,即群体成员之间尽量靠近。
31
2、计算机动画关键技术 布料动画 布料动画不仅包括人体衣服的动画,还包括旗帜、窗帘、桌布等的动画。布料动画的一个特殊应用领域为时装设计,它将改变传统的服装设计过程,让人们在衣服做好之前就可看到服装的式样和试穿后的形态。 1.基于几何的布料动画 把布料悬挂在一些约束点上,基于悬链线计算出布料自由悬挂时的形状。该方法不能模拟衣服的皱褶。 2.基于物理的布料动画 基于几何的方法不考虑布料的质量、弹性系数等物理因素,因而很难逼真地生成布料的动画。用基于物理的方法去模拟。基于弹性理论的描述曲面的运动变形方法。该方法基于动力学微分方程,把物体形状和运动的描述统一起来。可模拟了旗帜的飘动和地毯的坠落过程。 扩展了的方法,很好地模拟了一个穿着衣服的演员的动画。把布理解成由一系列线穿梭成的交叉点,提出了一个丝织布料的理论模型,很好地模拟了布的悬挂效果,并应用于CAD。 在布料动画中,一个瓶颈问题是系统的时间步长必须足够小,以避免数值计算的不稳定。通过隐式积分方法,Baraff等人提出了一种可以采用大时间步长的衣服仿真系统,他们的结果被刊载在1998年《Siggraph》的封面上,效果非常逼真。
32
2、计算机动画关键技术 5. 关节动画与人体动画技术 电影《终结者Ⅱ》、《侏罗纪公园》。
但人体和动物动画的许多问题仍未能很好地解决。是计算机动画中最富挑战性的课题之一。 其原因就在于人体共有200个以上的自由度,其运动非常复杂,人的形状不规则,人的肌肉随着人体的运动而变形,人的头发、皮肤和衣服模拟起来困难,人的个性、表情千变万化等。另外,由于人类对自身的运动非常熟悉,不协调的运动很容易被观察者所察觉。 用球体作为基本体素来构造人体 正向运动学、逆运动学、运动学和动力学的结合 动力学中的控制问题、时空约束动画、虚拟动物的动画、脸部表情动画
33
美国哥伦比亚电影公司联合制作的全计算机动画电影《Final Fantasy:The Spirits Within》。其中的女主人公的面部是用计算机动画技术制作的,其生动的3D面部表情足以乱真
34
2、计算机动画关键技术 6. 基于物理模型的动画技术
基于物理模型的动画技术考虑物体在真实世界中的属性,如它具有质量、转动惯矩、弹性、摩擦力等,并采用动力学原理自动产生物体的运动。当场景中的物体受到外力作用时,牛顿力学中的标准动力学方程可用来自动生成物体在各个时间点的位置、方向及其形状。计算机动画设计者不必关心物体运动过程中的细节,而只需确定物体运动所需的一些物理属性及一些约束关系,如质量、外力等。
35
2、计算机动画关键技术 6. 基于物理模型的动画技术 考虑了物体在真实世界中的属性 基于动力学原理来自动产生物体的运动
特别适合于对自然物理现象的模拟 如刚体运动模拟、重力、风、碰撞检测、塑性物体变形运动、破裂爆炸以及流体运动模拟等 动画软件Softimage在基于动力学的动画功能方面已相当成熟
36
2、计算机动画关键技术 7. 行为动画(Behavioral Animation)
人物行为动画,例如行走、站立、奔跑等动作;各类动物的行为动画,例如飞鸟、野兽等的运动规律。 要求实时性、虚拟现实(VR) 相关文章 虚拟人情绪行为动画模型—人脸 群体行为动画中认知角色的建模方法—鱼群 虚拟现实中个性行为动画的实现 基于行为建模的人工鱼动画技术研究
37
2、计算机动画关键技术 8.运动捕获技术 (Motion Capture) 运动捕获的过程: 真实演员按导演的要求做动作
动作被转换为数字信息,通过感应器记录到计算机中 计算机搜集这些数据后将信息传递到工作室,然后结果被3D化,在计算机中以线条形式表现出来,形成电影中角色的基础 增加皮肤和外壳之后,那些线条就成为了虚拟角色
39
左图显示一个被贴了标示物(白色小球)的演员在场地中跑步,右图是Vicon370系统所采用的特殊红外照相机,只捕捉白色标示物。
40
2、计算机动画关键技术 好莱坞的CG人体动作一般都会采用昂贵的动作捕获系统录制完成 1998年获奥斯卡视觉效果成就奖的《泰坦尼克》
沉船时乘客落水的镜头 全三维CG影片《最终幻想》 人类面部表情
41
2、计算机动画关键技术 9.三维扫描技术 三维扫描(3D scanner)技术又称为三维数字化技术,能对立体的实物进行三维扫描,迅速获得物体表面各采样点的三维空间坐标和色彩信息,从而得到物体的三维彩色数字模型。部分特殊的三维扫描装置甚至能得到物体的内部结构。 与传统的平面扫描和摄像技术不同,三维扫描技术的扫描对象不再是图纸、照片等平面图案,而是立体的实物。获得的不是物体某一个侧面的图像,而是其全方位的三维信息。其输出也不是平面图像,而是对象的三维数字彩色模型。
42
2、计算机动画关键技术 由于三维扫描技术能快速方便地将真实世界的立体彩色信息转换为计算机能直接处理的数字信号,在影视特技制作、虚拟现实、高级游戏、文物保护等方面得到了广泛应用。它可以将演员、模型、道具等的表面空间和颜色数据扫描到计算机中,结合现代计算机动画、影视图像处理技术,对这些图像做旋转、压缩、拉伸等各种变化,进行切割、剪裁、拼接等处理,或融入特定的场景中,实现高难度的特技效果,给三维动画特技制作带来了极大的便利。
43
3.用编程语言设计动画简介 3.1 用VB设计动画 3.2 用java设计动画 3.3 用VC++设计动画
44
3.1 用VB设计动画 3.1.1 vb实现简单动画的方法和实例:
基本原理:实现动画的基础是图像的显示和使图像快速、定时地移动或变化。利用Image和Timer控件能很方便地实现动画。 显示:用LoadPicture函数将图像文件装入内存,并将函数返回值赋予Image对象的Picture属性,便能在Image对象中显示图像。 运动控制:使用Timer控件可以实现定时控制。Timer对象的Interval属性设置了定时间隔,即调用Timer事件过程的时间间隔。在Timer事件过程中处理控制Image对象的移动或变化,便能实现动画。Timer对象的Interval值决定了动画的变化或移动速度。
45
3.1 用VB设计动画 使图像移动或变化的基本方法: 示例演示:圆形动画时钟、烟花、雨景模拟、图形动画
无位移动画:是指动画对象不移动,但图像不断变化。实现无位移动画的方法是,设置好Image和Timer对象后,在Timer事件过程中调用LoadPicture函数装载不同的图像,并赋予Image对象的Picture属性,使对象中显示不同的图像,即实现图像变化。例:幻灯片。 单帧位移动画:是指同一幅图像的位置不断变化而形成的动画,编制单帧位移动画的方法是在Timer事件过程中调用Image对象的Move方法来移动图像。其Left和Top属性指示了Image对象的当前左上角位置。例:水中游鱼(不摆尾)、图形动画(简单动画、电影字幕模拟) 多帧位移动画:综合了无位移动画和单帧位移动画的特点,如小鸟的飞翔,在小鸟位置的移动的同时,其翅膀也在扇动。实现多帧位移动画需要在Timer事件过程中同时处理Image对象的图像更替和位置移动。例:奔跑的猎豹。 缩放动画 :在Timer事件过程中修改Image对象的Width和Height属性,便可实现缩放动画。但如果要表现物体的同心缩放,则还应同时还需移动Image对象。例:气球的膨胀或缩小、文字缩放效果 示例演示:圆形动画时钟、烟花、雨景模拟、图形动画
46
3.1 用VB设计动画 3.1.2 vb实现复杂动画的方法和实例 directX 介绍
DirectX并不是一个单纯的图形API,它是由微软公司开发的用途广泛的API,由很多API组成的,可以分为四大部分,显示部分、声音部分、输入部分和网络部分。 包含: Direct Graphics(Direct 3D+Direct Draw)、Direct Input、Direct Play、Direct Sound等多个组件,它提供了一整套的多媒体接口方案。只是其在3D图形方面的优秀表现,让它的其它方面显得暗淡无光 显示部分担任图形处理的关键 DirectDraw(DDraw) 主要负责2D图像加速。它包括很多方面:我们播放mpg、DVD电影、看图、玩小游戏等等都是用的DDraw,你可以把它理解成所有划线的部分都是用的DDraw。 Direct3D(D3D),主要负责3D效果的显示,比如CS中的场景和人物、FIFA中的人物等等,都是使用了DirectX的Direct3D。
47
3.1 用VB设计动画 VB directX 结合实现复杂动画效果 示例:获得系统中的DirectDraw和DirectSound驱动
打开VB,点击菜单中的 Project | References 项,在Object Library 列表中会有一项:DirectX 7.0 For Visual Basic Type Library 列表项,这个就是DirectX7.0 VB类库,选中该项,再选“ok”按钮,就可以将库加入工程文件中。 示例:获得系统中的DirectDraw和DirectSound驱动
48
3.2 用java设计动画 3.2.1 基本原理及实现技术 原理:在屏幕上画出一系列的帧来造成运动的感觉。 Java 动画的实现:
Java 不仅提供了对图形、图像的支持,还允许用户实现连续的图像播放,即动画技术。首先用Java.awt 包中的 Graphics 类的drawImage()方法在屏幕上画出图像,然后通过定义一个线程,让该线程睡眠一段时间,然后再切换成另外一幅图像;如此循环,在屏幕上画出一系列的帧来造成运动的感觉,从而达到显示动画的目的。 为了每秒钟多次更新屏幕,必须创建一个线程来实现动画的循环,这个循环要跟踪当前帧并响应周期性的屏幕更新要求;实现线程的方法有两种,可以创建一个类Thread 的派生类,或附和在一个Runnable 的界面上。
49
3.2 用java设计动画 屏幕闪烁现象的处理: 原因:一是绘制每一帧花费的时间太长(因为重绘时要求的计算量大);二是在每次调用Paint()前,Java 会用背景颜色重画整个画面,当在进行下一帧的计算时,用户看到的是背景。 解决办法:重载 update()或使用双缓冲。 重载 update():当AWT接收到一个applet的重绘请求时,它就调用applet的 update(),默认地,update() 清除applet的背景,然后调用 paint()。重载 update(),将以前在paint()中的绘图代码包含在update()中,从而避免每次重绘时将整个区域清除。所以要消除画面闪烁就一定要改写 update() 方法,使该方法不会清除整个画面,只是消除必要的部分。 使用双缓冲技术:它在许多动画Applet中被使用。其主要原理是创建一个后台图像,将需要绘制的一帧画入图像,然后调用DrawImage()将整个图像一次画到屏幕上去;好处是大部分绘制是离屏的,将离屏图像一次绘至屏幕上比直接在屏幕上绘制要有效得多,大大提高做图的性能。双缓冲可以使动画平滑,但有一个缺点,要分配一张后台图像,如果图像相当大,这将需要很大一块内存;当你使用双缓冲技术时,应重载 update()。
50
3.2 用java设计动画 3.2.2 java实现动画的方法和实例 二维动画: 图片循环播放、多线程方法 三维动画: Java3d包的应用
51
3.2 用java设计动画 java实现二维动画的方法和实例
Java 不仅提供了对图形、图像的支持,还允许用户实现连续的图像播放,即动画技术。Java 动画的实现,首先用Java.awt 包中的 Graphics 类的drawImage()方法在屏幕上画出图像,然后通过定义一个线程,让该线程睡眠一段时间,然后再切换成另外一幅图像;如此循环,在屏幕上画出一系列的帧来造成运动的感觉,从而达到显示动画的目的。 为了每秒钟多次更新屏幕,必须创建一个线程来实现动画的循环,这个循环要跟踪当前帧并响应周期性的屏幕更新要求;实现线程的方法有两种,可以创建一个类Thread 的派生类,或附和在一个Runnable 的界面上。 例子:图片循环播放
52
3.2 用java设计动画 用Java3d包实现三维动画
Java3D用其自己定义的场景图和观察模式等技术构造了3D的上层结构,实现了在Java平台使用三维技术。 Java3D API是Sun定义的用于实现3D显示的接口。3D技术是底层的显示技术,Java3D提供了基于Java的上层接口。Java3D把OpenGL和DirectX这些底层技术包装在Java接口中。建立在JAVA2基础之上。 它实现了以下三维显示能够用到的功能: 生成简单或复杂的形体(也可以调用现有的三维形体) 使形体具有颜色、透明效果、贴图。 在三维环境中生成灯光、移动灯光。 具有行为的处理判断能力(键盘、鼠标、定时等)。 生成雾、背景、声音。 使形体变形、移动、生成三维动画。 编写非常复杂的应用程序,用于各种领域如VR(虚拟现实) J2SE在其标准开发包中并不提供Java3D的API,Java3D是一个独立的可选组件,可以单独下载。 例子:粒子系统
53
3.3 用VC++设计动画 3.3.1 用VC++设计动画原理: 关键帧动画(二维): 生成动画(三维): 显示:图形模式下,图形函数
运动:循环控制(显示—擦除—显示) 生成动画(三维): 算法 openGL
54
3.3 用VC++设计动画 3.3.2 VC++设计二维动画 结合一个图形方式的时钟程序来说明VC++中如何使用图形程序设计和动画技术。
程序运行后以图形方式显示时钟,秒针一秒一秒地转动。 该程序用到了结构型变量的指针、图形程序设计以及动画技术等一些知识。
55
3.3 用VC++设计动画 图形方式的时钟程序: # include < time.h > //时间处理函数原型及数据结构 # include < stdio.h > //标准输入/输出函数原型及数据结构 # include <dos.h > //dos所用数据结构和函数原型 # include <conio.h > //控制台输入/输出函数原型及数据结构 # include <math.h > //数学函数原型 # include <graphics.h > //图形处理函数原型及数据结构 # define PI time-t l time; //类型time-t即long struct tm * pt; //pt为指向时间结构tm的指针 void showTime (void ); //函数原型声明
56
3.3 用VC++设计动画 void main (void ) {( show Time ( ); //调用图形方式显示函数 }"
void show time ( void ) //以图形方式显示运转的时钟! { int Rs = 100; //秒针长度 int Rc =130; //时钟外圆圈半径/ double alpha =2* PI /60.0; //秒针1秒和分针1分钟所旋转的弧度数 int x,y; //时钟圆心坐标 int xSecond , ySecond ; //秒针针尖位置坐标 int driver =DETECT , mode ; //定义驱动器和模式变量并指示自动检测/
57
3.3 用VC++设计动画 //将显示器初始化为指定的图像模式: initgraph ( & driver , & mode , "c:\\BC31\\BGI\\"); x=getmaxx ( ) /2;y=getmaxy ( ) /2; //计算时钟圆心坐标 cleardevice ( ); //图像屏幕清屏 setbkcolor (WHITE ); //配置背景颜色 setlinestyle (0,1,3 ); //配置画线风格:实线,3像素宽 setcolor (LIGHTBLUE ); //配置时钟外圆圆圈的颜色 circle (x,y,Rc); //配置时钟外圆圆圈 while (!kbhit ()) //按下任一键则退出循环 { time ( & ltime ); //读取系统时间 pt=localtime ( & ltime); //转换为结构型并返回其指针 xSecond = x+Rs*cos ( pt->tm-sec*alpha-PI/2);//计算秒针针尖的位置坐标 ySecond =y+Rs*sin ( pt->tm-sec*alpha-PI/2); setcolor ( LIGHTRED ); //配置秒针的颜色 line ( x,y,xSecond,ySecond); //画秒针 delay (50); //延时50毫秒 setcolor(BLACK); //画线颜色配置为背景颜色 line(x,y, xSecond, ySecond); // 擦除秒针 } closegraph(); //关闭图像模式 }
58
3.3 用VC++设计动画 该程序中用到了系统定义的存储时间数据的结构型struct tm,它在头文件time.h中定义:
struct tm int tm - sec; /* Seconds*/ int tm - min; /*Minutes int tm - hour ; /*Hour( int tm - mday ; /*Day of month (1- -31)*/ int tm - mon ; /*Month (0- -11)*/ int tm - year ; /*Year(calendar year minus 1900)*/ int tm - wday ; /*weekday (0- -6;Sunday=0)*/ int tm - yday ; /*Day of year ( )*/ int tm - isdst ; /*0 if daylight savings time is not in effect ) */ };
59
3.3 用VC++设计动画 该程序用系统提供的time( )函数读取系统时间,并将其存入长整型变量ltime中:time(<ime)。
用系统提供的localtime()函数将长整型的时间值转换为tm结构型变量的值,并返回指向该结构型变量的指针,该指针被赋值给指针变量pt=loclatime(<ime)。 这样便于通过pt得到时间tm结构型变量中的时、分、秒的值,即pt->tm-hour、pt->tm-min、pt->tm-sec。在计算秒针针尖的位置时用了pt->tm-sec。 time()函数和localtime()函数的原型在头文件time.h中声明,因此必须用#include指令将文件time.h包含到本程序中来。
60
3.3 用VC++设计动画 3.3.2 VC++设计三维动画 OpenGL (Open Graphics Language)简介
1992年由SGI公司推出,现已经成为一个开放的、独立于应用平台的、工业标准的计算机三维图形软件开发接口。 OpenGL是个与硬件无关的软件接口,可以在不同的平台如Windows 95、Windows NT、Unix、Linux、MacOS、OS/2之间进行移植。。 OpenGL是底层的图形库,没有提供几何实体图元,不能直接用以描述场景。但是,通过一些转换程序,可以很方便地将AutoCAD、3DS/3DSMAX等3D图形设计软件制作的DXF和3DS模型文件转换成OpenGL的顶点数组。 微软虽然有自己的三维编程开发工具DirectX(包含图形, 声音, 输入, 网络等模块) ,但它也提供OpenGL(图形函数库)图形标准,所以OpenGL可以与VC++紧密接合,实现有关计算和图形算法。
61
3.3 用VC++设计动画 OpenGL提供的功能:
1、建模:OpenGL图形库除了提供基本的点、线、多边形的绘制函数外,还提供了复杂的三维物体,如球、锥、多面体、茶壶以及复杂曲线和曲面(例如Bezier、Nurbs等曲线或曲面)的绘制函数。 2、变换:OpenGL图形库的变换包括基本变换和投影变换。基本变换有平移、旋转、变比、镜像四种变换,投影变换有平行投影(又称正射投影)和透视投影两种变换。 3、颜色模式设置:OpenGL颜色模式有两种,即RGBA模式和颜色索引(Color Index)。 4、光照和材质设置:OpenGL光有辐射光(Emitted Light)、环境光(Ambient Light)、漫反射光(Diffuse Light)和镜面光(Specular Light)。材质是用光反射率来表示。客观世界中的物体最终反映到人眼的颜色是光的红绿蓝分量与材质红绿蓝分量的反射率相乘后形成的颜色。
62
3.3 用VC++设计动画 5、纹理映射(Texture Mapping):利用OpenGL纹理映射功能可以十分逼真地表达物体表面细节。
6、位图显示和图象增强:OpenGL的图象功能除了基本的拷贝和像素读写外,还提供融合(Blending)、反走样(Antialiasing)和雾(fog)的特殊图象效果处理。以上三条可是被仿真物更具真实感,增强图形显示的效果。 7、双缓存动画(Double Buffering):OpenGL使用了前台缓存和后台缓存交替显示场景(Scene)技术,简而言之,后台缓存计算场景、生成画面,前台缓存显示后台缓存已画好的画面。 8、特殊效果:利用OpenGL还能实现深度暗示(Depth Cue)、运动模糊(Motion Blur)等特殊效果。运动模糊的绘图方式(motion-blured),模拟物体运动时人眼观察所感觉的动感现象。深度域效果(depth-of-effects),类似于照相机镜头效果,模型在聚焦点处清晰,反之则模糊。 这些三维物体绘图和特殊效果处理方式,说明OpenGL能够模拟比较复杂的三维物体或自然景观
63
3.3 用VC++设计动画 OpenGL的函数库:采用C语言风格,提供大量的函数来进行图形方面的处理,一般编程使用的函数库包括:
OpenGL图形库-----函数以gl开头,可以实现比较简单的绘制功能,核心函数共115个。这些函数可以运行在现在任何主流操作系统中。 OpenGL实用库-----函数以glu开头,其函数功能更高级一些,如绘制复杂的曲线曲面、高级坐标变换、多边形分割等,共有43个。这些函数可以运行在现在任何主流操作系统中。 OpenGL辅助库-----函数以aux开头,它们是一些特殊的函数,包括简单的窗口管理、输入事件处理、某些复杂三维物体绘制等函数,共有31个。它只能在Win32平台下运行。 OpenGL实用工具开发库----函数以glut开头,它们提供更为复杂的绘制功能,此函数由glut.dll来负责解释执行。 Windows专用函数库-----以wgl开头,负责OpenGL与Windows窗口系统的连接,共有6个。 Win32函数------无专用前缀,实际上为API函数,共5个,用来处理比如象素格式的选择及双缓冲等功能。
64
3.3 用VC++设计动画 OpenGL提供的函数一般是以客户机/服务器的模式来运行的,即执行绘制图形功能的应用程序作为客户机,而OpenGL函数库(实际上是一些动态链接库,比如opengl32.dll,glu.dll等)作为服务器,当应用程序发出绘制请求时,服务器负责对这些绘制请求进行解释,然后把这些处理过的请求发送给图形显示硬件,这样就实现了绘图的目的。 另外由于它这种特有的运行机制也实现了网络的透明性,即当应用程序与核心图形库不在同一台机器上时,其程序的代码完全跟它们在同一台机器上的一样,节约了通讯开销
65
3.3 用VC++设计动画 OpenGL的基本工作流程如下图:
66
3.3 用VC++设计动画 在OpenGL中进行主要的图形操作直至在计算机屏幕上渲染绘制出三维图形景观的基本步骤: 1)根据基本图形单元建立景物模型,并且对所建立的模型进行数学描述(OpenGL中把:点、线、多边形、图像和位图都作为基本图形单元)。 2)把景物模型放在三维空间中的合适的位置,并且设置视点(viewpoint)以观察所感兴趣的景观。 3)计算模型中所有物体的色彩,其中的色彩根据应用要求来确定,同时确定光照条件、纹理粘贴方式等。 4)把景物模型的数学描述及其色彩信息转换至计算机屏幕上的象素,这个过程也就是光栅化(rasterization)。 在这些步骤的执行过程中,OpenGL可能执行其他的一些操作,例如自动消隐处理等。另外,景物光栅化之后被送入帧缓冲器之前还可以根据需要对像素数据进行操作。
67
3.3 用VC++设计动画 如何使用OpenGL图形库函数来开发应用程序
当使用GDI(图形设备接口)开发应用程序时,先需获得一个Device Context(设备描述表,简称DC),然后才能在这个DC下完成绘图工作,从Windows内部运行机制来分析,DC应该理解为状态保持器,就是它可以而且必须保存当前系统的状态,这些状态包括:当前的画笔、刷子等GDI的具体类型(颜色、粗细等),当前的调色板类型以及系统的其他信息。当用户开始在DC上进行绘制工作时,系统就会先查看DC中相应的当前状态值,然后利用这些状态值进行图形绘制,如果用户希望改变当前状态值,那么可以通过SelectObject这样的Win32函数来将指定的状态或者对象选入DC即可。 基于OpenGL的应用程序也是这样的,只是这里不是直接在DC上进行绘制工作,而是通过Render Context(渲染描述表或者绘制描述表,简称为RC)这样一个桥梁在DC上进行绘制工作,对于程序来说实际上可以理解为就是在RC上绘制图形。另外只要RC不被释放(有效),那么就可以进行绘制工作;相比之下,DC却需要不断的创建和释放。 即:先用 OpenGL 语句在 OpenGL 的绘图环境 RenderContext (渲染描述表或者绘制描述表,简称为RC )中画好图, 然后再通过一个 Swap buffer 的过程把图传给操作系统的绘图环境 DeviceContext (设备描述表,简称DC)中,最终画到屏幕上.
68
3.3 用VC++设计动画 VC下的OpenGL的程序框架
在目前众多的Windows应用程序开发工具中,微软公司的VC6.0已经成为OpenGL图形应用的首选开发工具。而要使用OpenGL图形库来开发2D/3D的应用程序,就必须解决程序框架的问题。由前面介绍的基础知识可以清楚的看到,不能直接象利用GDI开发图形程序那样使用OpenGL。 多文档应用程序情况下的开发框架,其步骤为: 首先在视图类的PreCreateWindow函数内设置窗口类型,防止在窗口重叠时把图形绘制到子窗口和兄弟窗口。实现代码如下: cs.style |=WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
69
2.然后在视图类的OnCreate函数下面进 行OpenGL的初始化工作,这部分是此框架里最主要的代码,具体包括:获取视图设备描述表、设置合适的象素格式和调色板、创建绘制描述表并将其设置为当前RC。其实现代码见后面的例程(这部分的代码基本上所有的程序都一致)。这一步完成后即可进行图形的绘制工作。 3.在视图类的OnSize函数下面进行视口变换 4.如果需要定时器的数据驱动,那么可以在视图类的OnTimer下修改数据并调用OnDraw函数即可。 5.在OnDestroy函数执行RC及DC的销毁工作,释放资源。 由上面的框架可以看出,所有的关于OpenGL的程序操作都是在指定的视图类中完成的,核心就是OnCreate内的函数代码,而这部分的代码在大部分程序里面是雷同的,所以后面例程的代码具有很大的通用性。
70
见::\VC++OPENGL编程\c03\c03_01_02\OpenGLPlat\OpenGLPlat
以基于MFC的基本OpenGL应用程序为例,介绍VC++ 上 OpenGL编程的方法。 见::\VC++OPENGL编程\c03\c03_01_02\OpenGLPlat\OpenGLPlat 程序代码详解
71
3.3 用VC++设计动画 vc 和openGL结合实现动画的实例 三维造型效果:茶壶例子(效果图 :\c03\c03_04_01)
72
几种三维技术的比较 技术 实现层次 开发技术(难度) 扩展性 最适合应用领域 Java3D 中层(JVM) Java(较易)
J2SE标准扩展 网上三维显示实现 OpenGL 底层(显卡) C\C++(难) 各大厂商支持 三维设计软件 Direct3D 底层(操作系统) C++(较难) Windows平台 三维游戏 VRML 上层(网页) 标记语言-(容易) 安装插件支持 网上虚拟现实
Similar presentations