⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 专业tc--图形篇6.htm

📁 图形学的一些基础知识
💻 HTM
📖 第 1 页 / 共 3 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0034)http://tc2001.myrice.com/base7.htm -->
<HTML><HEAD><TITLE>专业TC--图形篇</TITLE>
<SCRIPT language=JavaScript><!--document.write('<SCRIPT language="JavaScript1.1" SRC="http://diyad.myrice.com/js/diyad.js">');document.write('</SCR');document.write('IPT>');//--></SCRIPT>

<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2600.0" name=GENERATOR>
<META content=FrontPage.Editor.Document name=ProgId>
<META content=none name="Microsoft Border"></HEAD>
<BODY>
<H1 style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px" align=center>&nbsp;&nbsp;&nbsp; 
<B><FONT color=#ff0000>动画技术</FONT></B></H1>
<H1 style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px" align=center><FONT 
color=#00ff00><A href="http://tc2001.myrice.com/index.htm"><FONT 
size=5><B>回首页</B></FONT></A></FONT>  <A 
href="http://tc2001.myrice.com/base6.htm"><FONT size=5>上一页</FONT></A> <A 
href="http://tc2001.myrice.com/base8.htm"><FONT color=#00ff00 
size=5>下一页</FONT></A></H1>
<P style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px"></P>
<HR>

