<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[lzx's Blog]]></title>
<link>http://liuzaoxing.cn/</link>
<description><![CDATA[无线网络、硬件DIY及编程]]></description>
<language>zh-cn</language>
<copyright><![CDATA[Copyright 2005 PBlog3 v2.8]]></copyright>
<webMaster><![CDATA[liuzaoxingseu@gmail.com(lzx)]]></webMaster>
<generator>PBlog2 v2.4</generator> 
<image>
	<title>lzx&#39;s Blog</title>
	<url>http://liuzaoxing.cn/images/logos.gif</url>
	<link>http://liuzaoxing.cn/</link>
	<description>lzx&#39;s Blog</description>
</image>

			<item>
			<link>http://liuzaoxing.cn/article.asp?id=75</link>
			<title><![CDATA[Nexus One 拆机揭秘]]></title>
			<author>liuzaoxingseu@gmail.com(lzx)</author>
			<category><![CDATA[Technology]]></category>
			<pubDate>Thu,07 Jan 2010 20:41:55 +0800</pubDate>
			<guid>http://liuzaoxing.cn/default.asp?id=75</guid>
		<description><![CDATA[<img src="http://liuzaoxing.cn/attachments/month_1001/j201017203720.jpg" border="0" alt=""/><br/>见机就拆的iFixit网站已经完成了对Nexus One的解剖，最大的收获是发现了FM发射/接收器，这是Google之前没有提到的。<br/><br/>拆开后盖，绿色部分为保修贴纸，撕毁无效，桔色部分为LED闪光灯模块，红色部分为500万像素摄像头，而黄色部分则是外置喇叭：<br/><img src="http://liuzaoxing.cn/attachments/month_1001/w201017203737.jpg" border="0" alt=""/><br/>Nexus One整合度很高，在卸下三颗螺丝之后就需要借助iPod拆解工具了，先拆下电池仓再说：<img src="http://liuzaoxing.cn/attachments/month_1001/320101720385.jpg" border="0" alt=""/><br/>还是在iPod拆卸工具的帮助下，继续翘开上侧的盖子，下面隐藏有很多金属引脚：<img src="http://liuzaoxing.cn/attachments/month_1001/o201017203824.jpg" border="0" alt=""/><br/>从下面慢慢抽出包着主板的一块黑色外壳，主板的下方显现出来了，里面真是五彩斑斓，桔色、绿色、黄色、深灰色一大堆东西：<br/><img src="http://liuzaoxing.cn/attachments/month_1001/o201017203836.jpg" border="0" alt=""/><br/>接下来继续卸螺丝，之后终于可以把整个主板抽出来了：<br/><img src="http://liuzaoxing.cn/attachments/month_1001/g201017203858.jpg" border="0" alt=""/><br/>拿下华丽的AMOLED触摸屏幕：<br/><img src="http://liuzaoxing.cn/attachments/month_1001/1201017203919.jpg" border="0" alt=""/><br/>仔细看看Synaptics触摸屏幕控制器，芯片上写着“T1007A, 2 0927, AMP08P”，可惜的是我们现在还找不到这颗芯片的资料：<br/><img src="http://liuzaoxing.cn/attachments/month_1001/m201017203941.jpg" border="0" alt=""/><br/>看看我们都看到什么芯片了，有Samsung 943 KA1000015M-AJTT（红色），Skyworks SKY77336 GSM 功放 (SKY77336-21 3888833 1P 0940 MX桔色)，一个高通的芯片（黄色）和一个不知名的芯片（绿色）：<br/><img src="http://liuzaoxing.cn/attachments/month_1001/o20101720408.jpg" border="0" alt=""/><br/>高通的Snapdragon大芯片QSD8250是Nexus One速度取胜的关键，主板上一共有三颗高通的芯片。左侧还有一个RTR6285 RF接收器：<br/><img src="http://liuzaoxing.cn/attachments/month_1001/a201017204038.jpg" border="0" alt=""/><br/>还有一枚不明身份的小东东：<br/><img src="http://liuzaoxing.cn/attachments/month_1001/c20101720410.jpg" border="0" alt=""/><br/>这里是蓝牙和802.11n无线芯片Broadcom BCM4329（BCM4329EKUBG CD0942 P21 937322 5EA），802.11n的速度可比只有802.11g的iPhone 3GS快老鼻子了，不过这颗芯片在第三代iPod touch里也有，就是说iPhone OS 4.0可能会开启第三代iPod touch的802.11n上网功能，iPhone第四代肯定也会是这样：<br/><img src="http://liuzaoxing.cn/attachments/month_1001/8201017204133.jpg" border="0" alt=""/><br/>还有三个芯片，但都被焊接剂给盖住了：<br/><img src="http://liuzaoxing.cn/attachments/month_1001/k201017204152.jpg" border="0" alt=""/><br/>]]></description>
		</item>
		
			<item>
			<link>http://liuzaoxing.cn/article.asp?id=74</link>
			<title><![CDATA[【自己动手】ACER笔记本电脑的Insybe bios的刷写教程，激活WIN7必需]]></title>
			<author>liuzaoxingseu@gmail.com(lzx)</author>
			<category><![CDATA[Technology]]></category>
			<pubDate>Thu,24 Dec 2009 20:37:55 +0800</pubDate>
			<guid>http://liuzaoxing.cn/default.asp?id=74</guid>
		<description><![CDATA[&nbsp;&nbsp; ACER的Insybe bios一直比较难修改，很不方便，对于一些新手上手比较麻烦。不像ASUS的AMI的BIOS很好修改。在这里，我提供一份PDF，希望使用ACER的Insybe bios本子的朋友能够顺利装上WIN7。<br/>&nbsp;&nbsp;提供在google docs的链接，请查看<a target="_blank" href="http://docs.google.com/fileview?id=0B8auG9HBbwXDYzAwZGZlZWEtYWI3Yy00OTE3LWFhNmQtYzYxZjc4MDAzY2Y0&amp;hl=zh_CN" rel="external">教程查看请点这里</a><br/><br/>&nbsp;&nbsp; <img src="http://liuzaoxing.cn/attachments/month_0912/c20091224204122.jpg" border="0" alt=""/><br/>]]></description>
		</item>
		
			<item>
			<link>http://liuzaoxing.cn/article.asp?id=73</link>
			<title><![CDATA[比较完善的3DS导入OPENGL的C++代码]]></title>
			<author>liuzaoxingseu@gmail.com(lzx)</author>
			<category><![CDATA[Programing]]></category>
			<pubDate>Fri,18 Dec 2009 16:25:21 +0800</pubDate>
			<guid>http://liuzaoxing.cn/default.asp?id=73</guid>
		<description><![CDATA[源程序下载（下载后请去掉.chm）：<br/><img src="http://liuzaoxing.cn/images/download.gif" alt="下载文件" style="margin:0px 2px -4px 0px"/> <a href="http://liuzaoxing.cn/attachments/month_0912/i2009121816218.rar.chm" target="_blank">点击下载此文件</a><br/><br/>以下是3DS.cpp:<br/>#include &#34;main.h&#34;<br/>#include &#34;3ds.h&#34;<br/><br/>//&nbsp;&nbsp;构造函数的功能是初始化tChunk数据<br/>CLoad3DS::CLoad3DS()<br/>{<br/>&#160;&#160;&#160;&#160;m_CurrentChunk = new tChunk;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 初始化并为当前的块分配空间<br/>&#160;&#160;&#160;&#160;m_TempChunk = new tChunk;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 初始化一个临时块并分配空间<br/>}<br/><br/>//&nbsp;&nbsp;打开一个3ds文件，读出其中的内容，并释放内存<br/>bool CLoad3DS::Import3DS(t3DModel *pModel, char *strFileName)<br/>{<br/>&#160;&#160;&#160;&#160;char strMessage[255] = {0};<br/><br/>&#160;&#160;&#160;&#160;// 打开一个3ds文件<br/>&#160;&#160;&#160;&#160;m_FilePointer = fopen(strFileName, &#34;rb&#34;);<br/><br/>&#160;&#160;&#160;&#160;// 确保所获得的文件指针合法<br/>&#160;&#160;&#160;&#160;if(!m_FilePointer) <br/>&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;sprintf(strMessage, &#34;Unable to find the file: %s!&#34;, strFileName);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;MessageBox(NULL, strMessage, &#34;Error&#34;, MB_OK);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return false;<br/>&#160;&#160;&#160;&#160;}<br/><br/>&#160;&#160;&#160;&#160;// 当文件打开之后，首先应该将文件最开始的数据块读出以判断是否是一个3ds文件<br/>&#160;&#160;&#160;&#160;// 如果是3ds文件的话，第一个块ID应该是PRIMARY<br/><br/>&#160;&#160;&#160;&#160;// 将文件的第一块读出并判断是否是3ds文件<br/>&#160;&#160;&#160;&#160;ReadChunk(m_CurrentChunk);<br/><br/>&#160;&#160;&#160;&#160;// 确保是3ds文件<br/>&#160;&#160;&#160;&#160;if (m_CurrentChunk-&gt;ID != PRIMARY)<br/>&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;sprintf(strMessage, &#34;Unable to load PRIMARY chuck from file: %s!&#34;, strFileName);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;MessageBox(NULL, strMessage, &#34;Error&#34;, MB_OK);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return false;<br/>&#160;&#160;&#160;&#160;}<br/><br/>&#160;&#160;&#160;&#160;// 现在开始读入数据，ProcessNextChunk()是一个递归函数<br/><br/>&#160;&#160;&#160;&#160;// 通过调用下面的递归函数，将对象读出<br/>&#160;&#160;&#160;&#160;ProcessNextChunk(pModel, m_CurrentChunk);<br/><br/>&#160;&#160;&#160;&#160;// 在读完整个3ds文件之后，计算顶点的法线<br/>&#160;&#160;&#160;&#160;ComputeNormals(pModel);<br/><br/>&#160;&#160;&#160;&#160;// 释放内存空间<br/>&#160;&#160;&#160;&#160;CleanUp();<br/><br/>&#160;&#160;&#160;&#160;return true;<br/>}<br/><br/><br/>//&nbsp;&nbsp;下面的函数释放所有的内存空间，并关闭文件<br/>void CLoad3DS::CleanUp()<br/>{<br/><br/>&#160;&#160;&#160;&#160;fclose(m_FilePointer);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 关闭当前的文件指针<br/>&#160;&#160;&#160;&#160;del&#101;te m_CurrentChunk;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 释放当前块<br/>&#160;&#160;&#160;&#160;del&#101;te m_TempChunk;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 释放临时块<br/>}<br/><br/><br/><br/>//&nbsp;&nbsp;下面的函数读出3ds文件的主要部分<br/>void CLoad3DS::ProcessNextChunk(t3DModel *pModel, tChunk *pPreviousChunk)<br/>{<br/>&#160;&#160;&#160;&#160;t3DObject newObject = {0};&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 用来添加到对象链表<br/>&#160;&#160;&#160;&#160;tMaterialInfo newTexture = {0};&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 用来添加到材质链表<br/>&#160;&#160;&#160;&#160;unsigned int version = 0;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 保存文件版本<br/>&#160;&#160;&#160;&#160;int buffer[50000] = {0};&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 用来跳过不需要的数据<br/><br/>&#160;&#160;&#160;&#160;m_CurrentChunk = new tChunk;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 为新的块分配空间&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/><br/>&#160;&#160;&#160;&#160;//&nbsp;&nbsp;下面每读一个新块，都要判断一下块的ID，如果该块是需要的读入的，则继续进行<br/>&#160;&#160;&#160;&#160;//&nbsp;&nbsp;如果是不需要读入的块，则略过<br/><br/>&#160;&#160;&#160;&#160;// 继续读入子块，直到达到预定的长度<br/>&#160;&#160;&#160;&#160;while (pPreviousChunk-&gt;bytesRead &lt; pPreviousChunk-&gt;length)<br/>&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 读入下一个块<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ReadChunk(m_CurrentChunk);<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 判断块的ID号<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;switch (m_CurrentChunk-&gt;ID)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;case VERSION:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 文件版本号<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 在该块中有一个无符号短整型数保存了文件的版本<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 读入文件的版本号，并将字节数添加到bytesRead变量中<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;m_CurrentChunk-&gt;bytesRead += fread(&amp;version, 1, m_CurrentChunk-&gt;length - m_CurrentChunk-&gt;bytesRead, m_FilePointer);<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 如果文件版本号大于3，给出一个警告信息<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if (version &gt; 0x03)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;MessageBox(NULL, &#34;This 3DS file is over version 3 so it may load incorrectly&#34;, &#34;Warning&#34;, MB_OK);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;break;<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;case OBJECTINFO:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 网格版本信息<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 读入下一个块<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ReadChunk(m_TempChunk);<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 获得网格的版本号<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;m_TempChunk-&gt;bytesRead += fread(&amp;version, 1, m_TempChunk-&gt;length - m_TempChunk-&gt;bytesRead, m_FilePointer);<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 增加读入的字节数<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;m_CurrentChunk-&gt;bytesRead += m_TempChunk-&gt;bytesRead;<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 进入下一个块<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ProcessNextChunk(pModel, m_CurrentChunk);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;break;<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;case MATERIAL:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 材质信息<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 材质的数目递增<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;pModel-&gt;numOfMaterials++;<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 在纹理链表中添加一个空白纹理结构<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;pModel-&gt;pMaterials.push_back(newTexture);<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 进入材质装入函数<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ProcessNextMaterialChunk(pModel, m_CurrentChunk);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;break;<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;case OBJECT:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 对象的名称<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 该块是对象信息块的头部，保存了对象了名称<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 对象数递增<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;pModel-&gt;numOfObjects++;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 添加一个新的tObject节点到对象链表中<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;pModel-&gt;pObject.push_back(newObject);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 初始化对象和它的所有数据成员<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;memset(&amp;(pModel-&gt;pObject[pModel-&gt;numOfObjects - 1]), 0, sizeof(t3DObject));<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 获得并保存对象的名称，然后增加读入的字节数<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;m_CurrentChunk-&gt;bytesRead += GetString(pModel-&gt;pObject[pModel-&gt;numOfObjects - 1].strName);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 进入其余的对象信息的读入<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ProcessNextObjectChunk(pModel, &amp;(pModel-&gt;pObject[pModel-&gt;numOfObjects - 1]), m_CurrentChunk);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;break;<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;case EDITKEYFRAME:<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 跳过关键帧块的读入，增加需要读入的字节数<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;m_CurrentChunk-&gt;bytesRead += fread(buffer, 1, m_CurrentChunk-&gt;length - m_CurrentChunk-&gt;bytesRead, m_FilePointer);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;break;<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;default: <br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//&nbsp;&nbsp;跳过所有忽略的块的内容的读入，增加需要读入的字节数<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;m_CurrentChunk-&gt;bytesRead += fread(buffer, 1, m_CurrentChunk-&gt;length - m_CurrentChunk-&gt;bytesRead, m_FilePointer);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;break;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 增加从最后块读入的字节数<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;pPreviousChunk-&gt;bytesRead += m_CurrentChunk-&gt;bytesRead;<br/>&#160;&#160;&#160;&#160;}<br/><br/>&#160;&#160;&#160;&#160;// 释放当前块的内存空间<br/>&#160;&#160;&#160;&#160;del&#101;te m_CurrentChunk;<br/>&#160;&#160;&#160;&#160;m_CurrentChunk = pPreviousChunk;<br/>}<br/><br/><br/>//&nbsp;&nbsp;下面的函数处理所有的文件中对象的信息<br/>void CLoad3DS::ProcessNextObjectChunk(t3DModel *pModel, t3DObject *pObject, tChunk *pPreviousChunk)<br/>{<br/>&#160;&#160;&#160;&#160;int buffer[50000] = {0};&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 用于读入不需要的数据<br/><br/>&#160;&#160;&#160;&#160;// 对新的块分配存储空间<br/>&#160;&#160;&#160;&#160;m_CurrentChunk = new tChunk;<br/><br/>&#160;&#160;&#160;&#160;// 继续读入块的内容直至本子块结束<br/>&#160;&#160;&#160;&#160;while (pPreviousChunk-&gt;bytesRead &lt; pPreviousChunk-&gt;length)<br/>&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 读入下一个块<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ReadChunk(m_CurrentChunk);<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 区别读入是哪种块<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;switch (m_CurrentChunk-&gt;ID)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;case OBJECT_MESH:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 正读入的是一个新块<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 使用递归函数调用，处理该新块<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ProcessNextObjectChunk(pModel, pObject, m_CurrentChunk);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;break;<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;case OBJECT_VERTICES:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 读入是对象顶点<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ReadVertices(pObject, m_CurrentChunk);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;break;<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;case OBJECT_FACES:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 读入的是对象的面<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ReadVertexIndices(pObject, m_CurrentChunk);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;break;<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;case OBJECT_MATERIAL:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 读入的是对象的材质名称<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 该块保存了对象材质的名称，可能是一个颜色，也可能是一个纹理映射。同时在该块中也保存了<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 纹理对象所赋予的面<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 下面读入对象的材质名称<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ReadObjectMaterial(pModel, pObject, m_CurrentChunk);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;break;<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;case OBJECT_UV:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 读入对象的UV纹理坐标<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 读入对象的UV纹理坐标<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ReadUVCoordinates(pObject, m_CurrentChunk);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;break;<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;default:&nbsp;&nbsp;<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 略过不需要读入的块<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;m_CurrentChunk-&gt;bytesRead += fread(buffer, 1, m_CurrentChunk-&gt;length - m_CurrentChunk-&gt;bytesRead, m_FilePointer);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;break;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 添加从最后块中读入的字节数到前面的读入的字节中<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;pPreviousChunk-&gt;bytesRead += m_CurrentChunk-&gt;bytesRead;<br/>&#160;&#160;&#160;&#160;}<br/><br/>&#160;&#160;&#160;&#160;// 释放当前块的内存空间，并把当前块设置为前面块<br/>&#160;&#160;&#160;&#160;del&#101;te m_CurrentChunk;<br/>&#160;&#160;&#160;&#160;m_CurrentChunk = pPreviousChunk;<br/>}<br/><br/>//&nbsp;&nbsp;下面的函数处理所有的材质信息<br/>void CLoad3DS::ProcessNextMaterialChunk(t3DModel *pModel, tChunk *pPreviousChunk)<br/>{<br/>&#160;&#160;&#160;&#160;int buffer[50000] = {0};&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 用于读入不需要的数据<br/><br/>&#160;&#160;&#160;&#160;// 给当前块分配存储空间<br/>&#160;&#160;&#160;&#160;m_CurrentChunk = new tChunk;<br/><br/>&#160;&#160;&#160;&#160;// 继续读入这些块，知道该子块结束<br/>&#160;&#160;&#160;&#160;while (pPreviousChunk-&gt;bytesRead &lt; pPreviousChunk-&gt;length)<br/>&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 读入下一块<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ReadChunk(m_CurrentChunk);<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 判断读入的是什么块<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;switch (m_CurrentChunk-&gt;ID)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;case MATNAME:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 材质的名称<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 读入材质的名称<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;m_CurrentChunk-&gt;bytesRead += fread(pModel-&gt;pMaterials[pModel-&gt;numOfMaterials - 1].strName, 1, m_CurrentChunk-&gt;length - m_CurrentChunk-&gt;bytesRead, m_FilePointer);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;break;<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;case MATDIFFUSE:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 对象的R G B颜色<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ReadColorChunk(&amp;(pModel-&gt;pMaterials[pModel-&gt;numOfMaterials - 1]), m_CurrentChunk);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;break;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;case MATMAP:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 纹理信息的头部<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 进入下一个材质块信息<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ProcessNextMaterialChunk(pModel, m_CurrentChunk);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;break;<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;case MATMAPFILE:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 材质文件的名称<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 读入材质的文件名称<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;m_CurrentChunk-&gt;bytesRead += fread(pModel-&gt;pMaterials[pModel-&gt;numOfMaterials - 1].strFile, 1, m_CurrentChunk-&gt;length - m_CurrentChunk-&gt;bytesRead, m_FilePointer);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;break;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;default:&nbsp;&nbsp;<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 掠过不需要读入的块<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;m_CurrentChunk-&gt;bytesRead += fread(buffer, 1, m_CurrentChunk-&gt;length - m_CurrentChunk-&gt;bytesRead, m_FilePointer);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;break;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 添加从最后块中读入的字节数<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;pPreviousChunk-&gt;bytesRead += m_CurrentChunk-&gt;bytesRead;<br/>&#160;&#160;&#160;&#160;}<br/><br/>&#160;&#160;&#160;&#160;// 删除当前块，并将当前块设置为前面的块<br/>&#160;&#160;&#160;&#160;del&#101;te m_CurrentChunk;<br/>&#160;&#160;&#160;&#160;m_CurrentChunk = pPreviousChunk;<br/>}<br/><br/>//&nbsp;&nbsp;下面函数读入块的ID号和它的字节长度<br/>void CLoad3DS::ReadChunk(tChunk *pChunk)<br/>{<br/>&#160;&#160;&#160;&#160;// 读入块的ID号，占用了2个字节。块的ID号象OBJECT或MATERIAL一样，说明了在块中所包含的内容<br/>&#160;&#160;&#160;&#160;pChunk-&gt;bytesRead = fread(&amp;pChunk-&gt;ID, 1, 2, m_FilePointer);<br/><br/>&#160;&#160;&#160;&#160;// 然后读入块占用的长度，包含了四个字节<br/>&#160;&#160;&#160;&#160;pChunk-&gt;bytesRead += fread(&amp;pChunk-&gt;length, 1, 4, m_FilePointer);<br/>}<br/><br/>//&nbsp;&nbsp;下面的函数读入一个字符串<br/>int CLoad3DS::GetString(char *pBuffer)<br/>{<br/>&#160;&#160;&#160;&#160;int index = 0;<br/><br/>&#160;&#160;&#160;&#160;// 读入一个字节的数据<br/>&#160;&#160;&#160;&#160;fread(pBuffer, 1, 1, m_FilePointer);<br/><br/>&#160;&#160;&#160;&#160;// 直到结束<br/>&#160;&#160;&#160;&#160;while (*(pBuffer + index++) != 0) {<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 读入一个字符直到NULL<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;fread(pBuffer + index, 1, 1, m_FilePointer);<br/>&#160;&#160;&#160;&#160;}<br/><br/>&#160;&#160;&#160;&#160;// 返回字符串的长度<br/>&#160;&#160;&#160;&#160;return strlen(pBuffer) + 1;<br/>}<br/><br/><br/>//&nbsp;&nbsp;下面的函数读入RGB颜色<br/>void CLoad3DS::ReadColorChunk(tMaterialInfo *pMaterial, tChunk *pChunk)<br/>{<br/>&#160;&#160;&#160;&#160;// 读入颜色块信息<br/>&#160;&#160;&#160;&#160;ReadChunk(m_TempChunk);<br/><br/>&#160;&#160;&#160;&#160;// 读入RGB颜色<br/>&#160;&#160;&#160;&#160;m_TempChunk-&gt;bytesRead += fread(pMaterial-&gt;color, 1, m_TempChunk-&gt;length - m_TempChunk-&gt;bytesRead, m_FilePointer);<br/><br/>&#160;&#160;&#160;&#160;// 增加读入的字节数<br/>&#160;&#160;&#160;&#160;pChunk-&gt;bytesRead += m_TempChunk-&gt;bytesRead;<br/>}<br/><br/>//&nbsp;&nbsp;下面的函数读入顶点索引<br/>void CLoad3DS::ReadVertexIndices(t3DObject *pObject, tChunk *pPreviousChunk)<br/>{<br/>&#160;&#160;&#160;&#160;unsigned short index = 0;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 用于读入当前面的索引<br/><br/>&#160;&#160;&#160;&#160;// 读入该对象中面的数目<br/>&#160;&#160;&#160;&#160;pPreviousChunk-&gt;bytesRead += fread(&amp;pObject-&gt;numOfFaces, 1, 2, m_FilePointer);<br/><br/>&#160;&#160;&#160;&#160;// 分配所有面的存储空间，并初始化结构<br/>&#160;&#160;&#160;&#160;pObject-&gt;pFaces = new tFace [pObject-&gt;numOfFaces];<br/>&#160;&#160;&#160;&#160;memset(pObject-&gt;pFaces, 0, sizeof(tFace) * pObject-&gt;numOfFaces);<br/><br/>&#160;&#160;&#160;&#160;// 遍历对象中所有的面<br/>&#160;&#160;&#160;&#160;for(int i = 0; i &lt; pObject-&gt;numOfFaces; i++)<br/>&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;for(int j = 0; j &lt; 4; j++)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 读入当前面的第一个点 <br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;pPreviousChunk-&gt;bytesRead += fread(&amp;index, 1, sizeof(index), m_FilePointer);<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(j &lt; 3)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 将索引保存在面的结构中<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;pObject-&gt;pFaces[i].vertIndex[j] = index;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;}<br/>}<br/><br/><br/>//&nbsp;&nbsp;下面的函数读入对象的UV坐标<br/>void CLoad3DS::ReadUVCoordinates(t3DObject *pObject, tChunk *pPreviousChunk)<br/>{<br/>&#160;&#160;&#160;&#160;// 为了读入对象的UV坐标，首先需要读入UV坐标的数量，然后才读入具体的数据<br/><br/>&#160;&#160;&#160;&#160;// 读入UV坐标的数量<br/>&#160;&#160;&#160;&#160;pPreviousChunk-&gt;bytesRead += fread(&amp;pObject-&gt;numTexVertex, 1, 2, m_FilePointer);<br/><br/>&#160;&#160;&#160;&#160;// 分配保存UV坐标的内存空间<br/>&#160;&#160;&#160;&#160;pObject-&gt;pTexVerts = new CVector2 [pObject-&gt;numTexVertex];<br/><br/>&#160;&#160;&#160;&#160;// 读入纹理坐标<br/>&#160;&#160;&#160;&#160;pPreviousChunk-&gt;bytesRead += fread(pObject-&gt;pTexVerts, 1, pPreviousChunk-&gt;length - pPreviousChunk-&gt;bytesRead, m_FilePointer);<br/>}<br/><br/>//&nbsp;&nbsp;读入对象的顶点<br/>void CLoad3DS::ReadVertices(t3DObject *pObject, tChunk *pPreviousChunk)<br/>{<br/>&#160;&#160;&#160;&#160;// 在读入实际的顶点之前，首先必须确定需要读入多少个顶点。<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;// 读入顶点的数目<br/>&#160;&#160;&#160;&#160;pPreviousChunk-&gt;bytesRead += fread(&amp;(pObject-&gt;numOfVerts), 1, 2, m_FilePointer);<br/><br/>&#160;&#160;&#160;&#160;// 分配顶点的存储空间，然后初始化结构体<br/>&#160;&#160;&#160;&#160;pObject-&gt;pVerts = new CVector3 [pObject-&gt;numOfVerts];<br/>&#160;&#160;&#160;&#160;memset(pObject-&gt;pVerts, 0, sizeof(CVector3) * pObject-&gt;numOfVerts);<br/><br/>&#160;&#160;&#160;&#160;// 读入顶点序列<br/>&#160;&#160;&#160;&#160;pPreviousChunk-&gt;bytesRead += fread(pObject-&gt;pVerts, 1, pPreviousChunk-&gt;length - pPreviousChunk-&gt;bytesRead, m_FilePointer);<br/><br/>&#160;&#160;&#160;&#160;// 现在已经读入了所有的顶点。<br/>&#160;&#160;&#160;&#160;// 因为3D Studio Max的模型的Z轴是指向上的，因此需要将y轴和z轴翻转过来。<br/>&#160;&#160;&#160;&#160;// 具体的做法是将Y轴和Z轴交换，然后将Z轴反向。<br/><br/>&#160;&#160;&#160;&#160;// 遍历所有的顶点<br/>&#160;&#160;&#160;&#160;for(int i = 0; i &lt; pObject-&gt;numOfVerts; i++)<br/>&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 保存Y轴的值<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;float fTempY = pObject-&gt;pVerts[i].y;<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 设置Y轴的值等于Z轴的值<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;pObject-&gt;pVerts[i].y = pObject-&gt;pVerts[i].z;<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 设置Z轴的值等于-Y轴的值 <br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;pObject-&gt;pVerts[i].z = -fTempY;<br/>&#160;&#160;&#160;&#160;}<br/>}<br/><br/><br/>//&nbsp;&nbsp;下面的函数读入对象的材质名称<br/>void CLoad3DS::ReadObjectMaterial(t3DModel *pModel, t3DObject *pObject, tChunk *pPreviousChunk)<br/>{<br/>&#160;&#160;&#160;&#160;char strMaterial[255] = {0};&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 用来保存对象的材质名称<br/>&#160;&#160;&#160;&#160;int buffer[50000] = {0};&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 用来读入不需要的数据<br/><br/>&#160;&#160;&#160;&#160;// 材质或者是颜色，或者是对象的纹理，也可能保存了象明亮度、发光度等信息。<br/><br/>&#160;&#160;&#160;&#160;// 下面读入赋予当前对象的材质名称<br/>&#160;&#160;&#160;&#160;pPreviousChunk-&gt;bytesRead += GetString(strMaterial);<br/><br/>&#160;&#160;&#160;&#160;// 遍历所有的纹理<br/>&#160;&#160;&#160;&#160;for(int i = 0; i &lt; pModel-&gt;numOfMaterials; i++)<br/>&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//如果读入的纹理与当前的纹理名称匹配<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(strcmp(strMaterial, pModel-&gt;pMaterials[i].strName) == 0)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 设置材质ID<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;pObject-&gt;materialID = i;<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 判断是否是纹理映射，如果strFile是一个长度大于1的字符串，则是纹理<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(strlen(pModel-&gt;pMaterials[i].strFile) &gt; 0) {<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 设置对象的纹理映射标志<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;pObject-&gt;bHasTexture = true;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;break;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;else<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 如果该对象没有材质，则设置ID为-1<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;pObject-&gt;materialID = -1;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;}<br/><br/>&#160;&#160;&#160;&#160;pPreviousChunk-&gt;bytesRead += fread(buffer, 1, pPreviousChunk-&gt;length - pPreviousChunk-&gt;bytesRead, m_FilePointer);<br/>}&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/><br/><br/><br/>//&nbsp;&nbsp;下面的这些函数主要用来计算顶点的法向量，顶点的法向量主要用来计算光照<br/>// 下面的宏定义计算一个矢量的长度<br/>#define Mag(Normal) (sqrt(Normal.x*Normal.x + Normal.y*Normal.y + Normal.z*Normal.z))<br/><br/>// 下面的函数求两点决定的矢量<br/>CVector3 Vector(CVector3 vPoint1, CVector3 vPoint2)<br/>{<br/>&#160;&#160;&#160;&#160;CVector3 vVector;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/><br/>&#160;&#160;&#160;&#160;vVector.x = vPoint1.x - vPoint2.x;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;vVector.y = vPoint1.y - vPoint2.y;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;vVector.z = vPoint1.z - vPoint2.z;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/><br/>&#160;&#160;&#160;&#160;return vVector;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>}<br/><br/>// 下面的函数两个矢量相加<br/>CVector3 AddVector(CVector3 vVector1, CVector3 vVector2)<br/>{<br/>&#160;&#160;&#160;&#160;CVector3 vResult;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;vResult.x = vVector2.x + vVector1.x;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;vResult.y = vVector2.y + vVector1.y;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;vResult.z = vVector2.z + vVector1.z;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/><br/>&#160;&#160;&#160;&#160;return vResult;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>}<br/><br/>// 下面的函数处理矢量的缩放<br/>CVector3 DivideVectorByScaler(CVector3 vVector1, float Scaler)<br/>{<br/>&#160;&#160;&#160;&#160;CVector3 vResult;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;vResult.x = vVector1.x / Scaler;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;vResult.y = vVector1.y / Scaler;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;vResult.z = vVector1.z / Scaler;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/><br/>&#160;&#160;&#160;&#160;return vResult;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>}<br/><br/>// 下面的函数返回两个矢量的叉积<br/>CVector3 Cross(CVector3 vVector1, CVector3 vVector2)<br/>{<br/>&#160;&#160;&#160;&#160;CVector3 vCross;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;vCross.x = ((vVector1.y * vVector2.z) - (vVector1.z * vVector2.y));<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;vCross.y = ((vVector1.z * vVector2.x) - (vVector1.x * vVector2.z));<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;vCross.z = ((vVector1.x * vVector2.y) - (vVector1.y * vVector2.x));<br/><br/>&#160;&#160;&#160;&#160;return vCross;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>}<br/><br/>// 下面的函数规范化矢量<br/>CVector3 Normalize(CVector3 vNormal)<br/>{<br/>&#160;&#160;&#160;&#160;double Magnitude;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/><br/>&#160;&#160;&#160;&#160;Magnitude = Mag(vNormal);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 获得矢量的长度<br/><br/>&#160;&#160;&#160;&#160;vNormal.x /= (float)Magnitude;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;vNormal.y /= (float)Magnitude;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;vNormal.z /= (float)Magnitude;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/><br/>&#160;&#160;&#160;&#160;return vNormal;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>}<br/><br/>//&nbsp;&nbsp;下面的函数用于计算对象的法向量<br/>void CLoad3DS::ComputeNormals(t3DModel *pModel)<br/>{<br/>&#160;&#160;&#160;&#160;CVector3 vVector1, vVector2, vNormal, vPoly[3];<br/><br/>&#160;&#160;&#160;&#160;// 如果模型中没有对象，则返回<br/>&#160;&#160;&#160;&#160;if(pModel-&gt;numOfObjects &lt;= 0)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return;<br/><br/>&#160;&#160;&#160;&#160;// 遍历模型中所有的对象<br/>&#160;&#160;&#160;&#160;for(int index = 0; index &lt; pModel-&gt;numOfObjects; index++)<br/>&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 获得当前的对象<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;t3DObject *pObject = &amp;(pModel-&gt;pObject[index]);<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 分配需要的存储空间<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CVector3 *pNormals&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;= new CVector3 [pObject-&gt;numOfFaces];<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CVector3 *pTempNormals&#160;&#160;&#160;&#160;= new CVector3 [pObject-&gt;numOfFaces];<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;pObject-&gt;pNormals&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;= new CVector3 [pObject-&gt;numOfVerts];<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 遍历对象的所有面<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;for(int i=0; i &lt; pObject-&gt;numOfFaces; i++)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;vPoly[0] = pObject-&gt;pVerts[pObject-&gt;pFaces[i].vertIndex[0]];<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;vPoly[1] = pObject-&gt;pVerts[pObject-&gt;pFaces[i].vertIndex[1]];<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;vPoly[2] = pObject-&gt;pVerts[pObject-&gt;pFaces[i].vertIndex[2]];<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 计算面的法向量<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;vVector1 = Vector(vPoly[0], vPoly[2]);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 获得多边形的矢量<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;vVector2 = Vector(vPoly[2], vPoly[1]);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 获得多边形的第二个矢量<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;vNormal&nbsp;&nbsp;= Cross(vVector1, vVector2);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 获得两个矢量的叉积<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;pTempNormals[i] = vNormal;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 保存非规范化法向量<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;vNormal&nbsp;&nbsp;= Normalize(vNormal);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 规范化获得的叉积<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;pNormals[i] = vNormal;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 将法向量添加到法向量列表中<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//&nbsp;&nbsp;下面求顶点法向量<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CVector3 vSum = {0.0, 0.0, 0.0};<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;CVector3 vZero = vSum;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;int shared=0;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 遍历所有的顶点<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;for (i = 0; i &lt; pObject-&gt;numOfVerts; i++)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;for (int j = 0; j &lt; pObject-&gt;numOfFaces; j++)&#160;&#160;&#160;&#160;// 遍历所有的三角形面<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 判断该点是否与其它的面共享<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if (pObject-&gt;pFaces[j].vertIndex[0] == i || <br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;pObject-&gt;pFaces[j].vertIndex[1] == i || <br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;pObject-&gt;pFaces[j].vertIndex[2] == i)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;vSum = AddVector(vSum, pTempNormals[j]);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;shared++;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;pObject-&gt;pNormals[i] = DivideVectorByScaler(vSum, float(-shared));<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 规范化最后的顶点法向<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;pObject-&gt;pNormals[i] = Normalize(pObject-&gt;pNormals[i]);&#160;&#160;&#160;&#160;<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;vSum = vZero;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;shared = 0;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 释放存储空间，开始下一个对象<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;del&#101;te [] pTempNormals;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;del&#101;te [] pNormals;<br/>&#160;&#160;&#160;&#160;}<br/>}<br/><br/><br/>/*<br/>值得注意的是OpenGL的坐标系和3DS Max的坐标系是不同的，3D Studio Max中的模型的Z轴是指向上的，<br/>而OpenGL中模型的Z轴是垂直屏幕指向用户的，因此需要将顶点的坐标的y和z翻转过来。<br/>什么是块？<br/>块ID是标识该块中数据类型的独一无二的代码，同时也标识是否存在子块。它占用了两个字节。<br/>块的长度表示的是紧跟在该块后续的数据的长度。它占用了四个字节。<br/><br/>*/<br/><br/><br/>以下是Init.cpp:<br/>#include &#34;main.h&#34;<br/><br/>//&nbsp;&nbsp;从文件中创建纹理<br/>void Cr&#101;ateTexture(UINT textureArray[], LPSTR strFileName, int textureID)<br/>{<br/>&#160;&#160;&#160;&#160;AUX_RGBImageRec *pBitmap = NULL;<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;if(!strFileName)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 如果无此文件，则直接返回<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return;<br/><br/>&#160;&#160;&#160;&#160;pBitmap = auxDIBImageLoad(strFileName);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 装入位图，并保存数据<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;if(pBitmap == NULL)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 如果装入位图失败，则退出<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;exit(0);<br/><br/>&#160;&#160;&#160;&#160;// 生成纹理<br/>&#160;&#160;&#160;&#160;glGenTextures(1, &amp;textureArray[textureID]);<br/><br/>&#160;&#160;&#160;&#160;// 设置像素对齐格式<br/>&#160;&#160;&#160;&#160;glPixelStorei (GL_UNPACK_ALIGNMENT, 1);<br/><br/>&#160;&#160;&#160;&#160;glBindTexture(GL_TEXTURE_2D, textureArray[textureID]);<br/><br/>&#160;&#160;&#160;&#160;gluBuild2DMipmaps(GL_TEXTURE_2D, 3, pBitmap-&gt;sizeX, pBitmap-&gt;sizeY, GL_RGB, GL_UNSIGNED_BYTE, pBitmap-&gt;data);<br/><br/>&#160;&#160;&#160;&#160;glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);<br/>&#160;&#160;&#160;&#160;glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR_MIPMAP_LINEAR);<br/><br/>&#160;&#160;&#160;&#160;if (pBitmap)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 释放位图占用的资源<br/>&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if (pBitmap-&gt;data)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;free(pBitmap-&gt;data);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;free(pBitmap);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;}<br/>}<br/><br/>void ChangeToFullScreen()<br/>{<br/>&#160;&#160;&#160;&#160;DEVMODE dmSettings;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/><br/>&#160;&#160;&#160;&#160;memset(&amp;dmSettings,0,sizeof(dmSettings));&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/><br/>&#160;&#160;&#160;&#160;if(!EnumDisplaySettings(NULL,ENUM_CURRENT_SETTINGS,&amp;dmSettings))<br/>&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;MessageBox(NULL, &#34;Could Not Enum Display Settings&#34;, &#34;Error&#34;, MB_OK);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return;<br/>&#160;&#160;&#160;&#160;}<br/><br/>&#160;&#160;&#160;&#160;dmSettings.dmPelsWidth&#160;&#160;&#160;&#160;= SCREEN_WIDTH;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;dmSettings.dmPelsHeight&#160;&#160;&#160;&#160;= SCREEN_HEIGHT;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;int result = ChangeDisplaySettings(&amp;dmSettings,CDS_FULLSCREEN);&#160;&#160;&#160;&#160;<br/><br/>&#160;&#160;&#160;&#160;if(result != DISP_CHANGE_SUCCESSFUL)<br/>&#160;&#160;&#160;&#160;{<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;MessageBox(NULL, &#34;Display Mode Not Compatible&#34;, &#34;Error&#34;, MB_OK);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;PostQuitMessage(0);<br/>&#160;&#160;&#160;&#160;}<br/>}<br/><br/>HWND Cr&#101;ateMyWindow(LPSTR strWindowName, int width, int height, DWORD dwStyle, bool bFullScreen, HINSTANCE hInstance)<br/>{<br/>&#160;&#160;&#160;&#160;HWND hWnd;<br/>&#160;&#160;&#160;&#160;WNDCLASS wndclass;<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;memset(&amp;wndclass, 0, sizeof(WNDCLASS));&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;wndclass.style = CS_HREDRAW | CS_VREDRAW;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;wndclass.lpfnWndProc = WinProc;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;wndclass.hInstance = hInstance;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;wndclass.hbrBackground = (HBRUSH) (COLOR_WINDOW+1);<br/>&#160;&#160;&#160;&#160;wndclass.lpszClassName = &#34;GameTutorials&#34;;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/><br/>&#160;&#160;&#160;&#160;RegisterClass(&amp;wndclass);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;if(bFullScreen &amp;&amp; !dwStyle) &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;{&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;dwStyle = WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ChangeToFullScreen();&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ShowCursor(FALSE);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;else if(!dwStyle)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;dwStyle = WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;g_hInstance = hInstance;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/><br/>&#160;&#160;&#160;&#160;RECT rWindow;<br/>&#160;&#160;&#160;&#160;rWindow.left&#160;&#160;&#160;&#160;= 0;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;rWindow.right&#160;&#160;&#160;&#160;= width;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;rWindow.top&#160;&#160;&#160;&#160;&nbsp;&nbsp;&nbsp;&nbsp;= 0;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;rWindow.bottom&#160;&#160;&#160;&#160;= height;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;AdjustWindowRect( &amp;rWindow, dwStyle, false);&#160;&#160;&#160;&#160;<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;hWnd = Cr&#101;ateWindow(&#34;GameTutorials&#34;, strWindowName, dwStyle, 0, 0,<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;rWindow.right&nbsp;&nbsp;- rWindow.left, rWindow.bottom - rWindow.top, <br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;NULL, NULL, hInstance, NULL);<br/><br/>&#160;&#160;&#160;&#160;if(!hWnd) return NULL;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/><br/>&#160;&#160;&#160;&#160;ShowWindow(hWnd, SW_SHOWNORMAL);&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;Up&#100;ateWindow(hWnd);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/><br/>&#160;&#160;&#160;&#160;SetFocus(hWnd);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/><br/>&#160;&#160;&#160;&#160;return hWnd;<br/>}<br/><br/>bool bSetupPixelFormat(HDC hdc) <br/>{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;PIXELFORMATDESCRIPTOR pfd; <br/>&nbsp;&nbsp;&nbsp;&nbsp;int pixelformat; <br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&nbsp;&nbsp;&nbsp;&nbsp;pfd.nVersion = 1;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&nbsp;&nbsp;&nbsp;&nbsp;pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; <br/>&nbsp;&nbsp;&nbsp;&nbsp;pfd.dwLayerMask = PFD_MAIN_PLANE;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&nbsp;&nbsp;&nbsp;&nbsp;pfd.iPixelType = PFD_TYPE_RGBA;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&nbsp;&nbsp;&nbsp;&nbsp;pfd.cColorBits = SCREEN_DEPTH;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&nbsp;&nbsp;&nbsp;&nbsp;pfd.cDepthBits = SCREEN_DEPTH;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&nbsp;&nbsp;&nbsp;&nbsp;pfd.cAccumBits = 0;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&nbsp;&nbsp;&nbsp;&nbsp;pfd.cStencilBits = 0;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;if ( (pixelformat = ChoosePixelFormat(hdc, &amp;pfd)) == FALSE ) <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(NULL, &#34;ChoosePixelFormat failed&#34;, &#34;Error&#34;, MB_OK); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return FALSE; <br/>&nbsp;&nbsp;&nbsp;&nbsp;} <br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;if (SetPixelFormat(hdc, pixelformat, &amp;pfd) == FALSE) <br/>&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(NULL, &#34;SetPixelFormat failed&#34;, &#34;Error&#34;, MB_OK); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return FALSE; <br/>&nbsp;&nbsp;&nbsp;&nbsp;} <br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;return TRUE;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>}<br/><br/>void SizeOpenGLScreen(int width, int height)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>{<br/>&#160;&#160;&#160;&#160;if (height==0)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;height=1;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;}<br/><br/>&#160;&#160;&#160;&#160;glViewport(0,0,width,height);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/><br/>&#160;&#160;&#160;&#160;glMatrixMode(GL_PROJECTION);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;glLoadIdentity();&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;gluPerspective(45.0f,(GLfloat)width/(GLfloat)height, .5f ,150.0f);<br/><br/>&#160;&#160;&#160;&#160;glMatrixMode(GL_MODELVIEW);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;glLoadIdentity();&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>}<br/><br/><br/>void InitializeOpenGL(int width, int height) <br/>{&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;g_hDC = GetDC(g_hWnd);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (!bSetupPixelFormat(g_hDC))&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PostQuitMessage (0);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;g_hRC = wglCr&#101;ateContext(g_hDC);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&nbsp;&nbsp;&nbsp;&nbsp;wglMakeCurrent(g_hDC, g_hRC);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/><br/>&#160;&#160;&#160;&#160;glEnable(GL_TEXTURE_2D);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;glEnable(GL_DEPTH_TEST);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/><br/>&#160;&#160;&#160;&#160;SizeOpenGLScreen(width, height);&#160;&#160;&#160;&#160;<br/>}<br/><br/>void DeInit()<br/>{<br/>&#160;&#160;&#160;&#160;if (g_hRC)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;wglMakeCurrent(NULL, NULL);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;wglDel&#101;teContext(g_hRC);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;if (g_hDC) <br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ReleaseDC(g_hWnd, g_hDC);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;if(g_bFullScreen)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ChangeDisplaySettings(NULL,0);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ShowCursor(TRUE);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;}<br/><br/>&#160;&#160;&#160;&#160;UnregisterClass(&#34;GameTutorials&#34;, g_hInstance);&#160;&#160;&#160;&#160;<br/><br/>&#160;&#160;&#160;&#160;PostQuitMessage (0);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>}<br/><br/>int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hprev, PSTR cmdline, int ishow)<br/>{&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;HWND hWnd;<br/><br/>&#160;&#160;&#160;&#160;// 判断用户是否需要全屏显示<br/>&#160;&#160;&#160;&#160;if(MessageBox(NULL, &#34;Click Yes to go to full screen (Recommended)&#34;, &#34;Options&#34;, MB_YESNO | MB_ICONQUESTION) == IDNO)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;g_bFullScreen = false;<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;hWnd = Cr&#101;ateMyWindow(&#34; 3DS Loader&#34;, SCREEN_WIDTH, SCREEN_HEIGHT, 0, g_bFullScreen, hInstance);<br/><br/>&#160;&#160;&#160;&#160;if(hWnd == NULL) return true;<br/><br/>&#160;&#160;&#160;&#160;// 初始化OpenGL<br/>&#160;&#160;&#160;&#160;Init(hWnd);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;return MainLoop();&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>}<br/><br/>以下是main.cpp:<br/><br/>#include &#34;main.h&#34;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>#include &#34;3ds.h&#34;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/><br/>bool&nbsp;&nbsp;g_bFullScreen = true;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>HWND&nbsp;&nbsp;g_hWnd;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>RECT&nbsp;&nbsp;g_rRect;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>HDC&nbsp;&nbsp; g_hDC;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>HGLRC g_hRC;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>HINSTANCE g_hInstance;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/><br/><br/>#define FILE_NAME&nbsp;&nbsp;&#34;trans.3ds&#34;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/><br/>UINT g_Texture[MAX_TEXTURES] = {0};&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/><br/>CLoad3DS g_Load3ds;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>t3DModel g_3DModel;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/><br/>int&nbsp;&nbsp; g_ViewMode&#160;&#160;&#160;&#160;&nbsp;&nbsp;= GL_TRIANGLES;<br/>bool&nbsp;&nbsp;g_bLighting&nbsp;&nbsp;&nbsp;&nbsp; = true;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>float g_RotateX&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&nbsp;&nbsp;= 0.0f;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>float g_RotationSpeed = 0.0f;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/><br/><br/>void Init(HWND hWnd)<br/>{<br/>&#160;&#160;&#160;&#160;g_hWnd = hWnd;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;GetClientRect(g_hWnd, &amp;g_rRect);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;InitializeOpenGL(g_rRect.right, g_rRect.bottom);<br/><br/>&#160;&#160;&#160;&#160;g_Load3ds.Import3DS(&amp;g_3DModel, FILE_NAME);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 将3ds文件装入到模型结构体中<br/><br/>&#160;&#160;&#160;&#160;// 遍历所有的材质<br/>&#160;&#160;&#160;&#160;for(int i = 0; i &lt; g_3DModel.numOfMaterials; i++)<br/>&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 判断是否是一个文件名<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(strlen(g_3DModel.pMaterials[i].strFile) &gt; 0)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//&nbsp;&nbsp;使用纹理文件名称来装入位图<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Cr&#101;ateTexture(g_Texture, g_3DModel.pMaterials[i].strFile, i);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 设置材质的纹理ID<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;g_3DModel.pMaterials[i].texureId = i;<br/>&#160;&#160;&#160;&#160;}<br/><br/>&#160;&#160;&#160;&#160;glEnable(GL_LIGHT0);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;glEnable(GL_LIGHTING);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;glEnable(GL_COLOR_MATERIAL);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/><br/>}<br/><br/>WPARAM MainLoop()<br/>{<br/>&#160;&#160;&#160;&#160;MSG msg;<br/><br/>&#160;&#160;&#160;&#160;while(1)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;{&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if (PeekMessage(&amp;msg, NULL, 0, 0, PM_REMOVE)) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(msg.message == WM_QUIT)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;break;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TranslateMessage(&amp;msg);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DispatchMessage(&amp;msg);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;else&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{ <br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;RenderScene();&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br/>&#160;&#160;&#160;&#160;}<br/><br/>&#160;&#160;&#160;&#160;// 遍历场景中所有的对象<br/>&#160;&#160;&#160;&#160;for(int i = 0; i &lt; g_3DModel.numOfObjects; i++)<br/>&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 删除所有的变量<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;del&#101;te [] g_3DModel.pObject[i].pFaces;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;del&#101;te [] g_3DModel.pObject[i].pNormals;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;del&#101;te [] g_3DModel.pObject[i].pVerts;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;del&#101;te [] g_3DModel.pObject[i].pTexVerts;<br/>&#160;&#160;&#160;&#160;}<br/><br/>&#160;&#160;&#160;&#160;DeInit();&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;return(msg.wParam);&#160;&#160;&#160;&#160;<br/>}<br/><br/>void RenderScene() <br/>{<br/>&#160;&#160;&#160;&#160;glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;glLoadIdentity();&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/><br/>&#160;&#160;&#160;&#160;gluLookAt(&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;0, 0.5f, 100,&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;0, 5.0f, -20,&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;0, 1, 0);<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;glRotatef(g_RotateX, 0, 1.0f, 0);<br/>&#160;&#160;&#160;&#160;g_RotateX += g_RotationSpeed;&#160;&#160;&#160;&#160;<br/><br/>&#160;&#160;&#160;&#160;// 遍历模型中所有的对象<br/>&#160;&#160;&#160;&#160;for(int i = 0; i &lt; g_3DModel.numOfObjects; i++)<br/>&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 如果对象的大小小于0，则退出<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(g_3DModel.pObject.size() &lt;= 0) break;<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 获得当前显示的对象<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;t3DObject *pObject = &amp;g_3DModel.pObject[i];<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 判断该对象是否有纹理映射<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(pObject-&gt;bHasTexture) {<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 打开纹理映射<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;glEnable(GL_TEXTURE_2D);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;glColor3ub(255, 255, 255);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;glBindTexture(GL_TEXTURE_2D, g_Texture[pObject-&gt;materialID]);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;} else {<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 关闭纹理映射<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;glDisable(GL_TEXTURE_2D);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;glColor3ub(255, 255, 255);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 开始以g_ViewMode模式绘制<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;glBegin(g_ViewMode);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 遍历所有的面<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;for(int j = 0; j &lt; pObject-&gt;numOfFaces; j++)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 遍历三角形的所有点<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;for(int whichVertex = 0; whichVertex &lt; 3; whichVertex++)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 获得面对每个点的索引<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;int index = pObject-&gt;pFaces[j].vertIndex[whichVertex];<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 给出法向量<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;glNormal3f(pObject-&gt;pNormals[ index ].x, pObject-&gt;pNormals[ index ].y, pObject-&gt;pNormals[ index ].z);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 如果对象具有纹理<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(pObject-&gt;bHasTexture) {<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 确定是否有UVW纹理坐标<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(pObject-&gt;pTexVerts) {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;glTexCoord2f(pObject-&gt;pTexVerts[ index ].x, pObject-&gt;pTexVerts[ index ].y);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;} else {<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(g_3DModel.pMaterials.size() &amp;&amp; pObject-&gt;materialID &gt;= 0) <br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;BYTE *pColor = g_3DModel.pMaterials[pObject-&gt;materialID].color;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;glColor3ub(pColor[0], pColor[1], pColor[2]);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;glVertex3f(pObject-&gt;pVerts[ index ].x, pObject-&gt;pVerts[ index ].y, pObject-&gt;pVerts[ index ].z);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;glEnd();&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 绘制结束<br/>&#160;&#160;&#160;&#160;}<br/><br/>&#160;&#160;&#160;&#160;SwapBuffers(g_hDC);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 交换缓冲区<br/>}<br/><br/>LRESULT CALLBACK WinProc(HWND hWnd,UINT uMsg, WPARAM wParam, LPARAM lParam)<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;LONG&nbsp;&nbsp;&nbsp;&nbsp;lRet = 0; <br/>&nbsp;&nbsp;&nbsp;&nbsp;PAINTSTRUCT&nbsp;&nbsp;&nbsp;&nbsp;ps;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;switch (uMsg)<br/>&#160;&#160;&#160;&#160;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;case WM_SIZE:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(!g_bFullScreen)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;SizeOpenGLScreen(LOWORD(lParam),HIWORD(lParam));<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;GetClientRect(hWnd, &amp;g_rRect);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; <br/> <br/>&#160;&#160;&#160;&#160;case WM_PAINT:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;BeginPaint(hWnd, &amp;ps);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;EndPaint(hWnd, &amp;ps);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;break;<br/><br/>&#160;&#160;&#160;&#160;case WM_LBUTTONDOWN:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 按下鼠标左键，改变绘制模式<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(g_ViewMode == GL_TRIANGLES) {&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;g_ViewMode = GL_LINE_STRIP;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;} else {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;g_ViewMode = GL_TRIANGLES;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;break;<br/><br/>&#160;&#160;&#160;&#160;case WM_RBUTTONDOWN:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 按下鼠标右键，改变光照模式<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;g_bLighting = !g_bLighting;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(g_bLighting) {&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;glEnable(GL_LIGHTING);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;} else {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;glDisable(GL_LIGHTING);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;break;<br/><br/>&#160;&#160;&#160;&#160;case WM_KEYDOWN:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 键盘响应<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;switch(wParam) {&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;case VK_ESCAPE:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 按下ESC键<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;PostQuitMessage(0);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;break;<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;case VK_LEFT:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 按下向左键<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;g_RotationSpeed -= 0.05f;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;break;<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;case VK_RIGHT:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 按下向右键<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;g_RotationSpeed += 0.05f;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;break;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;break;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;case WM_CLOSE:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PostQuitMessage(0);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; <br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;default:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lRet = DefWindowProc (hWnd, uMsg, wParam, lParam); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; <br/>&nbsp;&nbsp;&nbsp;&nbsp;} <br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;return lRet;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>}<br/><br/><br/><br/><br/><br/><br/>]]></description>
		</item>
		
			<item>
			<link>http://liuzaoxing.cn/article.asp?id=72</link>
			<title><![CDATA[Motorola Backflip/Enzo 多图曝光]]></title>
			<author>liuzaoxingseu@gmail.com(lzx)</author>
			<category><![CDATA[Technology]]></category>
			<pubDate>Fri,18 Dec 2009 16:18:01 +0800</pubDate>
			<guid>http://liuzaoxing.cn/default.asp?id=72</guid>
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Motorola Backflip/Enzo 应该是首款翻盖带QWERTY全键盘手机吧，设计非常另类。首先，关闭翻盖后键盘依然是裸露在外面的，翻开屏幕，屏幕后侧有一个类似于笔记本触摸板的东 西，不过对其是否实用表示怀疑。另外手机的摄像头和闪光灯都在键盘闪，这样是否意味着翻开键盘后，是否能用摄像头进行视频通话呢，拍照摄像视频聊天都用同 一个摄像头，创意真不错，不过打字的时候会不会挡住呢。<br/>配置:<br/>高通 MSM7201A 528 MHz CPU <br/>512 MB ROM <br/>256 MB RAM <br/>3.1 寸 分辨率为 320 x 480 (HVGA)的电容触摸屏 <br/>5 百万像素带闪光灯摄像头 <br/>WiFi / Bluetooth 2.0 / GPS <br/>搭载Android 1.5 Motoblur操作系统 <br/>频率为GSM 850/900/1800/1900；W-CDMA 850/900/1700/1900/2100 <br/>反向翻转键盘 <br/>定向触摸板(屏幕背面)<br/><br/><br/><br/><img src="http://liuzaoxing.cn/attachments/month_0912/a20091218161645.jpg" border="0" alt=""/><br/><img src="http://liuzaoxing.cn/attachments/month_0912/420091218161650.jpg" border="0" alt=""/><br/><img src="http://liuzaoxing.cn/attachments/month_0912/920091218161655.jpg" border="0" alt=""/><br/><img src="http://liuzaoxing.cn/attachments/month_0912/72009121816171.jpg" border="0" alt=""/><br/><img src="http://liuzaoxing.cn/attachments/month_0912/y20091218161724.jpg" border="0" alt=""/><br/><img src="http://liuzaoxing.cn/attachments/month_0912/320091218161728.jpg" border="0" alt=""/><br/><br/>]]></description>
		</item>
		
			<item>
			<link>http://liuzaoxing.cn/article.asp?id=71</link>
			<title><![CDATA[基于Android 2.1的Sense界面已被移植上G1]]></title>
			<author>liuzaoxingseu@gmail.com(lzx)</author>
			<category><![CDATA[Technology]]></category>
			<pubDate>Wed,02 Dec 2009 21:00:47 +0800</pubDate>
			<guid>http://liuzaoxing.cn/default.asp?id=71</guid>
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;经过国外Hack Drizzy 和 国人Xdan等 人的努力，全中文界面基于Android 2.1的Sense UI界面已经成功装入最古老的Android手机-G1里，并且良好运行。这个么说来官方装有HTC Sense UI的手机，包括原版的HTC Hero、CDMA版的Spirit Hero、以及HTC Eris都将跳过Android 1.6和Android 2.0 直接升级至Android 2.1。<br/><img src="http://liuzaoxing.cn/attachments/month_0912/x2009122205846.jpg" border="0" alt=""/><br/><br/>关于Android 2.1 Sense UI的内容有：<br/>1.增加电源widget好看多了(这个在Android1.6里就有了，除了HTC Tattoo之外没有在其他使用Sense UI的手机上使用)<br/>2.可以同时绑定多个Google账号<br/>3.更快的运行和加载速度<br/>4.设置里增加Personalize功能<br/>5.无线控件里有了VPN设置，之前1.5的Sense UI里没有的<br/>6.增加Mobile network sharing<br/>7.声音和显示选择增加的重力感应校准<br/>8.Location和Privacy<br/>9.Connect to PC设置<br/>10.文字到语音转换<br/>11.新的拨号界面，按键更大，更易于操作<br/>12.更多桌面插件<br/>13.新的Google地图<br/>14.新的浏览器<br/>15.全局搜索<br/>15.全新的Market<br/>……<br/>更多截图：<br/><img src="http://liuzaoxing.cn/attachments/month_0912/72009122205950.jpg" border="0" alt=""/><br/><img src="http://liuzaoxing.cn/attachments/month_0912/s2009122205955.jpg" border="0" alt=""/><br/><img src="http://liuzaoxing.cn/attachments/month_0912/k20091222103.png" border="0" alt=""/><br/><img src="http://liuzaoxing.cn/attachments/month_0912/v20091222108.jpg" border="0" alt=""/><br/><img src="http://liuzaoxing.cn/attachments/month_0912/b200912221015.jpg" border="0" alt=""/><br/><img src="http://liuzaoxing.cn/attachments/month_0912/k200912221020.jpg" border="0" alt=""/><br/><img src="http://liuzaoxing.cn/attachments/month_0912/y200912221026.jpg" border="0" alt=""/><br/><img src="http://liuzaoxing.cn/attachments/month_0912/n200912221033.jpg" border="0" alt=""/><br/><img src="http://liuzaoxing.cn/attachments/month_0912/4200912221038.jpg" border="0" alt=""/><br/><img src="http://liuzaoxing.cn/attachments/month_0912/p200912221044.jpg" border="0" alt=""/><br/>]]></description>
		</item>
		
			<item>
			<link>http://liuzaoxing.cn/article.asp?id=70</link>
			<title><![CDATA[组织一次苹果、Thinkpad高档笔记本团购，详细见内，欢迎联系，一个月内有效]]></title>
			<author>liuzaoxingseu@gmail.com(lzx)</author>
			<category><![CDATA[Technology]]></category>
			<pubDate>Mon,12 Oct 2009 13:21:43 +0800</pubDate>
			<guid>http://liuzaoxing.cn/default.asp?id=70</guid>
		<description><![CDATA[全部为港行和新加坡行货，质量均优于欧水和大陆行，有些高配的大陆行货没有。<br/><br/>质量尽可放心，所有配件均是原厂出厂配置，品质绝对保证。苹果系列可以享受全国联保，Thinkpad整机保修一年。正规发票没有问题，开正规含税发票加税钱400元，开不开发票不影响保修。提供基本的软件支持，免费安装Windows XP，OEM版Windows Vista旗舰版，OEM版Windows 7旗舰版。<br/><br/>十一后笔记本出货量骤减，很多型号都没有货，这批苹果和Thinkpad十一后刚入关，渠道商分销，团购价格如下所示，5台以上我就去拿货，有意咨询请联系QQ301086252，参与讨论请加入QQ群4596582。<br/><br/>PS：请不要拿所谓的XXX报价来说，在南京，这个价格品质保证，利润更是极低，非heyong、xuze之流的卖场价格。<br/><br/>详细配置EXECL文件：<a target="_blank" href="http://liuzaoxing.cn/price.xls" rel="external">http://liuzaoxing.cn/price.xls</a><br/> &#160;&#160;&#160;&#160;机型&#160;&#160;&#160;&#160;价格&#160;&#160;&#160;&#160;CPU&#160;&#160;&#160;&#160;内存&#160;&#160;&#160;&#160;硬盘&#160;&#160;&#160;&#160;LCD&#160;&#160;&#160;&#160;显卡&#160;&#160;&#160;&#160;通讯/端口&#160;&#160;&#160;&#160;光软&#160;&#160;&#160;&#160;系统<br/> &#160;&#160;&#160;&#160;X200 DU2(推荐）&#160;&#160;&#160;&#160;6999&#160;&#160;&#160;&#160;P8700 2.53G&#160;&#160;&#160;&#160;2G&#160;&#160;&#160;&#160;250G 5400&#160;&#160;&#160;&#160;12.1WXGA(1280X800)&#160;&#160;&#160;&#160;intel X4500&#160;&#160;&#160;&#160;802.11n/蓝牙/指纹/摄像头/4芯/新加坡&#160;&#160;&#160;&#160;选购&#160;&#160;&#160;&#160;DOS<br/>X200 PN6&#160;&#160;&#160;&#160;7099&#160;&#160;&#160;&#160;P8700 2.53G&#160;&#160;&#160;&#160;2G&#160;&#160;&#160;&#160;250G 5400&#160;&#160;&#160;&#160;12.1WXGA(1280X800)&#160;&#160;&#160;&#160;intel X4500&#160;&#160;&#160;&#160;802.11n/蓝牙/指纹/摄像头/6芯/香港&#160;&#160;&#160;&#160;选购&#160;&#160;&#160;&#160;DOS<br/>X200 CV3/CTO&#160;&#160;&#160;&#160;7299&#160;&#160;&#160;&#160;P8700 2.53G&#160;&#160;&#160;&#160;2G&#160;&#160;&#160;&#160;320G 5400&#160;&#160;&#160;&#160;12.1WXGA(1280X800)&#160;&#160;&#160;&#160;intel X4500&#160;&#160;&#160;&#160;802.11n/蓝牙/指纹/摄像头/讯盘/6芯/新加坡&#160;&#160;&#160;&#160;选购&#160;&#160;&#160;&#160;DOS<br/>X200 CTO&#160;&#160;&#160;&#160;7350&#160;&#160;&#160;&#160;P8700 2.53G&#160;&#160;&#160;&#160;2G&#160;&#160;&#160;&#160;320G 7200&#160;&#160;&#160;&#160;12.1WXGA(1280X800)&#160;&#160;&#160;&#160;intel X4500&#160;&#160;&#160;&#160;802.11n/蓝牙/指纹/摄像头/6芯/新加坡&#160;&#160;&#160;&#160;选购&#160;&#160;&#160;&#160;DOS<br/>X200 PE5(推荐）&#160;&#160;&#160;&#160;7450&#160;&#160;&#160;&#160;P8700 2.53G&#160;&#160;&#160;&#160;4G&#160;&#160;&#160;&#160;320G 7200&#160;&#160;&#160;&#160;12.1WXGA(1280X800)&#160;&#160;&#160;&#160;intel X4500&#160;&#160;&#160;&#160;802.11n/蓝牙/指纹/摄像头/6芯/香港&#160;&#160;&#160;&#160;选购&#160;&#160;&#160;&#160;DOS<br/>X200 BJ3/CTO&#160;&#160;&#160;&#160;8200&#160;&#160;&#160;&#160;T9550 2.66G&#160;&#160;&#160;&#160;2G&#160;&#160;&#160;&#160;320G 7200&#160;&#160;&#160;&#160;12.1WXGA(1280X800)&#160;&#160;&#160;&#160;intel X4500&#160;&#160;&#160;&#160;802.11n/蓝牙/指纹/摄像头/讯盘/6芯/新加坡&#160;&#160;&#160;&#160;选购&#160;&#160;&#160;&#160;DOS<br/>X200S RN3&#160;&#160;&#160;&#160;8399&#160;&#160;&#160;&#160;SL9400 1.86G&#160;&#160;&#160;&#160;4G&#160;&#160;&#160;&#160;320G 7200&#160;&#160;&#160;&#160;12.1WXGA(1280X800)&#160;&#160;&#160;&#160;intel X4500&#160;&#160;&#160;&#160;802.11n/蓝牙/指纹/6芯/香港&#160;&#160;&#160;&#160;选购&#160;&#160;&#160;&#160;DOS<br/>X200T CTO&#160;&#160;&#160;&#160;10999&#160;&#160;&#160;&#160;SL9600 2.13G&#160;&#160;&#160;&#160;2G&#160;&#160;&#160;&#160;320G 5400&#160;&#160;&#160;&#160;12.1WXGA(1280X800)&#160;&#160;&#160;&#160;intel X4500&#160;&#160;&#160;&#160;802.11g/蓝牙/指纹/摄像头/笔触/8芯/香港&#160;&#160;&#160;&#160;选购&#160;&#160;&#160;&#160;DOS<br/>X200T CTO&#160;&#160;&#160;&#160;12400&#160;&#160;&#160;&#160;SL9600 2.13G&#160;&#160;&#160;&#160;2G&#160;&#160;&#160;&#160;320G 5400&#160;&#160;&#160;&#160;12.1LED(1280X800)&#160;&#160;&#160;&#160;intel X4500&#160;&#160;&#160;&#160;802.11g/蓝牙/指纹/摄像头/8芯/手触/香港&#160;&#160;&#160;&#160;选购&#160;&#160;&#160;&#160;DOS<br/>X301&nbsp;&nbsp;RS9&#160;&#160;&#160;&#160;12200&#160;&#160;&#160;&#160;SU9600 1.6G&#160;&#160;&#160;&#160;2G&#160;&#160;&#160;&#160;250G 5400&#160;&#160;&#160;&#160;13.3LED(1440X900)&#160;&#160;&#160;&#160;intel X4500&#160;&#160;&#160;&#160;802.11n/蓝牙/指纹/摄像头/讯盘2G/3芯/香港&#160;&#160;&#160;&#160;DVDRW&#160;&#160;&#160;&#160;DOS<br/> &#160;&#160;&#160;&#160;T400 R29(推荐）&#160;&#160;&#160;&#160;6950&#160;&#160;&#160;&#160;P8700 2.53G&#160;&#160;&#160;&#160;2G&#160;&#160;&#160;&#160;250G 5400&#160;&#160;&#160;&#160;14.1WXGA(1280X800)&#160;&#160;&#160;&#160;256M ATI HD3470&#160;&#160;&#160;&#160;802.11n/蓝牙/指纹/摄像头/6芯/香港&#160;&#160;&#160;&#160;COMBO&#160;&#160;&#160;&#160;DOS<br/> &#160;&#160;&#160;&#160;T400 R15（推荐）7600&#160;&#160;&#160;&#160;7750&#160;&#160;&#160;&#160;P8700 2.53G &#160;&#160;&#160;&#160;2G&#160;&#160;&#160;&#160;250G 5400&#160;&#160;&#160;&#160;14.1LED(1440X900)&#160;&#160;&#160;&#160;256M ATI HD3470&#160;&#160;&#160;&#160;802.11n/蓝牙/指纹/摄像头/6芯/香港&#160;&#160;&#160;&#160;DVDRW&#160;&#160;&#160;&#160;DOS<br/> &#160;&#160;&#160;&#160;T400 AJ1(推荐）&#160;&#160;&#160;&#160;8099&#160;&#160;&#160;&#160;P8700 2.53G&#160;&#160;&#160;&#160;2G&#160;&#160;&#160;&#160;320G 7200&#160;&#160;&#160;&#160;14.1LED(1440X900)&#160;&#160;&#160;&#160;256M ATI HD3470&#160;&#160;&#160;&#160;802.11n/蓝牙/指纹/摄像头/迅盘/6芯/新加坡&#160;&#160;&#160;&#160;DVDRW&#160;&#160;&#160;&#160;DOS<br/> &#160;&#160;&#160;&#160;T400 PV7&#160;&#160;&#160;&#160;8399&#160;&#160;&#160;&#160;P8800 2.66G&#160;&#160;&#160;&#160;2G&#160;&#160;&#160;&#160;320G 5400&#160;&#160;&#160;&#160;14.1LED(1440X900)&#160;&#160;&#160;&#160;256M ATI HD3470&#160;&#160;&#160;&#160;802.11n/蓝牙/指纹/摄像头/6芯/香港&#160;&#160;&#160;&#160;DVDRW&#160;&#160;&#160;&#160;DOS<br/> &#160;&#160;&#160;&#160;T400 PV8&#160;&#160;&#160;&#160;7700&#160;&#160;&#160;&#160;P8800 2.66G&#160;&#160;&#160;&#160;2G&#160;&#160;&#160;&#160;320G 5400&#160;&#160;&#160;&#160;14.1WXGA(1440X900)&#160;&#160;&#160;&#160;256M ATI HD3470&#160;&#160;&#160;&#160;802.11n/蓝牙/指纹/摄像头/6芯/香港&#160;&#160;&#160;&#160;DVDRW&#160;&#160;&#160;&#160;DOS<br/> &#160;&#160;&#160;&#160;T400 R38&#160;&#160;&#160;&#160;9699&#160;&#160;&#160;&#160;P9600 2.66G&#160;&#160;&#160;&#160;2G&#160;&#160;&#160;&#160;500G 5400&#160;&#160;&#160;&#160;14.1LED(1440X900)&#160;&#160;&#160;&#160;256M ATI HD3470&#160;&#160;&#160;&#160;802.11ag/蓝牙/指纹/摄像头/迅盘/9芯/香港&#160;&#160;&#160;&#160;DVDRW&#160;&#160;&#160;&#160;DOS<br/>T400 PU2&#160;&#160;&#160;&#160;9750&#160;&#160;&#160;&#160;P9700 2.8G&#160;&#160;&#160;&#160;4G&#160;&#160;&#160;&#160;320G 7200&#160;&#160;&#160;&#160;14.1LED(1440X900)&#160;&#160;&#160;&#160;256M ATI HD3470&#160;&#160;&#160;&#160;802.11n/蓝牙/指纹/摄像头/6芯/香港&#160;&#160;&#160;&#160;DVDRW&#160;&#160;&#160;&#160;DOS<br/>T400S RW1&#160;&#160;&#160;&#160;10300&#160;&#160;&#160;&#160;SP9400 2.4G&#160;&#160;&#160;&#160;4G&#160;&#160;&#160;&#160;250G 5400&#160;&#160;&#160;&#160;14.1LED(1440X900)&#160;&#160;&#160;&#160;intel X4500&#160;&#160;&#160;&#160;802.11n/蓝牙/指纹/摄像头/6芯/香港&#160;&#160;&#160;&#160;DVDRW&#160;&#160;&#160;&#160;DOS<br/>T400S RZ6&#160;&#160;&#160;&#160;10400&#160;&#160;&#160;&#160;SP9400 2.4G&#160;&#160;&#160;&#160;2G&#160;&#160;&#160;&#160;250G 5400&#160;&#160;&#160;&#160;14.1LED(1440X900)&#160;&#160;&#160;&#160;intel X4500&#160;&#160;&#160;&#160;802.11ag/蓝牙/指纹/摄像头/迅盘/6芯/香港&#160;&#160;&#160;&#160;DVDRW&#160;&#160;&#160;&#160;DOS<br/>T400S RY6&#160;&#160;&#160;&#160;12200&#160;&#160;&#160;&#160;SP9400 2.4G&#160;&#160;&#160;&#160;2G&#160;&#160;&#160;&#160;128G SSD&#160;&#160;&#160;&#160;14.1LED(1440X900)&#160;&#160;&#160;&#160;intel X4500&#160;&#160;&#160;&#160;802.11ag/蓝牙/指纹/摄像头/迅盘/6芯/香港&#160;&#160;&#160;&#160;DVDRW&#160;&#160;&#160;&#160;DOS<br/>T500 CTO&#160;&#160;&#160;&#160;8750&#160;&#160;&#160;&#160;P8700 2.53G&#160;&#160;&#160;&#160;2G&#160;&#160;&#160;&#160;320G 5400&#160;&#160;&#160;&#160;15.4WSXGA+(1680X1050)&#160;&#160;&#160;&#160;256M ATI HD3650&#160;&#160;&#160;&#160;802.11n/蓝牙/指纹/摄像头/迅盘/6芯/香港&#160;&#160;&#160;&#160;DVDRW&#160;&#160;&#160;&#160;DOS<br/>W500 CTO&#160;&#160;&#160;&#160;9950&#160;&#160;&#160;&#160;T9600 2.8G&#160;&#160;&#160;&#160;4G&#160;&#160;&#160;&#160;320G 5400&#160;&#160;&#160;&#160;15.4WSXGA+(1680X1050)&#160;&#160;&#160;&#160;512M ATI V5700&#160;&#160;&#160;&#160;802.11n/蓝牙/指纹/摄像头/6芯/香港&#160;&#160;&#160;&#160;DVDRW&#160;&#160;&#160;&#160;DOS<br/>W500 RN4&#160;&#160;&#160;&#160;10600&#160;&#160;&#160;&#160;T9600 2.8G&#160;&#160;&#160;&#160;4G&#160;&#160;&#160;&#160;320G 7200&#160;&#160;&#160;&#160;15.4WSXGA+(1680X1050)&#160;&#160;&#160;&#160;512M ATI V5700&#160;&#160;&#160;&#160;802.11n/蓝牙/指纹/摄像头/9芯/香港&#160;&#160;&#160;&#160;DVDRW&#160;&#160;&#160;&#160;DOS<br/>W700 RZ4&#160;&#160;&#160;&#160;18000&#160;&#160;&#160;&#160;T9600 2.8G&#160;&#160;&#160;&#160;4G&#160;&#160;&#160;&#160;320G*2 5400&#160;&#160;&#160;&#160;17WUXGA(1920X1200)&#160;&#160;&#160;&#160;1G Nvidia Fx3700m&#160;&#160;&#160;&#160;802.11n/蓝牙/指纹/摄像头/迅盘/9芯/香港&#160;&#160;&#160;&#160;Bluray&#160;&#160;&#160;&#160;Vista<br/>苹果<br/>&#160;&#160;&#160;&#160;MC240(纯白）&#160;&#160;&#160;&#160;7398&#160;&#160;&#160;&#160;P7450 2.13G&#160;&#160;&#160;&#160;2G&#160;&#160;&#160;&#160;160G 5400&#160;&#160;&#160;&#160;13.3WXGA(1280X800)&#160;&#160;&#160;&#160;NVIDIA GeForce&#160;&#160;&#160;&#160;Magsafe电源端口，两个USB2.0端口，Mini DVI，isight摄像头&#160;&#160;&#160;&#160;DVDRW&#160;&#160;&#160;&#160;Mac<br/>MC233（Air）&#160;&#160;&#160;&#160;10950&#160;&#160;&#160;&#160;SL9400 1.86G&#160;&#160;&#160;&#160;2G&#160;&#160;&#160;&#160;120G 4200&#160;&#160;&#160;&#160;13.3LED(1280X800)&#160;&#160;&#160;&#160;NVIDIA GeForce&#160;&#160;&#160;&#160;Magsafe电源端口，两个USB2.0端口，Mini DVI，isight摄像头&#160;&#160;&#160;&#160;光驱另选&#160;&#160;&#160;&#160;Mac<br/>MC234（Air）&#160;&#160;&#160;&#160;13100&#160;&#160;&#160;&#160;SL9600 2.13G&#160;&#160;&#160;&#160;2G&#160;&#160;&#160;&#160;128G SSD&#160;&#160;&#160;&#160;13.3LED(1280X800)&#160;&#160;&#160;&#160;NVIDIA GeForce&#160;&#160;&#160;&#160;Magsafe电源端口，两个USB2.0端口，Mini DVI，isight摄像头&#160;&#160;&#160;&#160;光驱另选&#160;&#160;&#160;&#160;Mac<br/>MB990&#160;&#160;&#160;&#160;8700&#160;&#160;&#160;&#160;P7550 2.26G&#160;&#160;&#160;&#160;2G&#160;&#160;&#160;&#160;160G 5400&#160;&#160;&#160;&#160;13.3LED(1280X800)&#160;&#160;&#160;&#160;NVIDIA GeForce&#160;&#160;&#160;&#160;Magsafe电源端口，两个USB2.0端口，Mini DVI，isight摄像头&#160;&#160;&#160;&#160;DVDRW&#160;&#160;&#160;&#160;Mac<br/>MC118&#160;&#160;&#160;&#160;12200&#160;&#160;&#160;&#160;P8700 2.53G&#160;&#160;&#160;&#160;4G&#160;&#160;&#160;&#160;250G 5400&#160;&#160;&#160;&#160;15.4LED(1440X900)&#160;&#160;&#160;&#160;256M NVS 9400M&#160;&#160;&#160;&#160;Magsafe电源端口，两个USB2.0端口，Mini DVI，isight摄像头&#160;&#160;&#160;&#160;DVDRW&#160;&#160;&#160;&#160;Mac<br/>MB991&#160;&#160;&#160;&#160;10700&#160;&#160;&#160;&#160;P8700 2.4G&#160;&#160;&#160;&#160;4G&#160;&#160;&#160;&#160;250G 5400&#160;&#160;&#160;&#160;13.3LED(1280X800)&#160;&#160;&#160;&#160;256M NVS 9400M&#160;&#160;&#160;&#160;Magsafe电源端口，两个USB2.0端口，Mini DVI，isight摄像头&#160;&#160;&#160;&#160;DVDRW&#160;&#160;&#160;&#160;Mac<br/>MB985&#160;&#160;&#160;&#160;15800&#160;&#160;&#160;&#160;T9600 2.8G&#160;&#160;&#160;&#160;4G&#160;&#160;&#160;&#160;500G 5400&#160;&#160;&#160;&#160;15.4LED(1440X900)&#160;&#160;&#160;&#160;512M NVS 9600MGT&#160;&#160;&#160;&#160;Magsafe电源端口，两个USB2.0端口，Mini DVI，isight摄像头&#160;&#160;&#160;&#160;DVDRW&#160;&#160;&#160;&#160;Mac<br/>MB985&#160;&#160;&#160;&#160;13999&#160;&#160;&#160;&#160;B8800 2.66G&#160;&#160;&#160;&#160;4G&#160;&#160;&#160;&#160;320G 5400&#160;&#160;&#160;&#160;15.4LED(1440X900)&#160;&#160;&#160;&#160;512M NVS 9600MGT&#160;&#160;&#160;&#160;Magsafe电源端口，两个USB2.0端口，Mini DVI，isight摄像头&#160;&#160;&#160;&#160;DVDRW&#160;&#160;&#160;&#160;Mac<br/><br/><br/><br/>]]></description>
		</item>
		
			<item>
			<link>http://liuzaoxing.cn/article.asp?id=69</link>
			<title><![CDATA[“Courier”系列超酷平板笔记本电脑原型]]></title>
			<author>liuzaoxingseu@gmail.com(lzx)</author>
			<category><![CDATA[Technology]]></category>
			<pubDate>Wed,23 Sep 2009 22:47:54 +0800</pubDate>
			<guid>http://liuzaoxing.cn/default.asp?id=69</guid>
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 业内最近风传微软将要推出自己的平板产品和苹果做一次正面对抗,微软的平板和MID意义不同,它采用两个7英寸多功能触摸显示器拼合而成,这一款产品更像是一本电子书.显示面积很大,支持手写笔,背面也有300万像素摄像头,支持感应无线充电,微软表示目前这种设备仅仅是一种原型,并未投产,发布日期,技术细节也一概不知.<br/><img src="http://liuzaoxing.cn/attachments/month_0909/c200992322473.jpg" border="0" alt=""/><br/><img src="http://liuzaoxing.cn/attachments/month_0909/s2009923224712.jpg" border="0" alt=""/><br/><img src="http://liuzaoxing.cn/attachments/month_0909/a2009923224720.jpg" border="0" alt=""/><br/><img src="http://liuzaoxing.cn/attachments/month_0909/h2009923224729.jpg" border="0" alt=""/><br/><img src="http://liuzaoxing.cn/attachments/month_0909/m2009923224736.jpg" border="0" alt=""/><br/><img src="http://liuzaoxing.cn/attachments/month_0909/f2009923224743.jpg" border="0" alt=""/><br/><img src="http://liuzaoxing.cn/attachments/month_0909/b2009923224750.jpg" border="0" alt=""/><br/>]]></description>
		</item>
		
			<item>
			<link>http://liuzaoxing.cn/article.asp?id=68</link>
			<title><![CDATA[让人恐惧的聊天工具和邮件系统监控]]></title>
			<author>liuzaoxingseu@gmail.com(lzx)</author>
			<category><![CDATA[Personal Growth]]></category>
			<pubDate>Thu,10 Sep 2009 10:44:35 +0800</pubDate>
			<guid>http://liuzaoxing.cn/default.asp?id=68</guid>
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最近我看到了两篇老文章，里面写着关于QQ、MSN、SKYPE和QQ邮箱的监控过滤能力，看得我真是心惊肉跳啊，像我这种翻墙翻惯了，经常使用QQ、MSN传一些新闻的人，真是感到GFW和“绿坝”之类的东西简直无处不在。这两篇文章的地址是：<a href="http://www.kenengba.com/post/533.html" target="_blank" rel="external">http://www.kenengba.com/post/533.html</a>&nbsp;&nbsp; <a href="http://www.kenengba.com/post/781.html" target="_blank" rel="external">http://www.kenengba.com/post/781.html</a><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这样真的不是真正的好的做法，左一个限制，右一个河蟹，这样只会适得其反，借以掩饰什么？个人觉得真正的和谐可不是这样出来的，这种做法就好似掩耳盗铃，以为一个GFW就真正封锁互联网了吗？这样只会让网民对自己获取的信息产生极大的怀疑，对墙外的宣传更加好奇，拼命地要翻出墙去，对墙外的信息深信不疑，大受鼓动..........<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;qq也是那种有图片过滤的功能，我用QQ截图随便接了一个有死人的图片，发送给别人显示的就是XX，但是换了一张正常图片又能显示。不知道哪一天，虽然Gmail很好，https很好，不过，如果到哪天所有XX分子都用Gmail，我相信，和Google相关的东西都得被“您的链接已重置”，ZF在这个方面上是绝对肯投钱的。。。]]></description>
		</item>
		
			<item>
			<link>http://liuzaoxing.cn/article.asp?id=67</link>
			<title><![CDATA[用MSF开发流程开发，微软解决方案]]></title>
			<author>liuzaoxingseu@gmail.com(lzx)</author>
			<category><![CDATA[Programing]]></category>
			<pubDate>Thu,03 Sep 2009 15:43:05 +0800</pubDate>
			<guid>http://liuzaoxing.cn/default.asp?id=67</guid>
		<description><![CDATA[微软解决方案框架过程--构思阶段 Microsoft Solutions Framework Process - Envisioning Phase<br/><br/>构思过程Envisioning Process<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;* 组建团队 Setting up the team<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 定义项目结构 Defining the project structure<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 定义商业目标 Defining the business goals<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 评估时局 Assessing the current situation<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 创建一个远景声明、定义项目的范围 Creating a vision statement and defining the scope of the project<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 备注：共享的而且可以清晰描述的远景是项目的成功的基本要素。NOTE: A shared and clearly articulated vision is fundamental to the success of the project.<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 定义需求和用户概况 Defining requirements and user profiles<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 开发一个解决方案体系 Developing a solution concept<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 评估风险 Assessing risk<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 关闭构思阶段 Closing the envisioning phase<br/><br/>里程碑 Milestones<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;* 核心团队组织 Core team o&#114;ganized<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 远景与范围的创建 Vision/scope cr&#101;ated<br/><br/>交付物 Deliverables<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;* 远景与范围定义 Vision/scope<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 问题陈述和商业目标 Problem statements and business objectives<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 现有的过程的重审 A review of existing processes<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 主要用户需求 A broad definition of user requirements<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 用户概况标志项目受益人 User profiles identifying who will benefit from the solution<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 一个远景声明和范围定义 A vision statement and scope definition<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 解决方案内容描述项目的计划步骤 The solution concept outlining the approach the team will take to plan the project<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 解决设计策略 Solution design strategies<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 项目结构 Project structure<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 所有MSF团队成员角色定义及相应团队成员列表 A description of all MSF team roles and a list of corresponding team members<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 项目结构文档和团队遵循的过程标准 A project structure and process standards for the team to follow<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 风险评估 Risk assessment<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 一种初步的风险评估&nbsp;&nbsp;A preliminary risk assessment<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 主要风险列表 A list of the primary identified risks<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 将减轻或者消除风险的对策做入项目计划 Plans for mitigating o&#114; eliminating the identified risks<br/><br/>微软解决方案框架过程--计划制订阶段 Microsoft Solutions Framework Process - Planning Phase<br/><br/>设计阶段 Design Stages<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;* 概要设计 Conceptual design<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 逻辑设计 Logical design<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 物理设计 Physical design<br/><br/>设计过程 Design Process<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;* 设计解决方案和架构 Developing the solution design and architecture<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 创建功能规格说明书 Creating the functional specification<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 制订项目计划 Developing project plans<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 创建项目时间表 Creating project schedules<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 创建开发，测试，和运行环境 Creating the development, testing, and staging environments<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 关闭计划制订阶段 Closing the planning phase<br/><br/>里程碑 Milestones<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;* 完成技术验证 Technology validation complete<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 完成功能规格说明书 Functional specification complete<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 完成主项目计划 Master plan complete<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 完成主项目时间表 Master project schedule complete<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 开发和测试环境配置成功 Development and test environments configured<br/><br/>交付物 Deliverables<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;* 功能规格说明书 Functional specification<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 风险管理计划 Risk management plan<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 主项目计划和主项目时间表 Master project plan and master project schedule<br/><br/>微软解决方案框架过程--开发阶段 Microsoft Solutions Framework Process - Developing Phase<br/><br/>开发过程 Development Process<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;* 开始开发周期 Starting the development cycle<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 创建程序原型 Creating a prototype application<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 开发解决方案组件 Developing the solution components<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 构建解决方案 Building the solution<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 关闭开发阶段 Closing the developing phase<br/><br/>里程碑 Milestones<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;* 完成用于概念验证的程序 Proof-of-concept application complete<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 内部构建成功 Internal builds complete<br/><br/>交付物 Deliverables<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;* 源代码和可执行文件 Source code and executable files<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 用于部署的安装脚本和配置 Installation scripts and configuration settings for deployment<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 最终版功能规格说明书 Finalized functional specification<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 性能支持 Performance support elements<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 测试规格说明书和测试用例 Test specifications and test cases<br/><br/>微软解决方案框架过程--稳定阶段 Microsoft Solutions Framework Process - Stabilizing Phase<br/><br/>稳定性过程 Stabilization Process<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;* 测试解决方案 Testing the solution<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o 组件测试 Component testing<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o 数据库测试 Database testing<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o 基础架构测试 Infrastructure testing<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o 安全测试 Security testing<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o 用户接受和可用性测试 User acceptance and usability testing<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o 压力，容量，和性能试验 Stress, capacity, and performance testing<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o 回归测试 Regression testing<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o 记录BUG的数量 Recording the number of bugs<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 实施飞行员 Conducting the pilot<br/><br/>里程碑 Milestones<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;* BUG收敛 Bug convergence<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 零错误反弹 Zero-bug release<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 发布候选版本 Release candidates<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 黄金版发布 Golden release<br/><br/>交付物 Deliverables<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;* 最终版本发布 Final release<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 发布的说明 Release notes<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 性能支持要素Performance support elements<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 测试结果和测试工具 Test results and testing tools<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 源代码和可执行文件 Source code and executable files<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 项目文件 Project documents<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 里程碑评审 Milestone review<br/><br/>微软解决方案框架过程--部署阶段 Microsoft Solutions Framework Process - Deploying Phase<br/><br/>部署过程 Deployment Process<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;* 完成部署和运营过程 Completion of deployment and operations procedures<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 部署和稳定 Deployment and stabilization<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 项目评审 Project review<br/><br/>里程碑 Milestones<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;* 核心组件的部署 Core components deployed<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 站点部署完成 Site deployments complete<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 稳定的部署 Deployment stable<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 完全的部署 Deployment complete<br/><br/>交付物 Deliverables<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;* 操作和支持信息 Operation and support information<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o 程序和过程 Procedures and processes<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o 知识库，报告，和日志 Knowledge base, reports, and logbooks<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 包含项目期间部署的所有版本的文档和代码的文档库 Documentation repository for all versions of documents and code deployed during the project<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 培训计划 A training plan<br/>&nbsp;&nbsp;&nbsp;&nbsp;* 项目总结报告 Project completion report<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o 所有项目文件的最终版本 Final versions of all project documents<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o 客户满意数据 Customer satisfaction data<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o 定义接下来的步骤 Definition of next steps<br/><br/>]]></description>
		</item>
		
			<item>
			<link>http://liuzaoxing.cn/article.asp?id=66</link>
			<title><![CDATA[ Mac OS X Leopard 高清安装视频教程 ]]></title>
			<author>liuzaoxingseu@gmail.com(lzx)</author>
			<category><![CDATA[Technology]]></category>
			<pubDate>Thu,03 Sep 2009 15:41:08 +0800</pubDate>
			<guid>http://liuzaoxing.cn/default.asp?id=66</guid>
		<description><![CDATA[<div class="UBBPanel"><div class="UBBTitle"><img src="http://liuzaoxing.cn/images/flash.gif" alt="" style="margin:0px 2px -3px 0px" border="0"/>Flash动画</div><div class="UBBContent"><a id="temp50095_href" href="http://liuzaoxing.cn/javascript:MediaShow('swf','temp50095','http://player.youku.com/player.php/sid/XMTE2NzY0MjM2/v.swf','400','300')"><img name="temp50095_img" src="http://liuzaoxing.cn/images/mm_snd.gif" style="margin:0px 3px -2px 0px" border="0" alt=""/><span id="temp50095_text">在线播放</span></a><div id="temp50095"></div></div></div>]]></description>
		</item>
		
</channel>
</rss>
