




已阅读5页,还剩85页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章动画 动画 animation 是运动的艺术 运动是动画的本质 本章先介绍动画的基本原理与发展历史 然后讲解传统与计算机动画的基本内容重点放在动画的制作上 主要介绍位图动画编程和OpenGL编程5 1概述5 2传统动画5 3计算机动画5 4动画制作 5 1概述 一 视觉滞留原理电影 电视与动画都是利用人的视觉滞留 persistenceofvision 现象的原理来工作的所谓视觉滞留原理是指 由于光信号传入大脑需要一定的时间 在光的作用结束后 视觉并不会立即消失 而是保留25 200ms 即1 40 1 5秒 相当于40 5帧 秒 因此 如果快速播放一系列相关的离散画面 就会使人产生连续的运动视觉 幻觉 电影 老片 16帧 秒 普通 24帧 秒 数字 30帧 秒电视 PAL 25帧 秒 NTSC 30帧 秒动画 10 30帧 秒虽然动画与电影电视的工作原理相同 但电影和电视主要是用摄影机和摄像机拍摄出来的真实画面 而动画则是人画出来的虚假画面 二 动画的发展简史 1820年英J Paris 圆盘两面画的旋转设备thaumatrope1831年法J Plaleau 转盘狭缝phenakistoscope1834年英W Horner 转笼zoetrope 西洋镜 1839年法 照相术 银版摄影术 1884年P Nipkow 电视 罗盘旋转扫描器 1891年美T Edison 爱迪生 活动电影视镜 1895年法L A Lumiere兄弟 电影放映机 1906年美J Blackton 第一部动画片 滑稽的面孔1928年美W Disney 迪斯尼 第一部商用动画片 1937年英国开始黑白电视广播 1963年Bell实验室 第一部计算机动画1974年P Foldes 动画片 饥饿 在戛纳电影节上获奖1991 1993年 终结者II 侏罗纪公园均获奥斯卡最佳视觉特效奖 5 2传统动画 动画 animation生气活泼 热情兴奋简单定义 动画是动态生成系列相关画面以产生运动视觉的技术复杂定义 动画是一门通过在连续多格的胶片上拍摄的一系列单个画面 并以一定的速度放映 从而产生运动视觉的技术修改 画面纪录 胶片上 磁盘 磁带 光盘等存储介质放映设备 银幕 电视 显示器 投影仪等运动对象 实体运动 颜色 纹理 灯光等的改变动画片 animation cartoon 卡通片 报刊上的政治性 漫画 制作过程 剧本 故事板 设计稿 难 包括人物 造型 动作 色彩 气氛等 声音节拍 与电影后期配音不同 关键帧 难 中间画 测试 铅笔稿 描线上墨 上色 检查 拍摄 后期制作 包括 编辑 剪接 对白 配音 字幕等 名词术语 格 一个画面 动画片的最小单位 十分钟的动画 24帧 秒 需14 400格幅 每个画面通常由若干张 透 明片叠合而成 每张 明片 为一个对象 的某一部分 称之为幅关键帧 动作的极限 主要 转折 位置 通常由老师傅来画小原画 两个关键帧之间的若干小关键帧 由小画师画中间画 两个关键帧之间的若干过渡 由画工画 5 3计算机动画 计算机动画 computeranimation定义 用计算机生成一系列可供实时演播的连续画面之技术分级 图形编辑 叠加 着色 特技 中间画生成 变形 活动对象操纵 位置 属性 算法 运动 角色定义 语义级 术语规定 智能动画 故事动画 中科院陆汝钤 可学习和扩充 应用领域 游戏 电影 电视 广告 模拟器 飞行 教育 MCAI 科研 可视化 计算机动画分类 可以依据不同特征来给计算机动画分类 如作用计算机辅助动画 传统二维动画的补充 利用计算机辅助工作 如填色 叠加 生成中间画 制作特效等 如动画片花木兰和二维游戏模型动画 三维造型 动作设计 场景渲染等 如动画片玩具总动员和三维游戏等级低级 需人工显示规定每个物体和人物的位置 属性 各种运动参数 如现有动画系统和软件高级 可用通用术语来规定运动 智能化 正在研制开发 时间逐帧动画 先生成后播放 对硬件性能要求不高 如早期的动画系统和软件实时动画 边生成边播放 对硬件性能要求较高 如早期的SGI工作站和现在普通的PC机 电子游戏控制关键帧动画 简单运动学算法动画 复杂运动学 部分动力学物理动画 自动控制 动力学 落体 流体 变形 爆炸 随机 分形维数2D 简单 平面美术设计 如Flash3D 复杂 三维造型 动作设计 透视 消隐 光照 材质 场景渲染等 如3DS 生成矢量 采用图形学的方法生成动画 记录的是图形的各种参数 在演播时 可以实时渲染 也可以先渲染好 称为位图系列 后再播放 如Flash和3DS位图 动画以位图形式出现 可以是矢量动画渲染后的结果 如GIF动画 fli avi mov分辨率低 320 240 VCR VCD级 中 1K 1K 16mm胶片 DVD级 高 2K 2K 35mm胶片级 超 4K 4K 70mm胶片级 计算机动画技术 1 技术基础 计算机图形学 数字图像处理 三维几何造型 真实感图形 物理造型 人体动画等等2 相关学科 美术 绘画 力学 人体运动学 机器人学 生物学 生理学 心理学 人工智能 计算机科学等等3 研究内容 形体造型 运动控制与描述 图形绘制 动态模拟 集成环境 关节 人体运动 动画语言系统 硬件接口 特技 4 三维图形学 是三维造型 三维动画和虚拟现实的基础和核心三维造型 物体表面 简单物体 自然物体 人体真实感图形 透视 消隐 材质 纹理 光照 渲染5 3D标准 三维图形和动画及虚拟现实系统的国际和事实标准有 开放图形库 OpenGL OpenGraphicsLibrary 直接三维 Direct3D MicrosoftDirectX的组成部分 爪哇三维 Java3D Sun公司Java语言的组成部分 虚拟现实建模语言 VRML VirtualRealityModelingLanguage 用于Web 可扩展三维 X3D eXtensible3D VRML的发展 基于XML 5 4动画制作 一 用户级制作软件1 二维动画位图动画 GIF 台湾友立公司的UleadGIFAnimator5 0微软公司早期的MicrosoftGIFAnimatorLiatrosoft公司的BabarosaGifAnimator3 5AlchemyLab公司的AlchemyGIFAnimator2 7CoffeeCupSoftware公司的CoffeeCupGIFAnimator6 2矢量动画 Web 美国Macromedia公司的Web二维矢量动画软件MacromediaFlashMX6 0 2 三维动画 台湾友立公司的三维文字制作软件UleadCool3DAutodesk公司之多媒体子公司Discreet的三维造型与动画软件Discreet3dsmaxAlias Wavefront公司的三维动画软件MayaAmabilisSoftware公司的自由三维动画软件3DCanvas 二 程序员开发 1 位图动画编程1 MFC位图编程2 BMP动画3 GIF动画2 OpenGL编程1 工作过程 2 相关库 3 数据类型 4 函数命名 5 渲染函数范围 6 矩阵栈 7 渲染描述表 8 例子 9 绘制球面网格 10 改变观察位置 11 防止闪烁 12 其他 1 位图动画编程 所谓位图动画就是先制作好一系列表示连续画面的位图 然后按一定的时间间隔一幅接一幅地显示这些位图 就可以产生动画效果 因为制作位图需要美术与动画知识 我们这里不讲 而只介绍如何显示位图以产生动画效果 里面需要用到位图资源 位图传送和计时器操作 1 MFC位图编程 位图 bitmap 就是点阵图或光栅图 由像素阵列组成 即图像 1 DDB与DIB在Windows中有两种类型的位图 设备相关位图 DDB DeviceDependentBitmap 依赖于硬件的调色板 又叫GDI GraphicsDeviceInterface图形设备接口 位图设备无关位图 DIB DeviceIndependentBitmap 带有自己的颜色信息 通常存储在BMP文件中 直接由Win32支持 保存DDB位图参数的结构BITMAP typedefstructtagBITMAP bmLONGbmType 类型 必须 0LONGbmWidth 宽度 像素个数 必须 0LONGbmHeight 高度 像素个数 必须 0LONGbmWidthBytes 每条扫描线 即每行像素 的字节数 必须能被2整除 即每行字对齐 不足的位补0 WORDbmPlanes 位面数 颜色深度WORDbmBitsPixel 颜色深度LPVOIDbmBits 指向存放位图数据的字符 字节 数组的指针 BITMAP 设备无关位图DIBDIB所包含的图像信息主要有 颜色格式 分辨率 调色板和压缩标志有若干对应的结构来描述这些DIB信息 如BITMAPFILEHEADER BITMAPINFO BITMAPINFOHEADERDDBVSDIB设备相关的位图DDB用于显示 设备无关的位图DIB用于文件存储和交换 它们是同一位图资源在不同时刻和环境的表示形式 产生 DDB 存储 DIB 传输 DIB 显示 DDB 2 CBitmap类 MFC将DDB位图封装进CBitmap类 在该类中提供了对位图的操作与CPen CBrush CFont等GDI对象一样 CBitmap也是CGdiObject的派生类 CBitmap类的成员函数 构造函数 其中 构造函数CBitmap 只是简单地创建一个空的CBitmap对象 该对象必须用位图装载或创建函数来初始化其他要用到的成员函数有 BOOLCreateBitmap intnWidth intnHeight UINTnPlanes UINTnBitcount constvoid lpBits BOOLLoadBitmap UINTnIDResource intGetBitmap BITMAP pBitMap 2 装载位图资源 可以用CBitmap类的成员函数LoadBitmap来装载位图资源 BOOLLoadBitmap UINTnIDResource 其中 nIDResource为位图资源ID 如IDB LENABITMAPDISCARDABLE res lena bmp 例如 CBitmapbmp bmp LoadBitmap IDB LENA 3 显示位图 显示位图可使用CDC的成员函数BitBlt BOOLBitBlt intx inty intnWidth intnHeight CDC pSrcDC intxSrc intySrc DWORDdwRop 其中 x与y为显示图像左上角的坐标nWidth与nHeight为图像的高与宽 可用CBitmap的函数GetBitmap来获得pSrcDC为源DC 必须是兼容性DC 可用CDC的CreateCompatibleDC函数来转换 virtualBOOLCreateCompatibleDC CDC pDC xSrc与ySrc为源图像的左上角的坐标dwRop为光栅操作模式 可取值似SetROP2函数 如 SRCCOPY 覆盖 SRCAND 与 SRCINVERT 异或 例子 CBitmapbmp bmp LoadBitmap IDB LENA BITMAPbs bmp GetBitmap 4 删除位图对象 初始化并使用后的位图对象 在下次初始化之前 必须调用CBitmap基类CGdiObject的DeleteObject函数来删除 BOOLDeleteObject 注意 在删除之前 必须先将位图对象从DC中选出 选入另一个位图对象 如pDC SelectObject pOldBmp bmp DeleteObject 2 BMP动画 为了讲解位图动画的编程细节 我们建立一个对话框界面的应用程序Duke 1 加入位图资源我将原来用于Java动画的系列公爵 Duke GIF文件用Windows的画图软件转化成BMP文件T1 BMP T10 BMP 存放在项目的Duke子目录中 用VC的资源编辑器依次加入位图文件 在左边的项目工作区中选ResourceView页 在任一表项上单击鼠标右键 在弹出的菜单中选Import 项 在打开的ImportResource对话框中的文件类型下拉式列表框中选所有文件 然后定位Duke目录的Duke256子目录 选中Ti BMP后按Import钮 则会自动加入ID为IDB BITMAPi的位图资源 为了以后编程方便 必须从T1 BMP到T10 BMP顺序依次加入 也可全部选中后一次全加入 为了确认 可打开头文件Resource h查看 若其中的常量IDB BITMAPi的定义数值不连续 可作一些修改使其连续 如 defineIDB BITMAP1131 defineIDB BITMAP2132 defineIDB BITMAP3133 defineIDB BITMAP4134 defineIDB BITMAP5135 defineIDB BITMAP6136 defineIDB BITMAP7137 defineIDB BITMAP8138 defineIDB BITMAP9139 defineIDB BITMAP10140 2 装入与删除位图 在对话框类的定义中添加位图指针数组和BITMAP结构变量 CBitmap m pBmp 10 BITMAPbs 在OnInitDialog函数中创建位图对象并装入位图资源 然后获取位图结构 其中的位图宽和高用于BitBlt函数 BOOLCDukeDlg OnInitDialog CDialog OnInitDialog for inti 0 iLoadBitmap IDB BITMAP1 i m pBmp 0 GetBitmap 3 设置位图控件与启动 停止按钮 在对话框界面的应用程序中添加位图控件 打开对话框资源 在控件工具箱中选图片 Picture 工具 左上角 在对话框的适当位置添加图片控件 单击右键打开PicturePropeties对话框 设置其ID为IDC ANI 在General页中的Type域的下拉式列表框中选中Bitmap 再在Image域的下拉式列表框中选中IDB BITMAP1位图资源后回车为了控制动画的播放 需要添加一个 启动 停止动画 按钮 可设置其ID为IDC ANI STARTSTOP为了让用户选择动画的播放速度 在对话框中添加一个获取每秒帧数的编辑框 设置其ID为IDC N 4 启动 停止动画 设置 删除计时器 运行VC的MFCClassWizard 为IDC ANI STARTSTOP添加消息响应函数 voidCDukeDlg OnAniStartstop if m bStarted KillTimer 1 m bStarted FALSE else m bStarted TRUE m nCurFrame 0 m nTimesPerSecond GetDlgItemInt IDC N SetTimer 1 UINT 1000 0 m nTimesPerSecond 0 5 NULL 其中m bStarted为布尔型类变量 用于判断动画是否已经开始播放 在构造函数中初始化为FALSEm nCurFrame为整数型类变量 用于记录当前所要显示的位图序号 初始化为0SetTimer用于设置计时器 它是CWnd的成员函数 当然可在视图类和对话框类中使用 其函数原型为 UINTSetTimer UINTnIDEvent UINTnElapse void CALLBACKEXPORT lpfnTimer HWND UINT UINT DWORD nIDEvent为此计时器的编号 因为一个应用程序可以设置多个计时器 为了在响应时区分它们 必须各有一个编号 一般程序的计时器只有一个 所以取nIDEvent 1即可nElapse为间隔时间 单位为毫秒 1 1000秒 如5 30帧 秒对应于200 33毫秒lpfnTimer为应用程序提供的处理WM TIMER消息的回调函数 一般为NULL 这时WM TIMER消息由CWnd派生类的对应消息响应函数来处理KillTimer用于删除计时器 它也是CWnd的成员函数 其函数原型为 BOOLKillTimer intnIDEvent 在设置了计时器后 系统会按指定的时间间隔发送WM TIMER消息给应用程序 应用程序可在消息响应函数中作需要的处理 在我们的程序中是依次显示位图 5 绘制动画 响应计时器消息 运行VC的MFCClassWizard 为WM TIMER消息添加响应函数 voidCDukeDlg OnTimer UINTnIDEvent CDC pDC GetDlgItem IDC ANI GetDC CDCdc dc CreateCompatibleDC pDC dc SelectObject m Bmp m nCurFrame pDC BitBlt 0 0 bs bmWidth bs bmHeight 其中 CDC pDC GetDlgItem IDC ANI GetDC 获得图片控件的DCdc SelectObject m Bmp m nCurFrame 选入当前序号的位图m nCurFrame 设置下一个要显示的位图序号m nCurFrame 10 循环显示 可防止序号超过位图数组的范围其余语句参见1 3 位图显示部分 3 GIF动画 一个GIF文件中可以包含多个图像 能用于位图动画GIF文件中的图像数据块 可以有多个 每个块是一幅图像 可以带有局部调色板GIF文件中的扩展数据块中的图像控制块 可用于动画的控制 如延时参数和标志位 2 动态创建位图 为了流畅地显示GIF位图动画 显然不能用画点的方法 必须根据GIF文件中的图像数据来动态创建位图对象 这可以用CBitmap类的CreateBitmap函数来动态创建位图 BOOLCreateBitmap intnWidth intnHeight UINTnPlanes UINTnBitcount constvoid lpBits 其中 nWidth与nHeight分别为位图的宽和高 nPlanes为调色板的位面数 nBitcount为每个像素的颜色位数 nPlanes和nBitcount中至少有一个为1 lpBits为指向位图数据的指针 例18 8的单色位图 如创建一个8 8的单色位图 并用该位图创建一个图案刷 BYTEbits 8 for inti 0 iCreatePatternBrush 例2真彩位图 又如 由客户区矩形rect中的屏幕内容 创建一个真彩色位图 intw rect width h rect height COLORREF pBits newCOLORREF h w for inti 0 iGetPixel rect left j rect top i if mBmp CreateBitmap w h 1 32 pBits MessageBox Createbitmapwrong 例3256色的位图 不过一般的GIF动画都是256色的位图 若第i幅图像数据存放在第i个字节数组image i 中 则可用下列代码来动态创建其位图对象 设n为图像数目 w与h为图像的宽和高 inti BYTE image newLPBYTE n for i 0 iCreateBitmap w h 1 bitCounts image i 3 调色板 为了使动态创建的位图对象的颜色能被正确地显示 必须由每个图像的局部色表或全局色表创建调色板类CPalette的对象 并将它选入DCCPalette类的构造函数为CPalette 只是创建一个空的调色板对象 可以用其成员函数CreatePalette来生成实际的调色板 wingdi h BOOLCreatePalette LPLOGPALETTElpLogPalette 其中的参数为逻辑调色板结构 typedefstructtagLOGPALETTE lgplWORDpalVersion WORDpalNumEntries PALETTEENTRYpalPalEntry 1 LOGPALETTE其中的调色板表项结构为 typedefstructtagPALETTEENTRY peBYTEpeRed BYTEpeGreen BYTEpeBlue BYTEpeFlags 一般为NULL 0 PALETTEENTRY 例子 例如 设N为色表的表项数 LPLOGPALETTEpLogPal LPLOGPALETTE newchar 2 sizeof WORD N sizeof PALETTEENTRY pLogPal palVersion 0 x300 pLogPal palNumEntries N LPRGBQUADpRgbQuad LPRGBQUAD gColTable for inti 0 ipalPalEntry i peRed pRgbQuad rgbRed pLogPal palPalEntry i peGreen pRgbQuad rgbGreen pLogPal palPalEntry i peBlue pRgbQuad rgbBlue pLogPal palPalEntry i peFlags 0 pRgbQuad CPalette pPalette newCPallette pPalette CreatePalette pLogPal deletepLogPal 其中 结构RGBQUAD的定义为 wingdi h typedefstructtagRGBQUAD BYTErgbBlue BYTErgbGreen BYTErgbRed BYTErgbReserved RGBQUAD typedefRGBQUADFAR LPRGBQUAD 有了调色板对象后可以用CDC的SelectPalette函数将它选入DC CPalette SelectPalette CPalette pPalette BOOLbForceBackground 例如 CDCdc dc CreateCompatibleDC pDC dc SelectObject pBmp m nCurFrame pDC SelectPalette pPalette FALSE pDC BitBlt 0 0 w h 4 DIB访问函数下面这些函数没有封装到MFC中 SetDiBitsToDevice 显示DIB 不缩放 StretchDIBits 显示DIB 缩放 GetDIBits 由GDI位图来构造DIBCreateDIBitmap 由DIB构造GDI位图 2 OpenGL编程 OpenGL是图形硬件的软件接口之国际标准 可用来开发交互式三维图形应用程序 它源于SGI公司的GL GraphicsLibrary 它适用于所有计算机平台 包括Windows MacOS Unix和LinuxOpenGL标准由1992年成立的独立协会OpenGLARB TheOpenGLArchitectureReviewBoard 负责管理1992 7 1ARB批准了OpenGL的1 0版 1997 3 291 1版 1998 3 161 2版 1998 10 141 2 1版 2001 8 141 3版 2002 7 241 4版 2003 7 291 5版 2004 9 72 0版 VC6 0与VC Net所带的皆为OpenGL1 1版VC从2 0起支持OpenGL编程 Windows从WinNT Win95起将OpenGL作为标准设备加以支持 1 工作过程 1 工作步骤OpenGL工作过程的主要步骤有 构造几何要素 点 线 多边形 图像 位图 创建对象的数学描述在三维空间中放置对象 选择观察点计算对象的颜色 直接计算或由光照与纹理间接给出 光栅化 将对象的数学描述和颜色信息转换成屏幕像素 可能执行消隐和对像素的操作 2 操作种类 几何操作针对每个顶点的操作 模型取景矩形变换 纹理坐标变换 传递到几何要素装配几何要素装配 随着几何要素的类型而不同 有明暗处理 平面剪裁 剔除检验 最后根据点图案 线宽 点尺寸等生成像素段 并给其赋上颜色和深度值像素操作将主机读入的像素经放大 偏置和映射处理后写入纹理内存 可在纹理映射中使用或光栅化成像素段对从帧缓存读入的像素数据 执行像素传输操作 放大 偏置 映射 调整 后 以适当的格式压缩并返回给主存像素拷贝操作 解 压缩 传输操作像素段操作 纹理化产生纹素 雾效果计算 反走样处理 剪裁处理 检验 模板检验 深度缓冲区检验 抖动处理 逻辑操作 混合操作 颜色屏蔽 指数屏蔽 OpenGL的模块与操作顺序 2 相关库 Unix与Windows平台OpenGL库与应用程序的关系 GLU OpenGLUtilityLibraryGDU GraphicsDeviceUtilityWGL WindowsGraphicsLibrary 辅助库中的若干三维物体绘制函数 voidauxWireSphere GLdouble voidauxSolidSphere GLdouble voidauxWireCube GLdouble voidauxSolidCube GLdouble voidauxWireBox GLdouble GLdouble GLdouble voidauxSolidBox GLdouble GLdouble GLdouble voidauxWireTorus GLdouble GLdouble voidauxSolidTorus GLdouble GLdouble voidauxWireCylinder GLdouble GLdouble voidauxSolidCylinder GLdouble GLdouble voidauxWireIcosahedron GLdouble voidauxSolidIcosahedron GLdouble voidauxWireOctahedron GLdouble voidauxSolidOctahedron GLdouble voidauxWireTetrahedron GLdouble voidauxSolidTetrahedron GLdouble voidauxWireDodecahedron GLdouble voidauxSolidDodecahedron GLdouble voidauxWireCone GLdouble GLdouble voidauxSolidCone GLdouble GLdouble voidauxWireTeapot GLdouble voidauxSolidTeapot GLdouble 如何使用OpenGL库函数 想在程序中使用gl glu或aux开头的OpenGL库函数时 必须包含对应的头文件 include include include并在项目设置中添加对应的库文件 选Project Settings菜单 在弹出的ProjectSettings对话框中选Link页 在中间的Object LibraryModulas域中添加opengl32 libglu32 libglaux lib 3 数据类型 为了独立于计算机平台 OpenGL有各种自定义的基本数据类型最常用的是GLfloat HGLRC后缀用于函数与变量的命名为了使你的OpenGL程序具有可移植性 在程序中应该尽量使用这些类型 4 函数命名 OpenGL的库函数的名称一般为 库类型 功能名 参数数目 参数类型 向量符 例如 glColor3ub 核心库的颜色定义函数 参数为三个无符号字节数glVertex3fv 核心库的顶点定义函数 参数为浮点数数组 三个一组 gluLookAt 工具库的设置观察点函数 参数为9个双精度浮点数 wglMakeCurrent Windows扩展库的产生当前渲染描述表函数 两个参数 HDC和HGLRC auxInitWindow 辅助库的初始化窗口函数 5 渲染函数范围 OpenGL通过把一组操作用glBegin和glEnd括起来 似C语言的 和 来管理图形 如画一个二维的正方形 voidDrawGLSquare X Y平面中的正方形glBegin GL LINES 逆时针画边线框 画左边线glVertex3f 1 0f 1 0f 0 0f 似MoveToglVertex3f 1 0f 1 0f 0 0f 似LineTo 画下边线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 画上边线glVertex3f 1 0f 1 0f 0 0f glVertex3f 1 0f 1 0f 0 0f glEnd 6 矩阵栈 在OpenGL中使用矩阵进行渲染三维场景所需要的数据计算为简化操作 OpenGL提供一个矩阵栈 每次用栈顶的矩阵对给定的物体或场景进行渲染用glPushMatrix和glPopMatrix函数来将矩阵压栈和出栈 还可以用glScalef和glRotatef等函数对栈顶的矩阵进行缩放和旋转等修改例如 glLoadIdentity 设置当前矩阵为单位矩阵 无缩放和旋转 glColor3f 1 0f 0 0f 0 0f 设置绘图颜色为红色DrawGLSquare 画正方形 glPushMatrix glScalef 2 0f 0 5f 0 0f x方向的尺寸放大一倍 y方向的尺寸缩小一倍glColor3f 0 0f 1 0f 0 0f 设置绘图颜色为绿色DrawGLSquare 画扁矩形glPopMatrix glPushMatrix glRotatef 45 0f 0 0f 0 0f 1 0f 沿z轴旋转45度glColor3f 0 0f 0 0f 1 0f 设置绘图颜色为蓝色DrawGLSquare 画菱形glScalef 0 5f 0 5f 0 0f x方向与y方向的尺寸都缩小一半glColor3f 1 0f 1 0f 0 0f 设置绘图颜色为黄色DrawGLSquare 画小菱形glPopMatrix 正方形及其矩阵变换 7 渲染描述表 Windows应用程序使用设备描述表 DC 进行图形输出 WindowsGDI管理DC 并提供所需的各种设置与绘图函数但OpenGL却不使用标准的WindowsDC 而是使用一种渲染描述表 RC RenderingContext 与DC相似 RC也用于保存在给定窗口中渲染一个场景所需的各种绘图信息一个RC可同时供多个线程使用 但是在同一时间一个线程只能有一个RC与DC不同的是 OpenGL不需要句柄或指向RC的指针 因为只能有一个RC RC是隐含在绘图命令的调用中的 所有的OpenGL命令都由当前RC来接受和处理 DC与RC的关系 联系RC与DC 为了使OpenGL能在Windows中工作 必须有一种将RC与DC联系起来的机制 这需要使用Windows扩展库中的若干函数 如 HGLRCwglCreateContext HDC 生成RCBOOLwglDeleteContext HGLRC 删除RCBOOLwglMakeCurrent HDC HGLRC 激活RC因为OpenGL与Windows在像素格式方面不一致 所以在初始化时 必须有一个协商过程 协商的结果就是RC这一协商过程需要几个GDI函数来处理 而它们都需要一种复杂的像素格式描述符结构 typedefstructtagPIXELFORMATDESCRIPTOR pfdWORDnSize 结构大小WORDnVersion 版本DWORDdwFlags 标志BYTEiPixelType 像素类型 PFD TYPE RGBA或PFD TYPE COLORINDEXBYTEcColorBits 颜色位数BYTEcRedBits 红色位数BYTEcRedShift 红色偏移BYTEcGreenBits 绿色位数BYTEcGreenShift 绿色偏移BYTEcBlueBits 蓝色位数BYTEcBlueShift 蓝色偏移BYTEcAlphaBits 值位数BYTEcAlphaShift 值偏移 BYTEcAccumBits 光栅缓存位数BYTEcAccumRedBits 光栅缓存红色位数BYTEcAccumGreenBits 光栅缓存绿色位数BYTEcAccumBlueBits 光栅缓存蓝色位数BYTEcAccumAlphaBits 光栅缓存 值位数BYTEcDepthBits 深度缓存位数BYTEcStencilBits 图案缓存位数BYTEcAuxBuffers 辅助缓存位数BYTEiLayerType 层类型 现已不使用 BYTEbReserved 保留 设定覆盖和铺垫的位面数 DWORDdwLayerMask 层掩膜 现已不使用 DWORDdwVisibleMask 可视掩膜 透明的颜色 DWORDdwDamageMask 损伤掩膜 现已不使用 PIXELFORMATDESCRIPTOR 标志dwFlags的常用取值 PFD DRAW TO WINDOWPFD DRAW TO BITMAPPFD SUPPORT GDIPFD SUPPORT OPENGLPFD DOUBLEBUFFERPFD SWAP LAYER BUFFERS 关联RC与DC的例子 PIXELFORMATDESCRIPTORpfd sizeof PIXELFORMATDESCRIPTOR 结构大小1 版本号PFD DRAW TO WINDOW PFD SUPPORT OPENGL PFD DOUBLEBUFFER PFD TYPE RGBA 像素类型24 24b颜色0 0 0 0 0 0 颜色位数与偏移0 0 值位数与偏移0 0 0 0 0 光栅缓存位数32 32b深度缓存0 0 无图案缓存和辅助缓存0 层类型 现已不使用 0 保留0 0 0 不支持掩膜 m hDC GetDC GetSafeHdc 获取DC句柄intnPixelFormat ChoosePixelFormat m hDC 设置调用线程的当前RC为m hRC 将m hRC与m hDC关联在一起 8 例子 为了说明如何用VC开发OpenGL程序 我们看一个简单的例子 建立一个SDI的MFC项目GL在项目设置中添加对应的库文件 opengl32 libglu32 libglaux lib在视图类CGLView中包含OpenGL的头文件 include include include在视图类CGLView中定义类变量 HGLRCm hRC HDCm hDC 在视图类CGLView的PreCreateWindow函数中修改窗口的创建结构 以剪掉子窗口和兄弟窗口 这是OpenGL所要求的 BOOLCGLView PreCreateWindow CREATESTRUCT TODO AddyourspecializedcreationcodeherePIXELFORMATDESCRIPTORpfd sizeof PIXELFORMATDESCRIPTOR 1 PFD DRAW TO WINDOW PFD SUPPORT OPENGL PFD DOUBLEBUFFER PFD TYPE RGBA 24 0 0 0 0 0 0 0 0 0 0 0 0 0 32 0 0 0 0 0 0 0 m hDC GetDC GetSafeHdc intnPixelFormat ChoosePixelFormat m hDC 为了避免内存泄漏 在应用程序退出时 必须删除所创建的RC 这需要为视图类添加WM DESTROY的消息响应函数OnDestroy voidCGLView OnDestroy CView OnDestroy wglMakeCurrent NULL NULL 选出RCwglDeleteContext m hRC 删除RC 为了使RC适应用户对窗口大小的调整 必须为视图类添加WM SIZE的消息响应函数OnSize 可在此函数中重置映射和模型矩阵 重建观察窗口和视锥 voidCGLView OnSize UINTnType intcx intcy CView OnSize nType cx cy glViewport 0 0 cx cy 设置视口范围 有变形 glViewport 0 0 min cx cy min cx cy 设置视口范围为cx与cy的最小值glMatrixMode GL PROJECTION 设置投影矩阵glLoadIdentity 装入单位矩阵 gluPerspective 30 1 3 3 设置透视投影矩阵 y方向30度 xy方向的纵横比为1 z方向的近远剪切平面的距离分别为1和3 glMatrixMode GL MODELVIEW 设置模型视图矩阵glLoadIdentity 装入单位矩阵 在OnDraw函数中绘制OpenGL图形 voidCGLView OnDraw CDC pDC CGLDoc pDoc GetDocument ASSERT VALID pDoc TODO adddrawcodefornativedataheregluLookAt 0 0 10 0 0 0 0 1 0 设置观察点位置DrawRects 画矩形 参见4 与5 gluLookAt 5 5 10 0 0 0 0 1 0 设置观察点位置glColor3f 1 0f 1 0f 0 0f 设置绘图颜色auxWireSphere 2 0 画球面网格 auxWireTeapot 1 8 画茶壶网格SwapBuffers m hDC 切换缓冲区 茶壶网格 球面网格 9 绘制球面网格 除了调用辅助库函数外 也可自己编写绘制球面网格的函数 include defineRAD 3 14159265358979 180 voidCGLView SphereGrids floatR intda intdb intdx intdy GLfloatx y z r inti j for i 0 i 180 i db drawhorizontallinesglBegin GL LINE LOOP r GLfloat R sin i RAD z GLfloat R cos i RAD for j 0 j 360 j dx x GLfloat r cos j RAD y GLfloat r sin j RAD glVertex3f x y z glEnd for j 0 j 360 j da drawverticallinesglBegin GL LINE LOOP for i 0 i 180 i dy r GLfloat R sin i RAD z GLfloat R cos i RAD x GLfloat r cos j RAD y GLfloat r sin j RAD glVertex3f x y
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年高压化成箔项目建议书
- 2025年甘肃省民航机场集团校园招聘45人模拟试卷附答案详解(完整版)
- Glutaraldehyde-生命科学试剂-MCE
- 2025年台州温岭市第一人民医院招聘医学卫生类高层次人才9人模拟试卷及答案详解(必刷)
- 2025年湿式静电除尘器合作协议书
- 2025河南九域龙源电力发展集团有限公司等单位高校毕业生招聘180人模拟试卷及答案详解(典优)
- 资产管理行业工艺流程与标准
- 2025国家自然资源部所属单位招聘118人(第三批)模拟试卷及答案详解(新)
- 婚内相处协议书7篇
- 财务预算编制模板全面管理指导
- 2025年宪法知识竞赛试题库(含答案)
- GB 5725-2025坠落防护安全网
- 脑出血康复期患者护理
- 2025中国银行校招笔试真题及答案
- 钢厂安全用电培训课件
- 《脑性耗盐综合症》课件
- 【绥化】2025年黑龙江省绥化市兰西县体彩中心招聘体彩专管员1人笔试历年典型考题及考点剖析附带答案详解
- 2025年AI应用AI Agent架构新范式报告
- 001 比较思想政治教育(第二版) 第一章
- GB/T 2992.1-2011耐火砖形状尺寸第1部分:通用砖
- 中医门诊消毒隔离制度
评论
0/150
提交评论