




已阅读5页,还剩42页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10章 多媒体编程媒体(medium)为信息的载体,多媒体(multimedia)指文本、图形、图像、声音、动画、视频等人类感官所能获得的(计算机可以表示与处理的)各种外部信息。多媒体是相对于早期计算机只能处理数字和文本而言的,图形界面是多媒体的开始,普适计算是其发展方向。Windows API为程序员提供了多媒体编程的高层接口MCI (Media Control Interface 媒体控制接口),用来播放和录制各种媒体文件。但MCI一直没有封装到MFC中,不过仍然可以利用MFC框架来编写使用MCI的多媒体程序。关于文本、图形和图像的编程已经在第3章中讲过了,本章只介绍声音、动画、视频等媒体的编程问题。在将MCI编程之前,先介绍几种非MCI高层音频播放函数。10.1 播放波形音频文件波形音频文件格式(Waveform Audio File Format )(*.WAV)是Microsoft为Windows设计的多媒体文件格式RIFF(Resource Interchange File Format,资源交换文件格式)中的一种(另一种常用的为AVI)。其特点是一般不支持压缩,所以文件大,常用于小型的系统音频数据的存储,也用于临时音频文件(似图像格式中的BMP)。本节先介绍一下音频及其数字化的基本概念,然后讲Windows中只可用来播放音频文件的几种高层函数,包括只能播放系统声音的MessageBeep、Win16中就有的可以播放波形文件的老函数sndPlaySound及Win32引进的功能强大的播放波形文件的新函数PlaySound。而MCI中的声音播放将在下节介绍。多媒体应用程序高层音频函数MCI设备驱动程序低层音频函数MIDI映射器低层音频驱动程序应用程序层高层音频服务低层音频服务Windows音频服务的层次关系1音频声音(sound)是一种由机械振动引起可在物理介质(气体、液体或固体)中传播的纵向压力波(纵波或疏密波),声波可用振幅和频率这两个基本物理量来描述。音频(audio)指人耳能听见的声音可听声,频率范围约为20Hz20kHz。原始的音频信号是连续的,为了计算机能处理,需要把它离散化,方法是采样与量化。根据奈奎斯特(Nyquist)采样定理,只要采样频率不低于声音信号最高频率的两倍,就能把数字化的声音无失真地还原成原来的模拟声音。量化是指将声波的振幅离散化,一般用二进制整数表示。常用的采样频率有8kHz(语音)、11.025kHz、22.05kHz、44.1kHz(CD音质)和48 kHz等。常用的量化精度为8bit、12 bit、16bit、20bit和24bit等。声音除了采样频率和量化精度这两个指标外,还有声道数,常见的有:单声道(如语音)、双声道(立体声,如CD)、5.1/6.1/7.1声道(环绕立体声,如DVD)。2用MessageBeep播放WAV文件函数原型为:BOOL MessageBeep( UINT uType / sound type);该函数调用后马上返回,若成功返回TRUE,否则返回FALSE。其中,参数uType可取值见下表:MessageBeep播放的声音类型uType值声音0xFFFFFFFF(= -1)用计算机喇叭发出标准嘟声MB_ICONASTERISK系统星号MB_ICONEXCLAMATION系统感叹号MB_ICONHAND系统手MB_ICONQUESTION系统问号 MB_OK系统缺省这些系统事件的声音,可用控制面板中声音与音频设备程序来设置和指定,保存在注册表中。老版本的Windows将这些设置信息保存在文件的Sounds段中。如:SoundsSystemAsterisk=, AsteriskSystemExclamation=, ExclamationSystemHand=, Critical StopSystemQuestion=, QuestionSystemDefault=, Default BeepSystemStart=, Windows StartSystemExit=c:windows/, Windows Exit若系统没有安装音频设备,则会使用计算机本身的喇叭来发声;否则,会调用声卡来播放对应的波形文件。可以用waveOutGetNumDevs函数来判断系统是否安装了音频设备,其原型为:UINT waveOutGetNumDevs(VOID); / 返回系统中安装的音频设备数如if (waveOutGetNumDevs() = 0) MessageBox(“No audio device!”, “Error” ); return;3用sndPlaySound播放WAV文件函数原型为:BOOL sndPlaySound( LPCSTR lpszSound, UINT fuSound );其中,lpszSound可为注册系统声音的表项,也可为盘中的波形文件,为NULL则停止播放正在播放的任何声音。fuSound为标志参数(无符号整数),可取如下列值的或:sndPlaySound函数中的fuSound参数fuSound值对应数值含义SND_ASYNC0x01异步播放,调用后立即返回(最常用)SND_LOOP0x08循环播放,必须与SND_ASYNC标志同用SND_MEMORY0x04lpszSound指向内存中波形声音映像(可以动态生产声音)SND_NODEFAULT0x02找不到指定声音时,不播放缺省的声音SND_NOSTOP0x10如果有声音正在播放,则不播放指定的声音而直接返回SND_SYNC0x00同步播放,直到声音播完后调用才返回(缺省值)为了结束异步或循环播放,可以用lpszSound=NULL来调用sndPlaySound函数。如:sndPlaySound(SystemAsterisk, SND_ASYNC);sndPlaySound(strWaveFile, SND_LOOP | SND_ASYNC);sndPlaySound(NULL, 0);又如:void CMTestDlg:OnSndplayPlay() char filters = 波形音频文件(*.wav)|*.wav|所有文件(*.*)|*.*|;CFileDialog fDlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, filters);if (al() = IDOK) CString strWavFile = thName();UINT flags = 0;if (IsDlgButtonChecked(IDC_SNDPLAY_ASYNC) flags |= SND_ASYNC;if (IsDlgButtonChecked(IDC_SNDPLAY_LOOP) flags |= SND_LOOP;if (IsDlgButtonChecked(IDC_SNDPLAY_NOSTOP) flags |= SND_NOSTOP;sndPlaySound(strWavFile, flags);void CMTestDlg:OnSndplayStop() sndPlaySound(NULL, 0);注意:对波形文件,系统先在当前目录中查找,若没有,再到标准的搜索路径中去查找。若没有找到指定的系统声音或波形文件,则播放系统缺省声音;若没有定义系统缺省声音,则不播放任何声音并返回FALSE。另外,为了使包含sndPlaySound、PlaySound或MCI函数的程序能够编译通过,必须包含多媒体头文件:#include 并在项目中添加多媒体库:选Project/Settings菜单,在弹出的Project Settings对话框中选Link页,在中间的Object/Library Modulas域中添加。4用PlaySound播放WAV文件sndPlaySound是为了与Win16兼容而保留的老函数,而PlaySound是Win32引进的新函数,它的功能更强大,sndPlaySound只不过是它的子集。其函数原型为:BOOL PlaySound( LPCSTR pszSound, HMODULE hmod, DWORD fdwSound);其中参数l pszSound的含义与fdwSound的设置有关。n 若fdwSound标志设置为SND_ALIAS、SND_FILENAME或SND_RESOURCE,则pszSound为系统事件的别名、文件名或资源IDn 若fdwSound标志没有设置这些值,则先在注册表或中寻找串为pszSound的声音,若没有,则视其为文件名n 若pszSound=NULL,则停止播放正在播放的任何声音(同sndPlaySound)。若要停止非波形格式的声音,必须设置fdwSound的标志SND_PURGEl hmodn 若设置了fdwSound的标志SND_RESOURCE,则hmod为包含pszSound所指定资源的可执行文件的句柄n 若没有设置fdwSound的标志SND_RESOURCE,则hmod必须为NULLl fdwSound似sndPlaySound的fuSound为标志参数,它除了可取fuSound可取的6个值外,还可以取下列值:PlaySound函数中的fdwSound参数的部分值fdwSound值对应数值含义SND_NOWAIT0x002000若设备忙,则不等待(不播放声音,立即返回)SND_ ALIAS0x010000pszSound为注册项的别名SND_ ALIAS_ID0x110000别名是一个预定义的IDSND_ FILENAME0x020000pszSound为文件名SND_ RESOURCE0x040004pszSound为资源名或原子(atom)SND_ PURGE0x40清除任务的非静止事件SND_ APPLICATION0x80使用应用程序指定关联程序来播放声音例如:PlaySound(“c:sounds”, NULL, SND_ASYNC);若定义了波形资源:IDR_SAMPLE WAVE “res”则可用下面的语句来播放:PlaySound(MAKEINTRESOURCE(IDR_SAMPLE), AfxGetInstanceHandle(), SND_ RESOURCE);也可以用PlaySound来播放系统声音,如PlaySound(“SystemHand”, NULL, SND_ASYNC);10.2 MCI编程1概述1)功能MCI(Media Control Interface媒体控制接口)是Windows中控制多媒体设备的高层命令接口,用于事件协调及与MCI设备驱动程序的通信。2)特点设备独立性是MCI的主要特点,MCI提供与设备无关的虚拟接口:多媒体应用程序MCI命令MCI设备驱动程序多媒体设备3)核心MCI的核心是MCI的设备驱动程序,它用于解释和执行MCI的命令,可分成如下三类:l 直接控制媒体设备硬件,如CD音乐、影碟机l 间接控制目标设备,通过低层MAPI间接控制,如MIDI、WAVl 提供DLL高层接口,如AVI/MPEG影片播放器4)MCI设备MCI设备可分为如下两种类型:l 简单设备不需要提供数据文件,如CD音乐、激光视盘机l 复合设备需要提供数据文件,如MIDI音序器(.MID)、波形音频设备(.WAV)、影片播放器(.AVI/.MPG)每类MCI设备都有对应的命令集,但也有若干同类MCI驱动程序共用同一命令集,为了区分不同的驱动程序,MCI引入设备名:(按字母序排列)l animation动画播放设备l cdaudioCD音乐播放设备l dat数字音频磁带机(DAT = Digital Audio Tape数字录音带)l digitalvideo数字视频(不基于GUI)l mmmovie多媒体影片播放设备l other未定义的MCI设备(扩展用)l overlay窗口中的模拟视频接口(基于GUI)l scanner图像扫描仪l sequencerMIDI音序器l vcr盒式磁带录像机(VCR = Video Cassette Recorder)l videodisc影碟机l waveaudio波形音频设备这些设备名所对应的设备驱动程序在注册表或老版本Windows的中定义,如:mcicdaudio=waveaudio=sequencer=mmmovie=2接口、函数与命令1)接口应用程序通过向MCI设备发送命令来控制它,这种命令有两种接口方式:(功能等价)l 命令串方式用近似英语的句法与MCI设备通信,直观、面向用户。是一种文本形式的接口,常用于VB等可视化编程平台和ToolBook等多媒体著作工具。如mciExcute(“play cdaudio from 2 to 5”);l 命令消息方式利用消息和数据结构与MCI设备通信,快速、面向程序员。常用于C/C+语言的应用程序,以直接控制多媒体设备。如:MCI_PLAY_PARMS playParms;m = MCI_MAKE_TMSF(2, 0, 0, 0); = MCI_MAKE_TMSF(6, 0, 0, 0);mciSendCommand(wDevID, MCI_PLAY, MCI_FROM | MCI_TO, (DWORD)(LPVOID)&playParms); 2)函数MCI函数中,有些只适用于一种接口方式,有些则两种接口都可以用。(1) 命令串方式只适用于命令串接口方式的有下列2个函数:(命令串中不区分大小写)l mciSendString(发送命令串),函数原型为:MCIERROR mciSendString( / 出错返回非零值(错误代码)/ 可用mciGetErrorString获得错误的文本描述 LPCTSTR lpszCommand, / 指向以null结尾的命令字符串:“命令 设备 参数” LPTSTR lpszReturnString,/ 指向接收返回信息的缓冲区,为NULL时不返回信息 UINT cchReturn, / 上述缓冲区的大小 HANDLE hwndCallback / 在命令串中含notify时,它指定一个回调窗口的句柄/ 一般为NULL);如:mciSendString(“open type waveaudio alias wave”, NULL, 0, NULL);l mciExcute(执行)是mciSendString的简化形式:BOOL mciExcute(LPCTSTR lpszCommand); / 成功返回TRUE该函数只有Win16支持,Win32不支持,可自写一函数实现:BOOL mciExcute(LPCTSTR lpszCommand) if (mciSendString(lpszCommand, NULL, 0, NULL) return FALSE;return TRUE;如:mciExcute(“open type waveaudio alias wave”);(2) 命令消息方式只适用于命令消息接口方式的只有一个函数:l mciSendCommand(发送命令),函数原型为:MCIERROR mciSendCommand( / 出错返回非零值(低字错误代码,高字驱动程序ID) / 也可用mciGetErrorString获得错误的文本描述 MCIDEVICEID IDDevice, / 接收命令消息的MCI设备ID/ 对MCI_OPEN消息为NULL UINT uMsg, / 命令消息 DWORD fdwCommand, / 命令消息的附加标志 DWORD dwParam / 命令消息参数的结构指针(可统一函数形式));如:MCI_OPEN_PARMS openParms;DeviceType = “waveaudio”;ElementName = “”;Alias = “wave”;mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT | MCI_OPEN_ALIAS, (DWORD)(LPVOID)&playParms);MCIDEVICEID wDevID = ceID;(3) 两种接口方式两种接口方式都支持的函数有五个:l mciGetErrorString(获得出错文本串)BOOL mciGetErrorString( / 成功返回TRUE DWORD fdwError, / 由mciSendString或mciSendCommand返回的错误代码 LPTSTR lpszErrorText, / 指向接收返回错误信息的文本缓冲区 UINT cchErrorText / 上述缓冲区的长度 );如:MCIERROR err = mciSendString(“open type waveaudio alias wave”, NULL, 0, NULL);if (err) char errStr256;if (mciGetErrorString(err, errStr, 256) MessageBox(errStr, “Error”);l mciGetDeviceID(获得设备ID),函数原型为:MCIDEVICEID mciGetDeviceID( / 出错返回非零 LPCTSTR lpszDevice / 已经打开的设备别名);如:wDevID = mciGetDeviceID(“waveaudio”); 或wDevID = mciGetDeviceID(“wave”);l mciSetYieldProc(设置等待时调用的过程)UINT mciSetYieldProc(/ 成功返回非零值 MCIDEVICEID IDDevice, / 指定设备ID YIELDPROC yp, / 等待时调用的过程 DWORD dwYieldData / 传送给过程的参数);l mciGetYieldProc(获得等待时调用的过程)YIELDPROC mciGetYieldProc( / 成功返回回调函数,失败返回NULL MCIDEVICEID IDDevice, / 被监控的MCI设备的ID LPDWORD lpdwYieldData / 指向传送给过程的参数之缓冲区,可为NULL);l mciGetCreatorTask(获取创建任务)HANDLE mciGetCreatorTask( / 成功返回创建指定设备的任务句柄,失败返回NULL MCIDEVICEID IDDevice / 已经打开的设备ID);其中,后三个函数少用。3)命令MCI的命令很多,可以分为如下四类:l 系统命令直接由MCI系统解释和处理,不传送到MCI设备。如break或MCI_BREAKl 通用命令所有MCI设备都支持的命令。如open或MCI_OPENl 可选命令MCI设备可选择使用的命令。如play或MCI_PLAYl 专用命令为某类MCI设备集专有。如list或MCI_LIST(DV/VCR)前三类中部分命令参见下表(字母序):MCI的命令类型消息串说明系统MCI_BREAKbreak为指定MCI设备设置终止键MCI_SOUNDsound播放Windows指定的系统声音MCI_SYSINFOsysinfo返回有关MCI设备的信息通用MCI_CLOSEclose关闭MCI设备MCI_GETDEVCAPSgetdevcaps获得MCI设备的性能参数MCI_INFOinfo获得MCI设备的有关信息MCI_OPENopen打开(初始化)MCI设备MCI_STATUSstatus返回MCI设备的状态信息可选MCI_LOADload从文件中加载数据MCI_PAUSEpause暂停播放/记录MCI_PLAYplay开始播放数据MCI_RECORDrecord开始记录数据MCI_RESUMEresume重新开始播放/记录MCI_SAVEsave保存数据到文件MCI_SEEKseek改变当前位置MCI_SETset改变控制设置MCI_STOPstop停止播放/记录标志MCI_WAITwaitMCI命令执行完后才返回MCI_NOTIFYnotifyMCI命令执行完后向应用程序发送MM_MCINOTIFY消息注:接收MM_MCINOTIFY消息的窗口句柄由mciSendString的最后一个输入参数指定,或由mciSendCommand的最后一个输入参数结构的第一个域指定。4)附加标志与参数结构复杂的命令一般都有附加标志,并需要设置相应数据结构。如打开命令MCI_OPEN消息的附加标志有:(可以位或|)打开命令的部分附加标志标志含义(在MCI_OPEN_PARMS结构的)MCI_OPEN_ALIASlpstrAlias域指定了别名MCI_OPEN_ELEMENTlpstrElementName域指定了元素(文件)名MCI_OPEN_SHAREABLE按共享方式打开MCI设备MCI_OPEN_TYPElpstrDeviceType域指定了设备类型MCI_OPEN_TYPE_IDwDeviceID域指定了设备类型的ID其中,结构MCI_OPEN_PARMS的定义为:typedef struct DWORD dwCallback; MCIDEVICEID wDeviceID; LPCSTR lpstrDeviceType; LPCSTR lpstrElementName; LPCSTR lpstrAlias; MCI_OPEN_PARMS;3编程下面以播放CD音乐与波形音频文件为例,介绍简单与复杂MCI设备的多媒体编程。1)准备正如在5.1的3.中所讲,为了使用MCI编程,必须包含多媒体头文件:#include 并在项目中添加多媒体库:选Project/Settings菜单,在弹出的Project Settings对话框中选Link页,在中间的Object/Library Modulas域中添加。2)命令串(1) CDchar buf256;MCIERROR err = mciSendString(“open cdaudio alias cd”, NULL, 0, NULL);if (err) if (mciGetErrorString(err, buf, 256) MessageBox(buf, “Error”);return;mciSendString(“status cd number of tracks”, buf, 256, NULL);m_nTracks = atoi(buf);sprintf(buf, “play cd from %d to %d”, m_nFrom, m_nTo);mciSendString(buf, NULL, 0, NULL);其他常用命令:mciSendString(set cd time format tmsf, NULL,0,NULL); / 设置时间格式为/ 道(100):分(100):秒(60):帧(strFilePath);MCIERROR err = mciSendString(strCmd, NULL, 0, NULL);if (err) if (mciGetErrorString(err, buf, 256) MessageBox(buf, “Error”);return;DWORD start = (DWORD)(t1 * 1000 + 0.5), end = (DWORD)(t2 * 1000 + 0.5);wsprintf(buf, play sound from %ld to %ld, start, end);mciSendString(buf, NULL, 0, NULL);其他常用命令:/mciSendString(“status sound length of ?”, buf, 256, NULL);mciSendString(pause sound,NULL,0,NULL);mciSendString(resume sound,NULL,0,NULL);mciSendString(stop cd,NULL,0,NULL);mciSendString(close sound,NULL,0,NULL);3)命令消息(1) CD/ 打开CDchar buf256;MCI_OPEN_PARMS openParms;DeviceType = “cdaudio”;Alias = “cd”;MCIERROR err = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ALIAS, (DWORD)(LPVOID)&playParms);if (err) if (mciGetErrorString(err, buf, 256) MessageBox(buf, “Error”);return;MCIDEVICEID wDevID = ceID;/ 设置时间格式MCI_SET_PARMS setParms;eFormat = MCI_FORMAT_TMSF;mciSendCommand(wDevID, MCI_SET, MCI_SET_TIME_FORMAT, (DWORD)(LPVOID)&setParms);/ 播放CDMCI_PLAY_PARMS playParms;m = MCI_MAKE_TMSF(m_nFrom, 0, 0, 0); = MCI_MAKE_TMSF(m_nTo, 0, 0, 0);mciSendCommand(wDevID, MCI_PLAY, MCI_FROM | MCI_TO, (DWORD)(LPVOID)&playParms); 其中,设置结构MCI_SET_PARMS的定义为:typedef struct DWORD dwCallback; DWORD dwTimeFormat; DWORD dwAudio; MCI_SET_PARMS;其中,播放结构MCI_PLAY_PARMS的定义为:typedef struct DWORD dwCallback; DWORD dwFrom; DWORD dwTo; MCI_PLAY_PARMS;(2) WAV/ 打开char buf256;MCI_OPEN_PARMS openParms;DeviceType = “waveaudio”;ElementName = “”;Alias = “wave”;MCIERROR err = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT | MCI_OPEN_ALIAS, (DWORD)(LPVOID)&playParms);if (err) if (mciGetErrorString(err, buf, 256) MessageBox(buf, “Error”);return;MCIDEVICEID wDevID = ceID;/ 播放mciSendCommand(wDevID, MCI_PLAY, NULL, NULL);10.3 动画动画是利用人的视觉滞留原理(persistence of vision,25ms400ms) 动态生成系列相关画面以产生运动视觉的技术。电影:16/24/30帧/秒、电视:25/30帧/秒、动画:1030帧/秒动画与电影的发展:1820年动画、1892年电影、1906年动画片、1963年计算机动画、1991年/1993年终结者II/侏罗纪公园均获奥斯卡最佳视觉特效奖分类:二维动画/三维动画、矢量动画/位图动画。如Flash为二维矢量动画,GIF动画为二维位图动画,OpenGL为三维矢量动画。传统动画的制作过程:剧本故事板设计稿声音节拍关键帧中间画测试描线上墨上色检查拍摄后期制作三维计算机动画的制作过程:设计剧本和人物、三维建模造型、设置材质和纹理、设计动作规则与运动轨迹、设置灯光与摄影机位置、渲染(消隐/真实感着色)、演播。本节先讲解二维位图动画的具体编程,再对OpenGL作一个简单介绍。1位图动画所谓位图动画就是先制作好一系列表示连续画面的位图,然后按一定的时间间隔一幅接一幅地显示这些位图,就可以产生动画效果。因为制作位图需要美术与动画知识,我们这里不讲,而只介绍如何显示位图以产生动画效果。里面需要用到计时器(Timer)操作。为了讲解位图动画的编程细节,我们建立一个对话框界面的应用程序MTest。1)准备位图我将原来用于Java动画的系列公爵(Duke)GIF文件用Windows的画图软件转化成BMP文件T1.BMP ,存放在项目的Duke子目录中。2)加入位图资源用VC的资源编辑器依次加入位图文件:在左边的项目工作区中选ResourceView页,在任一表项上单击鼠标右键,在弹出的菜单中选Import.项,在打开的Import Resource对话框中的文件类型下拉式列表框中选所有文件 (*.*),然后定位Duke目录,选中Ti.BMP后按Import钮,则会自动加入ID为IDB_BITMAPi的位图资源。为了以后编程方便,必须从T1.BMP到顺序依次加入。为了确认,可打开头文件Resource.h查看,若其中的常量IDB_BITMAPi的定义数值不连续,可作一些修改使其连续,如:#define IDB_BITMAP1 131#define IDB_BITMAP2 132#define IDB_BITMAP3 133#define IDB_BITMAP4 134#define IDB_BITMAP5 135#define IDB_BITMAP6 136#define IDB_BITMAP7 137#define IDB_BITMAP8 138#define IDB_BITMAP9 139#define IDB_BITMAP10 1403)装入与删除位图在对话框类的定义中添加位图指针数组和BITMAP结构变量:CBitmap *m_pBmp10;BITMAP bs;在OnInitDialog函数中创建位图对象并装入位图资源,然后获取位图结构(其中的位图宽和高用于BitBlt函数):BOOL CMTestDlg:OnInitDialog() CDialog:OnInitDialog();. .for (int i = 0; i LoadBitmap(IDB_BITMAP1 + i);m_pBmp0-GetBitmap(&bs);return TRUE; / return TRUE unless you set the focus to a control其中,m_pBmpi-LoadBitmap(IDB_BITMAP1 + i);中的IDB_BITMAP1 + i利用了位图资源ID的连续性。为了避免内存泄漏,需要为对话框类添加析构函数,并在该函数中删除位图对象:CMTestDlg:CMTestDlg() for (int i = 0; i GetDC();CDC dc;dc.CreateCompatibleDC(pDC);dc.SelectObject(m_Bmpm_nCurFrame);pDC-BitBlt(0, 0, bs.bmWidth, bs.bmHeight, &dc, 0, 0, SRCCOPY);m_nCurFrame+;m_nCurFrame %= 10;CDialog:OnTimer(nIDEvent);其中,l CDC *pDC = GetDlgItem(IDC_ANI)-GetDC();获得图片控件的DCl dc.SelectObject(m_Bmpm_nCurFrame);选入当前序号的位图l m_nCurFrame+;设置下一个要显示的位图序号l m_nCurFrame %= 10; 循环显示,可防止序号超过位图数组的范围其余语句参见第3章位图显示部分。2OpenGL简介OpenGL(Open Graphics Library开放图形库)是图形硬件的软件接口之国际标准,可用来开发交互式三维图形应用程序,它源于SGI公司的GL(Graphics Library)。它适用于所有计算机平台,包括Windows、MacOS、Unix和Linux。OpenGL标准由1992年成立的独立协会OpenGL ARB (The OpenGL Architecture Review Board)负责管理,该协会现在的投票成员有(字母序):3DLabs、Apple、ATI、Dell、Evans & Sutherland、HP、IBM、Intel、Matrox、NVIDIA、SGI、Sun。1992年7月ARB批准了OpenGL的1.0版、1995年12月1.1版、1998年3月1.2版、1998年10月1.2.1版、2001年8月1.3版、2002年7月1.4版。参见。VC 6.0与VC.Net所带的皆为OpenGL 1.1版。 VC从2.0起支持OpenGL编程,Windows从WinNT/Win97起将OpenGL作为标准设备加以支持。1)工作过程(1) 工作步骤OpenGL工作过程的主要步骤有:l 构造几何要素(点、线、多边形、图像、位图),创建对象的数学描述l 在三维空间中放置对象,选择观察点l 计算对象的颜色(直接计算或由光照与纹理间接给出)l 光栅化将对象的数学描述和颜色信息转换成屏幕像素(可能执行消隐和对像素的操作)(2) 操作种类OpenGL的操作种类有:l 几何操作n 针对每个顶点的操作模型取景矩形变换、纹理坐标变换、传递到几何要素装配n 几何要素装配随着几何要素的类型而不同,有明暗处理、平面剪裁、剔除检验,最后根据点图案、线宽、点尺寸等生成像素段,并给其赋上颜色和深度值l 像素操作n 将主机读入的像素经放大、偏置和映射处理后写入纹理内存,可在纹理映射中使用或光栅化成像素段n 对从帧缓存读入的像素数据,执行像素传输操作(放大、偏置、映射、调整)后,以适当的格式压缩并返回给主存n 像素拷贝操作 = (解)压缩 + 传输操作l 像素段操作纹理化产生纹素、雾效果计算、反走样处理、剪裁处理、检验、模板检验、深度缓冲区检验、抖动处理、逻辑操作/混合操作、颜色屏蔽/指数屏蔽OpenGL的模块与操作顺序2)相关库类型库文件头文件库函数名前缀功能标准核心库gl/gl.hgl提供最基本的绘图函数工具库gl/glu.hglu设置观察角度和投影矩阵、处理纹理图像、进行坐标变换、镶嵌多边形、绘制曲面、出错处理扩展Windowswingdi.hwgl将OpenGL与Windows的窗口系统联系
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 执业药师考试药事管理与法规历年真题章节模拟试题及答案
- 药店处方审核员岗位培训考核试题(附答案)
- 2025年民航法规考试题目及答案
- 校园安全教育培训表
- 2025年智慧矿山智能矿山生产管理系统开发可行性研究报告
- 校园安全教育事例
- 税法安全教育进校园
- 五氧化二钒生产项目工程方案
- 水库信息化管理系统建设方案
- 水电站工程档案管理工作方案
- 化肥欠款协议模板
- “对校园欺凌说不”主题班会课件
- PLC电气控制设计污水处理系统样本
- 青春筑梦强国有我
- 班组质量管理和现场管理培训
- 新一代5G网络-全网部署与优化
- 导学案:化学合成材料
- 高中通用技术作品设计方案七篇
- MT-T 1199-2023 煤矿用防爆柴油机无轨胶轮运输车辆通用安全技术条件
- Linux系统基础操作培训文档
- 石油化工工艺装置蒸汽管道配管的设计
评论
0/150
提交评论