<P>所谓动画也就使一幅图像“活”起来的过程。使用动画可以清楚的表现出一个事件的过程,或是展现一个活灵活现的画面。如今电脑动画的应用十分广泛,无论是让应用程序更加生动,增添多媒体的感官效果;还应用于游戏的开发,电视动画制作,创作吸引人的广告,电影特技制作,生产过程及科研的模拟等等。<BR>从某种极端的意义上说,产生动画的最好方法并不是编程,而是……放电影。大概你还记得童年时在课本每页右下角画上做不同连续动作的小人再快速翻阅产生的“原始动画”。我们在常识课上就知道利用人类视觉暂留的原理快速连续显示一系列静止画面可以产生动画。每秒播映24张胶片的电影和每秒显示30帧画面的电视(NTSC制)足以蒙骗我们可怜、不灵敏的眼睛。计算机动画(Computer 
Animation)也不例外,应用程序以一定的规律快速连续绘制并显示一系列有关联的静止图像就产生了电脑动画。<BR>根据计算机动画绘制和显示的原理,根据动画的交互程度我们可以将计算机动画分为非交互动画和交互动画两大类。而交互动画又可进一步被区分为非即时计算交互动画和即时计算交互动画两种。<BR>在本章里,我们将简单介绍一些动画制作的基本概念,并结合几个简单的程序来说明如何荣编程的方法来实现动画过程。<BR><BR>动画过程的实现有很多种方法,下面我们简单介绍其中的几种:<BR>子图形动画&nbsp;<BR>子图形(sprite)在交互式电子游戏中是用来表示各个角色以及不动的背景。当游戏者移动输入设备如游戏杆、跟踪球或者鼠标时,子图形就在背景上移动。玩电子游戏的游戏者实际上是在操作子图形。Uideo游戏机通常都带有图形硬件,内部支持子图形。而IBM兼容pc机内的显示硬设备并不支持子图形,所以必须依靠软件技术实现。<BR>擦除和重画技术<BR>在旧位置擦除图像并在新位置重新绘出,这显然是移动图像的一种方法,在Windows程序中,可以通过调用BitBlt函数实现这个方法,如果反复不断地擦除和重绘,图像看起来就会像是在屏幕上穿越移动。但是,这种方法的主要缺点是在擦除和重绘图像时会发生显示闪烁现象。<BR>有一个办法可以避免擦除-重绘动画时产生的闪烁现象,那就是采用视频页切换,只要显示硬设备支持一个以上的视频页。使用多个视频页,就可以在显示活动页的同时在隐藏的视频页上绘制整个屏幕以显示更新后的图形。要继续显示动画,只需用一个循环重复这一过程。许多高级图形工作站(例如, 
Silicon Graphics 工作站) 
支持通过页的切换来实现动画——用工作站界的行话来说是“缓冲区交换”技术。<BR>不巧的是,绝大多数PC显示适配器在高分辨率视频方式下并不支持多视频页。更重要的是,Microsoft 
Windows也不支持多视频页。所以必须想其他办法在Windows中创建不闪烁的动画。<BR><BR>擦除和重绘动画伴随着屏幕闪烁,其原因是屏幕绘制操作都是可见的,当图像被擦除,它就从屏幕上消失了,然后这个图像又出现在一个新的位置上。如果使用两个视频页,闪烁现象将不复存在,因为屏幕的更新是在隐藏页上完成的,视频页交换的同时就显现整个已更新的屏幕。按照这个逻辑,只要图像准备好,并且更新的屏幕能迅速重绘,就可以避免闪烁。<BR>好在Windows支持在离屏位图上绘图,这样离屏位图就可以作为准备显示屏幕的理想的“画布”,简单调用BitBlt函数,更新后的图像就会迅速地传输到显示屏幕上,当然,还得注意众多细节,以能够在离屏位图上正确地绘制图像,不过这个基本思想倒是很适用于在Windows下的图像动画。<BR><BR>调用SetBackground函数,其参数是一个指向新的被用作背景图像的DIB指针。这个调用的结果是文档拥有这个DIB,当文档被破坏或背景DIB被新的替代时,此DIB将被消除。显然,改变背景图像将涉及到一些重画操作,但稍后用户才能碰到这些问题,以下是SetBackground函数的程序代码:<BR>BOOL 
CAnimDoc::SetBackground(CDIB* pDIB)<BR>{kk1}<BR>// Delete any existing 
background DIB and set the new one.<BR>if (m_pBkgndDIB) delete 
m_pBkgndDIB;<BR>m_pBkgndDIB = pDIB;<BR><BR>// Note that the document has 
changed.<BR>SetModifiedFlag(TRUE);<BR><BR>// Tell the view that it needs to 
create a new buffer<BR>// and palette.<BR>CAnimView* pView = GetAnimView( 
);<BR>ASSERT(pView);<BR>return 
pView-&gt;NewBackground(m_pBkgndDIB);<BR>}<BR>清除现存的背景图像,并用新的背景代替。注意:传送空指针给SetBackground将导致那根本没有背景图像,然后文档也标明已发生改变。<BR>我们再来看一下CanimView::NEW 
Background函数上来,首先,添加一个装入新背景图像的菜单选项。用App Studio在File菜单中添加一个Load 
Background选项,然后在CanimDoc类中用ClassWizard为该命令建立一个处理函数。一下是处理程序代码:<BR>void 
CAnimDoc::OnFileLoadBkgnd()<BR>{kk1}<BR>// Create a DIB to hold the 
image.<BR>CDIB* pDIB = new CDIB;<BR>// Show the file open dialog for a 
DIB.<BR>if (!pDIB-&gt;Load()) {kk1}<BR>delete pDIB;<BR>return;<BR>}<BR>// Make 
sure this is an 8-bpp DIB<BR>BITMAPINFO* pBMI = 
pDIB-&gt;GetBitmapInfoAddress();<BR>ASSERT(pBMI);<BR>if 
(pBMI-&gt;bmiHeader.biBitCount != 8) {kk1}<BR>AfxMessageBox("Only 8-bpp DIBs are 
supported");<BR>delete pDIB;<BR>return;<BR>}<BR>// Replace any existing 
background DIB with the new one.<BR>if (!SetBackground(pDIB)) {kk1}<BR>delete 
pDIB;<BR>}<BR>}<BR>OnFileLoadBkgnd使用CDIB类中的新Load函数显示一个允许用户选择并装入背景图像DIB的对话框。如果成功,则SetBackground函数把新装入的DIB用作当前的背景图像。对于CDIB::Load函数,它带有一个文件名参数活不带参数,读者可以参照例程。<BR>现在已有装入新背景图像DIB的菜单选项及将该图像附给文档的程序代码。下面我们只需作两件事:<BR>传建一个新的屏幕缓冲区<BR>创建一个新的待用体调色板,把创建的屏幕缓冲区画到视图窗口的设备上下文(DC)。还可以调整父画面的大小从而使视图窗口正好适合背景图像。<BR>这里我们看一下获取视图指针后,如何调用视图的公共成员函数。以下是CAnimView::NewBackground的功能:<BR>BOOL 
CAnimView::NewBackground(CDIB* pDIB)<BR>{kk1}<BR>// Create a new buffer and 
palette.<BR>if (!Create(pDIB)) {kk1}<BR>return FALSE;<BR>}<BR><BR>// Map the 
colors of the background DIB to<BR>// the identity palette we just created for 
the background.<BR>pDIB-&gt;MapColorsToPalette(GetPalette());<BR><BR>// Resize 
the main frame window to fit the background 
image.<BR>GetParentFrame()-&gt;RecalcLayout();<BR>ResizeParentToFit(FALSE);<BR>// 
Try shrinking first.<BR>ResizeParentToFit(TRUE);&nbsp;<BR>// Let's be 
daring.<BR>// Render the entire scene to the off-screen 
buffer.<BR>Render();<BR><BR>// Paint the off-screen buffer to the 
window.<BR>Draw();<BR><BR>return 
TRUE;<BR>}<BR>重画视图<BR>将背景DIB画到缓冲区并更新屏幕到视图窗口。这时构图(Render)函数将背景DIB拷贝到屏幕缓冲区,画图(Draw)函数把屏幕缓冲区画到视图窗口。画图(Draw)实在COSBView基类中实现的,读者可参见例程。下面是构图(Render)函数:<BR>void 
CAnimView::Render(CRect* pClipRect)<BR>{kk1}<BR>CAnimDoc* pDoc = 
GetDocument();<BR>CRect rcDraw;<BR><BR>// Get the background DIB and render 
it.<BR>CDIB* pDIB = pDoc-&gt;GetBackground();<BR>if (pDIB) 
{kk1}<BR>pDIB-&gt;GetRect(&amp;rcDraw);<BR>// If a clipping rectangle was 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -