﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Richard He-文章分类-OGRE</title><link>http://www.cppblog.com/richardhe/category/7539.html</link><description>学无止境!永远学下去!</description><language>zh-cn</language><lastBuildDate>Wed, 01 Jul 2009 08:58:41 GMT</lastBuildDate><pubDate>Wed, 01 Jul 2009 08:58:41 GMT</pubDate><ttl>60</ttl><item><title>Ogre源码剖析3–可扩展性&amp;插件机制</title><link>http://www.cppblog.com/richardhe/articles/88911.html</link><dc:creator>RichardHe</dc:creator><author>RichardHe</author><pubDate>Wed, 01 Jul 2009 05:54:00 GMT</pubDate><guid>http://www.cppblog.com/richardhe/articles/88911.html</guid><wfw:comment>http://www.cppblog.com/richardhe/comments/88911.html</wfw:comment><comments>http://www.cppblog.com/richardhe/articles/88911.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/richardhe/comments/commentRss/88911.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/richardhe/services/trackbacks/88911.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">Ogre源码剖析3&#8211;可扩展性</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">插件机制<br><br>&nbsp;<br><br>Ogre是一个跨操作系统平台的开源3D引擎，既支持DirectX，也支持使用OpenGL，支持可替换的场景管理算法（BSP,&nbsp;OCT）。为Ogre提供这些灵活可扩展性的基础之一就是其面向插件的设计。<br><br>&nbsp;<br><br>很多常用的软件大都提供了插件接口，用以扩展应用程序设计者最初未想到的功能，比较常见的譬如PhotoShop的滤镜，After&nbsp;Effect中的各种插件（最有名的比如shine），3dMax的插件譬如渲染器，魔兽世界的辅助插件等等。<br><br>通常，插件本身通常也需要实现主应用程序所需要的必要接口，从而使得插件可以被应用程序加载执行。此外，插件的实现也需要由主应用程序提供一些接口api，通过这些接口，插件可以对主应用程序的功能进行调用。<br><br>插件可以是动态链接库（win32平台上为DLL文件），也可以是以脚本的形式提供的，比如魔兽世界中的插件就是使用lua编写的，插件也可能是某种应用程序自定义的文件，只要该应用程序提供了创建该类文件的方法并实现解析、执行功能即可。（不同的实现形式各有利弊，具体需要参考插件及应用程序所处的运行环境进行取舍）<br><br>采用插件的一个巨大的好处，以及很多应用程序中使用插件的主要目的就是，我们可以在不需要改动应用程序本身的情况下扩展应用程序的功能。<br><br>&nbsp;<br><br>在Ogre中，插件被用来提供渲染子系统（RenderSystem），不同类别的图形API被封装在不同的渲染子系统的视线当中，Ogre默认提供了DX和OpenGL的实现，甚至，如果我们乐意，甚至可以只用绘点函数实现一套纯软件的渲染子系统提供给Ogre使用。以此为例，用简单的形式来展示这种实现大概类似于下面这样：<br><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;RenderSystem<br><br>{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&#8230;&nbsp;operations&nbsp;that&nbsp;a&nbsp;render&nbsp;system&nbsp;need&nbsp;to&nbsp;support</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>};<br><br></span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;In&nbsp;DX_RenderSystem.dll&nbsp;(in&nbsp;plugin&nbsp;dx&nbsp;rendersystem&nbsp;)</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;DX_RenderSystem&nbsp;:&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;RenderSystem<br><br>{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&#8230;&nbsp;implementation&nbsp;&amp;&nbsp;override&nbsp;of&nbsp;the&nbsp;operations&nbsp;from&nbsp;RenderSystem&nbsp;using&nbsp;DirectX</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>};<br><br></span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;In&nbsp;GL_RenderSystem.dll&nbsp;(in&nbsp;plugin&nbsp;openGL&nbsp;rendersystem)</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;GL_RenderSystem&nbsp;:&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;RenderSystem<br><br>{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&#8230;&nbsp;implementation&nbsp;&amp;&nbsp;override&nbsp;of&nbsp;the&nbsp;operations&nbsp;from&nbsp;RenderSystem&nbsp;using&nbsp;OpenGL</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>};<br><br></span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&#8230;.&nbsp;We&nbsp;could&nbsp;implement&nbsp;any&nbsp;other&nbsp;rendersystem&nbsp;as&nbsp;we&nbsp;like</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>&nbsp;<br><br>在引擎的内部（OgreMain），插件在初始化的时候，将一个渲染子系统的实例创建出来（可能是DX_RenderSystem，也可能是&nbsp;GL_RenderSystem，也可能是其他），并将之挂接到OgreMain的Root对象当中。此后，OgreMain中的Root所有的渲染操作也就可以通过该接口访问插件中创建的渲染子系统了。<br><br>&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;本文接下来分析Ogre是如何实现插件的，以及插件是如何与OgreMain主引擎进行配合的。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;事实上，想编写一个插件是很简单的，我们只需要约定几个接口，插件将这些接口实现了，主应用程序通过某种机制（配置文件</span><span style="color: #000000;">/</span><span style="color: #000000;">遍历某个目录）加载插件，并查找接口在插件中是否被实现了，如果实现了，则调用之即可。<br><br>&nbsp;<br><br>一个简单的例子如下：<br><br></span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;in&nbsp;xx.dll</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>__declspec(dllexport)&nbsp;</span><span style="color: #0000ff;">extern</span><span style="color: #000000;">&nbsp;&#8220;C&#8221;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;__declspec(dllexport)告知编译器需要将该函数导出<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;extern&nbsp;&#8220;C&#8221;&nbsp;告知编译器不要对函数做C++名字重整</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br></span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;GetPluginName(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)<br><br>{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;&#8220;Test&nbsp;Plugin&#8221;;<br><br>}<br><br>&nbsp;<br><br></span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;in&nbsp;application</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>HMODULE&nbsp;hInst&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;LoadLibrary(&#8221;xx.dll&#8221;);<br><br></span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #000000;">hInst)&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br><br>typedef&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">*</span><span style="color: #000000;">GetPluginNameFunc)(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">);<br><br>GetPluginNameFunc&nbsp;pFunc&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;GetProcAddress(hInst,&nbsp;&#8220;GetPluginName&#8221;);<br><br></span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #000000;">pFunc)&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br><br></span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;szPluginName&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pFunc();<br><br></span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&#8230;&nbsp;do&nbsp;other&nbsp;things</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>&nbsp;<br><br>事实上，在C语言里，我们就可以通过这种方式，约定一套需要实现的接口，交给插件实现即可。在这里，插件的功能都是在dll中实现的，我们需要加载&nbsp;dll，保存句柄，并在插件卸载的时候释放相应的资源。在C</span><span style="color: #000000;">++</span><span style="color: #000000;">中，我们显然可以做的更好一点，比如将dll模块相关的功能以及资源封装起来：<br><br>&nbsp;<br><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;DynLib<br><br>{<br><br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;Load(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;szPluginPath);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;GetProcAddress(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;szProcName);<br><br></span><span style="color: #0000ff;">private</span><span style="color: #000000;">:<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HMODULE&nbsp;m_hInst;<br><br>};<br><br>&nbsp;<br><br></span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;DynLib::Load(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;szPluginPath)<br><br>{<br><br>m_hInst&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;LoadLibrary(szPluginPath);<br><br></span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;m_hInst&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;NULL;<br><br>}<br><br>&nbsp;<br><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;DynLib::GetProcAddress(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;szProcName)<br><br>{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;::GetProcAddress(m_hInst,&nbsp;szProcName);<br><br>}<br><br>&nbsp;<br><br>这样一来，我们就有了一个DLL的简单封装。<br><br>但是一个dll里未必只能有一个插件，假若我们简单的把插件接口设计为一套C导出函数，我们就不得不面对这种局限。经典的做法依旧是抽象，Ogre中定义了一个插件接口，每一个实现了插件接口的实例都代表了一个插件，如下：<br><br>&nbsp;<br><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Plugin<br><br>{<br><br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;String</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;getName()&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;install()&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;initialize()&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;shutdown()&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;uninstall()&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br><br>};<br><br>&nbsp;<br><br>Ogre的每一个插件都需要实现以上接口。该接口提供的功能包括：<br><br>install&nbsp;插件被加载时调用。<br><br>initialize&nbsp;插件被初始化时调用。<br><br>shutdown&nbsp;插件被反初始化时调用。<br><br>uninstall&nbsp;插件被卸载时调用。<br><br>&nbsp;<br><br>不过，单有这个接口，插件还是无法工作。插件中还需要提供两个约定的C导出函数。这个稍后再说。<br><br>&nbsp;<br><br>Ogre在Root对象中统一管理插件，因此Root对象提供了以下与插件相关的接口：<br><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Root<br><br>{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&#8230;</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;loadPlugin(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;String</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;pluginName);<br><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;unloadPlugin(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;String</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;pluginName);<br><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;installPlugin(Plugin</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;plugin);<br><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;uninstallPlugin(Plugin</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;plugin);<br><br></span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;以及对应的处理多个插件的接口<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&#8230;</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>};<br><br>&nbsp;<br><br>当loadPlugin函数被调用时，Ogre将加载该插件的dll，从中查找并调用名为dllStartPlugin的导出函数。<br><br>对应的，当unloadPlugin函数被调用时，Ogre将从该dll中调用dllStopPlugin函数。并将该dll卸载。<br><br>&nbsp;<br><br>每个插件在实现的时候，都必须提供上述的两个C导出函数。其中，dllStartPlugin负责创建插件实例，并调用&nbsp;Root::installPlugin，将创建好的插件指针传递给Root对象。在这里，dllStartPlugin实际可以创建多个插件实例，并依次调用Root::installPlugin，这样我们就可以在一个DLL中包含多个插件了。在dllStopPlugin时，则需要调用&nbsp;Root::uninstallPlugin，并将插件DLL中创建的plugin实例释放掉。<br><br>&nbsp;<br><br>一个典型的dllStartPlugin的实现像这样：<br><br>&nbsp;<br><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;D3D9Plugin&nbsp;:&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Plugin<br><br>{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&#8230;</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>};<br><br>&nbsp;<br><br>D3D9Plugin</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;plugin;<br><br>__declspec(dllexport)&nbsp;</span><span style="color: #0000ff;">extern</span><span style="color: #000000;">&nbsp;&#8220;C&#8221;<br><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;dllStrartPlugin(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)<br><br>{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;plugin&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;D3D9Plugin();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Root::getSingleton().installPlugin(plugin);<br><br>}<br><br>&nbsp;<br><br>__declspec(dllexport)&nbsp;</span><span style="color: #0000ff;">extern</span><span style="color: #000000;">&nbsp;&#8220;C&#8221;<br><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;dllStopPlugin(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)<br><br>{<br><br>Root::getSingleton().uninstallPlugin(plugin);<br><br>delete&nbsp;plugin;<br><br>}<br><br>&nbsp;<br><br>Root::getSingleton().installPlugin(plugin)会负责调用插件的install以及initialise操作，并将插件的指针存放起来，以备卸载时使用。<br><br>&nbsp;<br><br>Plugin::install以及Plugin::initialise则分别负责创建OgreMain提供扩展功能接口的实例，以及将创建好的对象挂载到应用程序当中。<br><br>&nbsp;<br><br>一个典型的Plugin的行为像这样：<br><br>&nbsp;<br><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;BspSceneManagerPlugin::install()<br><br>{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mBspFactory&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;BspSceneManagerFactory();<br><br>}<br><br>&nbsp;<br><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;BspSceneManagerPlugin::initialise()<br><br>{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Root::getSingleton().addSceneManagerFactory(mBspFactory);<br><br>}<br><br>&nbsp;<br><br>其中，BspSceneManagerFactory是继承自OgreMain中的SceneManagerFactory的派生类。<br><br>(&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;BspSceneManagerFactory&nbsp;:&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;SceneManagerFactory&nbsp;{&#8230;}&nbsp;)<br><br>&nbsp;<br><br>通过将场景管理器工厂添加到Root对象当中，插件动态的将其功能添加到了OgreMain当中。<br><br>&nbsp;<br><br>PS:&nbsp;SceneManagerFactory是一个用于创建SceneManager的工厂。SceneManager则是被用于场景管理的管理器。具体的&nbsp;SceneManager也根据算法不同而不同，Ogre自带提供了两种类型的场景管理算法插件：Bsp以及Octree(实现了两个对应的插件，分别是&nbsp;Plugin_BSPSceneManager以及Plugin_OctreeSceneManager)。<br><br>&nbsp;<br><br>通过上述方式，OgreMain核心引擎并不需要关心场景管理算法的具体实现，不需要关心渲染子系统的具体实现，不需要关心粒子系统的具体实现，等等。一切这些扩展性的功能都通过插件实现，并在加载时动态挂载到OgreMain当中，供OgreMain的引擎核心使用。<br><br>&nbsp;<br><br>使用插件时几个需要注意的地方：<br><br></span><span style="color: #000000;">1</span><span style="color: #000000;">，&nbsp;&nbsp;调用插件DLL方法创建的对象需要交由插件DLL释放。（因为不同的链接单元可能具有不同的内存管理上下文环境，此处的new与彼处的new在语义上未必等同）<br><br></span><span style="color: #000000;">2</span><span style="color: #000000;">，&nbsp;&nbsp;调用插件DLL方法获取的插件内对象的引用或指针，在插件DLL卸载之后就是无效的，必须保证不再使用。（比较容易引发问题的一个典型例子是从插件中传递回一个引用计数字符串，当DLL被卸载后，字符串内指向实际数据的指针已经无效，但是在该对象析构时，仍需要访问该指针）</span></div>
<br><img src ="http://www.cppblog.com/richardhe/aggbug/88911.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/richardhe/" target="_blank">RichardHe</a> 2009-07-01 13:54 <a href="http://www.cppblog.com/richardhe/articles/88911.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OGRE主要渲染流程简介</title><link>http://www.cppblog.com/richardhe/articles/68841.html</link><dc:creator>RichardHe</dc:creator><author>RichardHe</author><pubDate>Mon, 08 Dec 2008 06:07:00 GMT</pubDate><guid>http://www.cppblog.com/richardhe/articles/68841.html</guid><wfw:comment>http://www.cppblog.com/richardhe/comments/68841.html</wfw:comment><comments>http://www.cppblog.com/richardhe/articles/68841.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/richardhe/comments/commentRss/68841.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/richardhe/services/trackbacks/68841.html</trackback:ping><description><![CDATA[<font size="5">OGRE主要渲染流程简介</font>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 谢伟亮&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; feiyurainy@163.com</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 转载请注明出处</p>
<p>&nbsp;&nbsp;&nbsp; 很早以前就想写一些关于<span>OGRE</span><span>的文章了，一直没机会。</span> </p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;理解一个渲染引擎，我觉得最重要的是先抓住了它的主架构，它的主线，渲染流程，不然的话，一个引擎几万行，甚至几十万行的代码，光是打开</span><span>solution</span><span>就能吓你一跳了，</span><span>OGRE</span><span>也有十几万行的代码量，我一开始看它的时候也是无从下手，感觉代码太多了，不知道从哪开始看好，这个</span><span>class</span><span>看看，那个</span><span>class</span><span>看看，由于对整个引擎没有一个清晰的认识，看过了也印象不深，所以，最后，还是决定先找出它的主线，了解它的渲染流程，这样才能有机地把各个部分联系起来。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;这篇短文也是对</span><span>OGRE</span><span>的主要渲染流程的一个介绍，可能对一些</span><span>class</span><span>不会太多地去介绍具体的实现细节。我所用的代码都是取自于</span><span>OGRE</span><span>的最新的</span><span>CVS</span><span>版本。</span></p>
<p><span>&nbsp;&nbsp;&nbsp; 读者最好对</span><span>OGRE</span><span>有一定的了解，至少得看懂它的</span><span>example</span><span>，不然可能一些东西理解起来比较困难。对</span><span>D3D</span><span>，</span><span>OPENGL</span><span>有一定了解更好。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;如果你看过</span><span>D3D SDK</span><span>中带的例子，你一定知道一个比较简单的</span><span>3D</span><span>程序要运行起来，至少都会涉及以下的几部分：</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;首先是数据的来源，包括顶点数据，纹理数据等，这些数据可以从文件中读取，也可以在程序运行时生成。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;接下来，我们会建立顶点缓冲区把顶点保存起来，建立</span><span>texture</span><span>对象来表示</span><span>texture</span><span>，对顶点组成的物体设置它在世界坐标系下的坐标，设置摄像机的位置，视点，设置</span><span>viewport</span><span>的位置和大小，然后就可以在渲染循环中开始调用渲染操作了，经过了</span><span>front buffer</span><span>和</span><span>back buffer</span><span>的交换，我们就能在屏幕上看到</span><span>3D</span><span>图形了，伪代码如下：</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setupVertexBuffer</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setWorldTransform</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setCamera</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setProjectionTransform</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setViewport</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>beginFrame</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setTexture</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawObject</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endFrame</span>&nbsp;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp; 以下就是渲染一个物体的主要步骤，在我看来，这就是</span><span>3D</span><span>程序的主线，同样道理，无论你多复杂的渲染引擎，都得实现上述的这些步骤，其他的一些效果如阴影，光照等，都是附着在这条主线上的，所以，如果你能在你所研究的渲染引擎上也清晰地看到这条主线，可能对你深入地研究它会大有帮助，下面，我们就一起来找到</span><span>OGRE</span><span>中的这条主线。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OGRE</span><span>的渲染循环都是起源于</span><span>Root::renderOneFrame</span><span>，这个函数在</span><span>OGRE</span><span>自带的</span><span>example</span><span>中是不会显式调用的，因为</span><span>example</span><span>都调用了</span><span>Root::startRendering</span><span>，由</span><span>startRendering</span><span>来调用</span><span>renderOneFrame</span><span>，如果你用</span><span>OGRE</span><span>来写真正的游戏，或者编辑器，你可能就需要在的消息主循环中调用</span><span>renderOneFrame</span><span>了，顾名思义，这个函数就是对整个</span><span>OGRE</span><span>进行一帧的更新，包括动画，渲染状态的改变，渲染</span><span>api</span><span>的调用等，在这个函数中，会包括了我们上述伪代码的几乎全部内容，所以是本文的重点所在。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;进入</span><span>renderOneFrame</span><span>，可以看到头尾两个</span><span>fire</span><span>函数，这种函数在</span><span>OGRE</span><span>中经常出现，一般都是</span><span>fire&#8230;start</span><span>和</span><span>fire&#8230;end</span><span>一起出现的，在这些函数中，可能会处理一些用户自定义的操作，如</span><span>_fireFrameStarted</span><span>就会对所以的</span><span>frameListener</span><span>进行处理，这些</span><span>fire</span><span>函数可以暂时不用理会，继续看</span><span>_updateAllRenderTargets</span><span>，在这个函数中，会委派当前所用的</span><span>renderer</span><span>对所有创建出来的</span><span>render target</span><span>进行</span><span>update</span><span>，</span><span>render target</span><span>也就是渲染的目的地，一般会有两种，一种是</span><span>render texture</span><span>，一种是</span><span>render buffer</span><span>，接着进入</span><span>RenderSystem::_updateAllRenderTargets</span><span>，可以看到在</span><span>render system</span><span>中，对创建出来的</span><span>render target</span><span>是用</span><span>RenderTargetPriorityMap</span><span>来保存的，以便按照一定的顺序来对</span><span>render target</span><span>进行</span><span>update</span><span>，因为在渲染物体到</span><span>render buffer</span><span>时，一般会用到之前渲染好的</span><span>render texture</span><span>，所以</span><span>render texture</span><span>形式的</span><span>render target</span><span>需要在</span><span>render buffer</span><span>之前进行更新。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;进入</span><span>render target</span><span>的</span><span>update</span><span>，可以看到，它仍然把</span><span>update</span><span>操作继续传递下去，调用所有挂在这个</span><span>render target</span><span>上的</span><span>viewport</span><span>的</span><span>update</span><span>。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Viewport</span><span>其实就是定义了</span><span>render target</span><span>上的一块要进行更新的区域，所以一个</span><span>render target</span><span>是可以挂多个</span><span>viewport</span><span>的，以实现多人对战时分屏，或者是画中画等效果，可以把</span><span>OGRE</span><span>中的</span><span>viewport</span><span>看成是保存</span><span>camera</span><span>和</span><span>rendertarget</span><span>这两者的组合，把</span><span>viewport</span><span>中所定义的</span><span>camera</span><span>所看到的场景内容渲染到</span><span>viewport</span><span>所定义的</span><span>render target</span><span>的区域里。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Viewport</span><span>还有一个重要信息是</span><span>ZOrder</span><span>，可以看到</span><span>RenderTarget</span><span>中的</span><span>ViewportList</span><span>带有一个比较函数，所以在</span><span>RenderTarget::update</span><span>中，</span><span>ZOrder</span><span>越小的，越先被渲染，所以，如果两个</span><span>viewport</span><span>所定义的区域互相重叠了，而且</span><span>ZOrder</span><span>又不一样，最终的效果就是</span><span>ZOrder</span><span>小的</span><span>viewport</span><span>的内容会被</span><span>ZOrder</span><span>大的</span><span>viewport</span><span>的内容所覆盖。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;继续进入</span><span>Viewport::update</span><span>，就像前面所说，它调用它所引用的</span><span>camera</span><span>来渲染整个场景，而在</span><span>Camera::_renderScene</span><span>中，是调用</span><span>SceneManager::_renderScene(Camera* camera, Viewport* vp, bool includeOverlays)</span><span>。</span><span>SceneManager::_renderScene</span><span>里就是具体的渲染流程了。从函数名称还有参数也可以看出来，这个函数的作用就是利用所指定的</span><span>camera</span><span>和</span><span>viewport</span><span>，来把场景中的内容渲染到</span><span>viewport</span><span>所指定的</span><span>render target</span><span>的某块区域中。根据</span><span>camera</span><span>，我们可以定出</span><span>view matrix</span><span>，</span><span>projection matrix</span><span>，还可以进行视锥剔除，只渲染看得见的物体。注意，我们这里只看标准的</span><span>SceneManager</span><span>的方法，不看</span><span>BspSceneManager</span><span>派生类的方法，而且，我们会抛开跟主线无关的内容，如对</span><span>shadow</span><span>的</span><span>setup</span><span>，骨骼动画的播放，</span><span>shader</span><span>参数的传递等，因为我们只注重渲染的主流程。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在</span><span>SceneManager::_renderScene</span><span>中所应看的第一个重要函数是</span><span>_updateSceneGraph</span><span>，</span><span>OGRE</span><span>对场景的组织是通过节点树来组织的，一个节点，你可以看成是空间中的某些变换的组合，如位置，缩放，旋转等，这些变换，会作用到挂接在这些节点上的具体的物体的信息，也就是说，节点保存了</span><span>world transform</span><span>，对具体的物体，如一个人，在空间中的定位，都是通过操作节点来完成的。同时节点还保存了一个世界坐标的</span><span>AABB</span><span>，这个</span><span>AABB</span><span>能容纳所有它所挂接的物体的大小，主要是用于视锥裁减的，如果当前摄像机看不见某个节点的</span><span>AABB</span><span>，那么说明摄像机看不见节点所挂接的所有物体，所以在渲染时可以对这个节点视而不见。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_updateSceneGraph</span><span>的内部处理比较繁琐，我们只需知道，经过了</span><span>_updateSceneGraph</span><span>，场景节点树中的每个节点都经过了更新，包括位置，缩放，和方位，还有节点的包围盒。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;继续回到</span><span>SceneManager::_renderScene</span><span>，接下来要看的是</span><span>setViewport</span><span>，它会调用具体的</span><span>renderer</span><span>的</span><span>setviewport</span><span>的操作，设置</span><span>viewport</span><span>中所挂接的</span><span>render target</span><span>为当前所要渲染的目标，</span><span>viewport</span><span>中的区域为当前所要渲染的目标中的区域。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;接下来要碰到</span><span>OGRE</span><span>渲染流程中的一个重要的概念，</span><span>Render Queue</span><span>。这个东西实在内容比较多，还是以后有机会单独提出来说吧，你可以简单把它想成是一个容器，里面的元素就是</span><span>renderable</span><span>，每个</span><span>renderable</span><span>可以看成是每次调用</span><span>drawprimitive</span><span>函数所渲染的物体，可以是一个模型，也可以是模型的一部分。在</span><span>RenderQueue</span><span>中，它会按材质来分组这些</span><span>renderable</span><span>，还会对</span><span>renderable</span><span>进行排序。</span></p>
<p><span>&nbsp;&nbsp;&nbsp; &nbsp;在每一次调用</span><span>SceneManager::_renderScene</span><span>时，都会调用</span><span>SceneManager::prepareRenderQueue</span><span>来清理</span><span>RenderQueue</span><span>，然后再调用</span><span>SceneManager::__findVisibleObjects</span><span>来把当前摄像机所能看见的物体都加入到</span><span>RenderQueue</span><span>中。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SceneManager::__findVisibleObjects</span><span>是一个递归的处理过程，它从场景的根节点开始，先检查摄像机是否能看见这个节点的包围盒（包围盒在</span><span>_updateSceneGraph</span><span>时已经计算好了），如果看不见，那么这个节点，还有它的子节点都不用管了。如果能看见，再检测挂在这个节点上的所有</span><span>MovableObject</span><span>，如果当前所检测的</span><span>MovableObject</span><span>是可见的，就会调用它的</span><span>_updateRenderQueue</span><span>方法，一般在这个方法里就可以把和这个</span><span>MovableObject</span><span>相关的</span><span>renderable</span><span>送入</span><span>RenderQueue</span><span>了。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这里要说说</span><span>MovableObject</span><span>，</span><span>MovableObject</span><span>主要是用于表示场景中离散的物体，如</span><span>Entity</span><span>，顾名思义，能移动的物体，不过它的&#8220;能移动&#8221;这个能力是要通过</span><span>SceneNode</span><span>来实现的，所以</span><span>MovableObject</span><span>来能显示出来，首先得先挂接在某个场景节点上，通过场景节点来定位。你可以控制</span><span>MovableObject</span><span>的一些属性，如某个</span><span>MovableObject</span><span>是否要显示，是否要隐藏，都可以通过</span><span>MovableObject::setVisible</span><span>方法来实现。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;检测完该节点上的</span><span>MovableObject</span><span>之后，就继续调用所有子节点的</span><span>_findVisibleObjects</span><span>方法，一直递归下去。这样，就能把场景中所有要渲染的</span><span>renderable</span><span>所加入到</span><span>RenderQueue</span><span>中了。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;至此，我们就拥有了要渲染的物体的信息了，接下来就是对这些物体进行渲染了，你会发现跟</span><span>D3D</span><span>或</span><span>OpenGL</span><span>的代码很类似的调用：</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>mDestRenderSystem-&gt;clearFrameBuffer</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mDestRenderSystem-&gt;_beginFrame<span>&nbsp;&nbsp;&nbsp; </span></span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>mDestRenderSystem-&gt;_setProjectionMatrix</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>mDestRenderSystem-&gt;_setViewMatrix </span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>_renderVisibleObjects();</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mDestRenderSystem-&gt;_endFrame();</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这些</span><span>api</span><span>的作用和</span><span>D3D</span><span>中的类似调用的作用都差不多，这里再说一下</span><span>_renderVisibleObjects()</span><span>，在这个函数中，会对</span><span>RenderQueue</span><span>中的每个</span><span>renderable</span><span>进行渲染，用的是</span><span>visitor</span><span>模式来遍历操作每个</span><span>renderable</span><span>，最终在</span><span>SceneManager::renderSingleObject</span><span>中取出每个</span><span>renderable</span><span>所保存的顶点，索引，世界矩阵等信息，来进行渲染。这其中还包括了查找离该</span><span>renderable</span><span>最近的光源等操作，比较复杂。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;到这里，</span><span>SceneManager::_renderScene</span><span>的流程基本走完了，也就是说，</span><span>OGRE</span><span>一帧中的渲染流程差不多也结束了，你应该也发现，这个流程跟你用</span><span>D3D</span><span>写一个简单程序的流程基本是一样的，在这个流程的基础上，再去看具体的实现，如怎么样设置纹理，怎么样调用你熟悉的</span><span>D3D</span><span>或</span><span>OpenGL</span><span>的</span><span>API</span><span>来渲染物体，应该会简单得多。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对</span><span>OGRE</span><span>的渲染流程的大概介绍到这里也结束了，很多细节都没涉及，以后有机会再写吧。</span></p><img src ="http://www.cppblog.com/richardhe/aggbug/68841.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/richardhe/" target="_blank">RichardHe</a> 2008-12-08 14:07 <a href="http://www.cppblog.com/richardhe/articles/68841.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Ogre实现画中画 [ 截图 ] </title><link>http://www.cppblog.com/richardhe/articles/57983.html</link><dc:creator>RichardHe</dc:creator><author>RichardHe</author><pubDate>Mon, 04 Aug 2008 09:22:00 GMT</pubDate><guid>http://www.cppblog.com/richardhe/articles/57983.html</guid><wfw:comment>http://www.cppblog.com/richardhe/comments/57983.html</wfw:comment><comments>http://www.cppblog.com/richardhe/articles/57983.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/richardhe/comments/commentRss/57983.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/richardhe/services/trackbacks/57983.html</trackback:ping><description><![CDATA[在玩一些3D游戏的时候，经常会有画中画的功能，比如&#8220;跑跑卡丁车&#8221;、&#8220;杀手十三&#8221;等等，于是想自己动手试验一下。<br><br>普
通情况下，我们使用单一的摄像机，实现第一人称或者第三人称，有时我们用多个摄像机在单一的窗口中切换视角，比如从第一人称切换到第三人称视角（游戏中屡
见不鲜），而画中画将会同时展现第一人称和第三人称（或者第三人称与第三人称），也就是说同时存在不同的观察点，这就需要多窗口多摄像机分别进行渲染。<br><br>用Ogre实现画中画功能是件比较容易的事情，首先，搭建一个普通的场景，关于这方面的工作<a  href="http://www.ogre3d.org/wiki">www.ogre3d.org/wiki</a>里有详细的教程，不赘述了。<br><br>下面进入关键部分。<br><br>在Ogre里摄像机Camera和视口Viewport是一一对应的关系，普通情况下包含一个摄像机对应一个视口，我们只要添加摄像机和与之对应的视口就OK了！<br><br>我的窗口类里是这样配置Ogre的，基本和教程示例里的一样。<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;BaseApplication::setup(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;mRoot&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Root();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;设置资源</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;setupResources();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;配置渲染窗口</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;carryOn&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;configure();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #000000;">carryOn)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;创建场景管理器</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;chooseSceneManager();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;创建摄像机</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;createCamera();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;创建视口</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;createViewports();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;设置缺省&nbsp;mipmap&nbsp;等级</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;TextureManager::getSingleton().setDefaultNumMipmaps(</span><span style="color: #000000;">5</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;创建所有资源监听器（为了加载屏幕）</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;createResourceListener();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;加载资源</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;loadResources();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;创建场景</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;createScene();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;创建帧监听器</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;createFrameListener();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br>}</span></div>
<p><br>其中，<span style="color: #000000;">createCamera();<font color="#008000"> <span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;创建摄像机</span></font>&nbsp;&nbsp; 和 </span><span style="color: #000000;">createViewports(); <span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;创建视口 <span style="color: #000000;"><span>是我们需要关心的。<br></span></span><br><span style="color: #000000;">createCamera()：</span></span></span><span style="color: #000000;"><span style="color: #008000;"></span></span></p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; font-family: Verdana; background-color: #eeeeee;"><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;BaseApplication::createCamera(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)<br>{<br>&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;主窗口摄像机</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;mCamera_1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;mSceneMgr</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">createCamera(</span><span style="color: #000000;">"</span><span style="color: #000000;">Cam_1</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;mCamera_1</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">setPosition(Vector3(</span><span style="color: #000000;">0</span><span style="color: #000000;">,</span><span style="color: #000000;">0</span><span style="color: #000000;">,</span><span style="color: #000000;">300</span><span style="color: #000000;">));<br>&nbsp;mCamera_1</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">lookAt(Vector3(</span><span style="color: #000000;">0</span><span style="color: #000000;">,</span><span style="color: #000000;">0</span><span style="color: #000000;">,</span><span style="color: #000000;">-</span><span style="color: #000000;">300</span><span style="color: #000000;">));<br>&nbsp;mCamera_1</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">setNearClipDistance(</span><span style="color: #000000;">5</span><span style="color: #000000;">);<br><br>&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;画中画摄像机</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;mCamera_2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;mSceneMgr</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">createCamera(</span><span style="color: #000000;">"</span><span style="color: #000000;">Cam_2</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;mCamera_2</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">setPosition(Vector3(</span><span style="color: #000000;">100</span><span style="color: #000000;">,</span><span style="color: #000000;">100</span><span style="color: #000000;">,</span><span style="color: #000000;">300</span><span style="color: #000000;">));<br>&nbsp;mCamera_2</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">lookAt(Vector3(</span><span style="color: #000000;">-</span><span style="color: #000000;">100</span><span style="color: #000000;">,</span><span style="color: #000000;">-</span><span style="color: #000000;">100</span><span style="color: #000000;">,</span><span style="color: #000000;">-</span><span style="color: #000000;">300</span><span style="color: #000000;">));<br>&nbsp;mCamera_2</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">setNearClipDistance(</span><span style="color: #000000;">5</span><span style="color: #000000;">);<br>}</span></div>
<p><br><span style="color: #000000;">createViewports()：<br></span></p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; font-family: Verdana; background-color: #eeeeee;"><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;BaseApplication::createViewports(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;主窗口</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Viewport</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;vp_1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;mWindow</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">addViewport( mCamera_1 );<br>&nbsp;&nbsp;&nbsp;&nbsp;vp_1</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">setBackgroundColour( ColourValue(</span><span style="color: #000000;">0</span><span style="color: #000000;">,</span><span style="color: #000000;">0</span><span style="color: #000000;">,</span><span style="color: #000000;">0</span><span style="color: #000000;">) );<br>&nbsp;&nbsp;&nbsp;&nbsp;mCamera_1</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">setAspectRatio(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Real( vp_1</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">getActualWidth() )&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;Real( vp_1</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">getActualHeight() ) );<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;画中画</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Viewport</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;vp_2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;mWindow</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">addViewport( mCamera_2, </span><span style="color: #000000;">1</span><span style="color: #000000;">, </span><span style="color: #000000;">0.7</span><span style="color: #000000;">, </span><span style="color: #000000;">0.05</span><span style="color: #000000;">, </span><span style="color: #000000;">0.25</span><span style="color: #000000;">, </span><span style="color: #000000;">0.25 </span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;vp_2</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">setBackgroundColour( ColourValue(</span><span style="color: #000000;">0</span><span style="color: #000000;">,</span><span style="color: #000000;">0</span><span style="color: #000000;">,</span><span style="color: #000000;">0</span><span style="color: #000000;">) );<br>&nbsp;&nbsp;&nbsp;&nbsp;vp_2</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">setOverlaysEnabled(</span><span style="color: #0000ff;">false</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;mCamera_2</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">setAspectRatio(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Real( vp_2</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">getActualWidth() )&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;Real(vp_2</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">getActualHeight() ) );<br>}</span></div>
<p><span style="color: #000000;"><br>在</span><span style="color: #000000;">addViewport中我们控制画中画视口在主窗口中的位置和大小（注意这里是0～1的取值范围，类似于贴图坐标）<br><br></span>这样就实现了下图所示效果的一半了。<br><br><img  src="http://www.cppblog.com/images/cppblog_com/hitmaen/viv.JPG" alt="" border="0"><br><br>是不是很酷？如果进一步设计成，当触发某一事件时将画中画窗口动态的弹出，那就更酷了！有兴趣的可以试一试：P<br><br>如图所示，我另外还利用了CEGUI给画中画窗口加了个边框，并且带了一个combobox用来控制更多摄像机之间的切换，CEGUI是用脚本来定义界面的，实现也比较简单。有关CEGUI部分的介绍，在ogre wiki上有更详细的教程。<br><br>#end<br>&nbsp;</p>
<p class="postfoot">
posted on 2007-05-22 10:59 <a  href="http://www.cppblog.com/hitmaen/">hitmaen</a> 阅读(762) <a  href="http://www.cppblog.com/hitmaen/archive/2007/05/22/24589.html#Post">评论(2)</a> &nbsp;<a  href="http://www.cppblog.com/hitmaen/admin/EditPosts.aspx?postid=24589">编辑</a>&nbsp;<a  href="http://www.cppblog.com/hitmaen/AddToFavorite.aspx?id=24589">收藏</a> <a  href="http://www.cppblog.com/hitmaen/services/trackbacks/24589.aspx">引用</a>  所属分类: <a  href="http://www.cppblog.com/hitmaen/category/4273.html">Ogre</a>
</p>
<img  src="http://www.cppblog.com/hitmaen/aggbug/24589.html?webview=1" width="1" height="1">
<!--
<rdf:rdf xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
<rdf:description
rdf:about="http://www.cppblog.com/hitmaen/archive/2007/05/22/24589.html"
dc:identifier="http://www.cppblog.com/hitmaen/archive/2007/05/22/24589.html"
dc:title="[ 试验 ] 用ogre实现画中画 [ 截图 ]"
trackback:ping="http://www.cppblog.com/hitmaen/services/trackbacks/24589.aspx" />
</rdf:rdf>
-->
<script type="text/javascript">
//<![cdata[
sys.webforms.pagerequestmanager._initialize('ajaxholder$scriptmanager1', document.getElementById('Form1'));
Sys.WebForms.PageRequestManager.getInstance()._updateControls(['tAjaxHolder$UpdatePanel1'], [], [], 90);
//]]&gt;
</script>
<a name="pagedcomment"></a>
<a name="评论">
</a>
<h3><a name="评论">评论</a></h3>
<a name="评论">
</a>
<h4>
<a name="评论">				</a><a  href="http://www.cppblog.com/hitmaen/archive/2007/05/22/24589.html#24604" title="permalink: re: [ 试验 ] 用Ogre实现画中画 [ 截图 ]">#</a>&nbsp;<a name="24604"></a>re: [ 试验 ] 用Ogre实现画中画 [ 截图 ]
<span>
2007-05-22 16:14
</span>
<a  href="http://www.cppblog.com/wlwlxj/" id="AjaxHolder_Comments_CommentList_ctl00_NameLink" target="_blank">万连文</a>
</h4>
<p>
鹰眼，小地图？？&nbsp;&nbsp;<a  href="http://www.cppblog.com/hitmaen/archive/2007/05/22/24589.html#post" onclick="'return" SetReplyAuhor("万连文")'>回复</a>&nbsp;&nbsp;<a  href="http://www.cppblog.com/comment?author=%e4%b8%87%e8%bf%9e%e6%96%87" title="查看该作者发表过的评论" target="_blank">更多评论</a>
&nbsp;&nbsp;
</p>
<h4>
<a  href="http://www.cppblog.com/hitmaen/archive/2007/05/22/24589.html#24623" title="permalink: re: [ 试验 ] 用Ogre实现画中画 [ 截图 ]">#</a>&nbsp;<a name="24623"></a>re: [ 试验 ] 用Ogre实现画中画 [ 截图 ]<a name="Post"></a>
<span>
2007-05-22 19:05
</span>
<a  href="http://www.cppblog.com/hitmaen/" id="AjaxHolder_Comments_CommentList_ctl01_NameLink" target="_blank">hitmaen</a>
</h4>
@万连文
<br>鹰眼是什么？不是指小地图，玩一玩跑跑卡丁车就明白我说的画中画是什么了&nbsp;&nbsp;<a  href="http://www.cppblog.com/hitmaen/archive/2007/05/22/24589.html#post" onclick="'return" SetReplyAuhor("hitmaen")'>回复</a>&nbsp;&nbsp;<a  href="http://www.cppblog.com/comment?author=hitmaen" title="查看该作者发表过的评论" target="_blank">更多评论</a>
&nbsp; <br><img src ="http://www.cppblog.com/richardhe/aggbug/57983.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/richardhe/" target="_blank">RichardHe</a> 2008-08-04 17:22 <a href="http://www.cppblog.com/richardhe/articles/57983.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Overlay中文显示</title><link>http://www.cppblog.com/richardhe/articles/57981.html</link><dc:creator>RichardHe</dc:creator><author>RichardHe</author><pubDate>Mon, 04 Aug 2008 09:02:00 GMT</pubDate><guid>http://www.cppblog.com/richardhe/articles/57981.html</guid><wfw:comment>http://www.cppblog.com/richardhe/comments/57981.html</wfw:comment><comments>http://www.cppblog.com/richardhe/articles/57981.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/richardhe/comments/commentRss/57981.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/richardhe/services/trackbacks/57981.html</trackback:ping><description><![CDATA[<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: '微软雅黑','sans-serif';">近日很多朋友咨询<span lang="EN-US">Overlay</span>中文显示问题，回答的多了想索性再写个文档算了，放在网上共享，于是就有了本篇。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif';" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: '微软雅黑','sans-serif';">在<span lang="EN-US">Ogre1.2.5</span>版本中，通过与<span lang="EN-US">Ogre</span>官方论坛的开发者讨论实现了<span lang="EN-US">Overlay</span>的中文显示，当初的实现非常的怪异，具体的实现可以参见<span lang="EN-US">Ogre</span>官方论坛。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: '微软雅黑','sans-serif';">随着<span lang="EN-US">Ogre</span>的更新，现在<span lang="EN-US">Ogre</span>已经发布了<span lang="EN-US">1.4.7</span>，<span lang="EN-US">1.4</span>系列版本有一个重要的改进，就是加入了<span lang="EN-US">UTFString</span>，这为<span lang="EN-US">Ogre</span>中文显示予以很大的帮助。为了便于演示，我直接使用<span lang="EN-US">Ogre</span>自带的<span lang="EN-US">Overlay</span>，也就是大家熟悉的<span lang="EN-US">DebugOverlay</span>，测试工程我选择<span lang="EN-US">Demo_ParticleFX</span>，选择其他的也没有关系。现在编译它，运行后得到下图：<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: '微软雅黑','sans-serif';" lang="EN-US"><v:shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype></span><span style="font-family: '微软雅黑','sans-serif';" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: '微软雅黑','sans-serif';"><img  src="http://images.cnblogs.com/cnblogs_com/gogoplayer/Ogre/overlay_eng.JPG" alt="" width="808" border="0" height="634"><br>
图的最左下角显示的就是英文<span lang="EN-US">DebugOverlay</span>，接下来我们的任务就是把它编程中文的，<span lang="EN-US">^_^</span>。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-indent: 21pt; text-align: left;" align="left"><span style="font-family: '微软雅黑','sans-serif';" lang="EN-US">Overlay</span><span style="font-family: '微软雅黑','sans-serif';">中文化操作步骤如下<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoListParagraph" style="margin-left: 42pt; text-indent: -21pt; text-align: left;" align="left"><span style="font-family: '微软雅黑','sans-serif';" lang="EN-US"><span>1.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: '微软雅黑','sans-serif';">打开<span lang="EN-US">OgreSDK\media\packs\</span></span><span lang="EN-US"> </span><span style="font-family: '微软雅黑','sans-serif';" lang="EN-US">OgreCore.zip</span><span style="font-family: '微软雅黑','sans-serif';">。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoListParagraph" style="margin-left: 42pt; text-indent: -21pt; text-align: left;" align="left"><span style="font-family: '微软雅黑','sans-serif';" lang="EN-US"><span>2.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: '微软雅黑','sans-serif';">打开<span lang="EN-US">C:\WINDOWS\Fonts</span>，把<span lang="EN-US">simhei.ttf</span>添加到<span lang="EN-US">OgreCore.zip</span>，（什么，没有<span lang="EN-US">simhei.ttf</span>这个文件，那就还其他的中文<span lang="EN-US">ttf</span>字体吧）。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoListParagraph" style="margin-left: 42pt; text-indent: -21pt; text-align: left;" align="left"><span style="font-family: '微软雅黑','sans-serif';" lang="EN-US"><span>3.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: '微软雅黑','sans-serif';">打开<span lang="EN-US">OgreCore.zip</span>中的<span lang="EN-US">Ogre.fontdef</span>，里面有<span lang="EN-US">BlueHighway</span>这个字体定义块，在他的下面添加我们的<span lang="EN-US">SimHei</span>，<span lang="EN-US">code_points</span>里面的一大堆数字看不明白没关系，随后文章会解释。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 42pt; text-align: left;" align="left"><span style="font-family: '微软雅黑','sans-serif';" lang="EN-US">SimHei<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 42pt; text-align: left;" align="left"><span style="font-family: '微软雅黑','sans-serif';" lang="EN-US">{<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 42pt; text-align: left;" align="left"><span style="font-family: '微软雅黑','sans-serif';" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>type <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>truetype<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 42pt; text-align: left;" align="left"><span style="font-family: '微软雅黑','sans-serif';" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>source <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>simhei.ttf<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 42pt; text-align: left;" align="left"><span style="font-family: '微软雅黑','sans-serif';" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>size <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 42pt; text-align: left;" align="left"><span style="font-family: '微软雅黑','sans-serif';" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>resolution <span>&nbsp; </span>96<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 42pt; text-align: left;" align="left"><span style="font-family: '微软雅黑','sans-serif';" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>code_points
33-166 24403-24403 21069-21069 24103-24103 36895-36895 29575-29575
24179-24179 22343-22343 26368-26368 39640-39640 20302-20302 19977-19977
35282-35282 24418-24418 25968-25968 37327-37327 25209-25209 27425-27425
<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 42pt; text-align: left;" align="left"><span style="font-family: '微软雅黑','sans-serif';" lang="EN-US">}<o:p></o:p></span></p>
<p class="MsoListParagraph" style="margin-left: 42pt; text-indent: -21pt; text-align: left;" align="left"><span style="font-family: '微软雅黑','sans-serif';" lang="EN-US"><span>4.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: '微软雅黑','sans-serif';">打开<span lang="EN-US">OgreCore.zip</span>中的<span lang="EN-US">OgreDebugPanel.overlay</span>，把<span lang="EN-US">BlueHighway</span>全部替换成<span lang="EN-US">SimHei</span>，我们要使用中文字体了，嘿嘿。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoListParagraph" style="margin-left: 42pt; text-indent: -21pt; text-align: left;" align="left"><span style="font-family: '微软雅黑','sans-serif';" lang="EN-US"><span>5.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: '微软雅黑','sans-serif';">修改完成后，确保所做的修改已经保存到<span lang="EN-US">OgreCore.zip</span>。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoListParagraph" style="margin-left: 42pt; text-indent: -21pt; text-align: left;" align="left"><span style="font-family: '微软雅黑','sans-serif';" lang="EN-US"><span>6.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: '微软雅黑','sans-serif';">进入<span lang="EN-US">Ogre</span>解决方案，打开文件<span lang="EN-US">ExampleFrameListener.h</span>，把<span lang="EN-US">54-59</span>行的代码替换如下：<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 9pt; font-family: '微软雅黑','sans-serif';" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue;">static</span> String currFps = <span style="color: #a31515;">"Current FPS: "</span>;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 9pt; font-family: '微软雅黑','sans-serif';" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue;">static</span> String avgFps = <span style="color: #a31515;">"Average FPS: "</span>;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 9pt; font-family: '微软雅黑','sans-serif';" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue;">static</span> String bestFps = <span style="color: #a31515;">"Best FPS: "</span>;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 9pt; font-family: '微软雅黑','sans-serif';" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue;">static</span> String worstFps = <span style="color: #a31515;">"Worst FPS: "</span>;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 9pt; font-family: '微软雅黑','sans-serif';" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue;">static</span> String tris = <span style="color: #a31515;">"Triangle Count: "</span>;<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-align: left;" align="left"><span style="font-size: 9pt; font-family: '微软雅黑','sans-serif';" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue;">static</span> String batches = <span style="color: #a31515;">"Batch Count: "</span>;<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-align: left;" align="left"><span style="font-family: '微软雅黑','sans-serif';" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 9pt; font-family: '微软雅黑','sans-serif';" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue;">static</span> DisplayString currFps = L<span style="color: #a31515;">"</span></span><span style="font-size: 9pt; color: #a31515; font-family: '微软雅黑','sans-serif';">当前帧速率<span lang="EN-US">: "</span></span><span style="font-size: 9pt; font-family: '微软雅黑','sans-serif';" lang="EN-US">;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 9pt; font-family: '微软雅黑','sans-serif';" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue;">static</span> DisplayString avgFps = L<span style="color: #a31515;">"</span></span><span style="font-size: 9pt; color: #a31515; font-family: '微软雅黑','sans-serif';">平均帧速率<span lang="EN-US">: "</span></span><span style="font-size: 9pt; font-family: '微软雅黑','sans-serif';" lang="EN-US">;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 9pt; font-family: '微软雅黑','sans-serif';" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue;">static</span> DisplayString bestFps = L<span style="color: #a31515;">"</span></span><span style="font-size: 9pt; color: #a31515; font-family: '微软雅黑','sans-serif';">最高帧速率<span lang="EN-US">: "</span></span><span style="font-size: 9pt; font-family: '微软雅黑','sans-serif';" lang="EN-US">;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 9pt; font-family: '微软雅黑','sans-serif';" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue;">static</span> DisplayString worstFps = L<span style="color: #a31515;">"</span></span><span style="font-size: 9pt; color: #a31515; font-family: '微软雅黑','sans-serif';">最低帧速率<span lang="EN-US">: "</span></span><span style="font-size: 9pt; font-family: '微软雅黑','sans-serif';" lang="EN-US">;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 9pt; font-family: '微软雅黑','sans-serif';" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue;">static</span> DisplayString tris = L<span style="color: #a31515;">"</span></span><span style="font-size: 9pt; color: #a31515; font-family: '微软雅黑','sans-serif';">三角形数量<span lang="EN-US">: "</span></span><span style="font-size: 9pt; font-family: '微软雅黑','sans-serif';" lang="EN-US">;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 9pt; font-family: '微软雅黑','sans-serif';" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue;">static</span> DisplayString batches = L<span style="color: #a31515;">"</span></span><span style="font-size: 9pt; color: #a31515; font-family: '微软雅黑','sans-serif';">批次<span lang="EN-US">: "</span></span><span style="font-size: 9pt; font-family: '微软雅黑','sans-serif';" lang="EN-US">;</span><span style="font-family: '微软雅黑','sans-serif';" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoListParagraph" style="margin-left: 42pt; text-indent: -21pt; text-align: left;" align="left"><span style="font-family: '微软雅黑','sans-serif';" lang="EN-US"><span>7.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: '微软雅黑','sans-serif';">最后重新编译工程，下面是我运行的截图，是不是已经显示中文了，<span lang="EN-US">^_^</span>。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-align: left;" align="left"><span style="font-family: '微软雅黑','sans-serif';" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: '微软雅黑','sans-serif';" lang="EN-US"><span><img  src="http://images.cnblogs.com/cnblogs_com/gogoplayer/Ogre/overlay_chinese.JPG" alt="" width="808" border="0" height="634"><br>
</span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10.5pt; font-family: '微软雅黑','sans-serif';">现在再来看看<span lang="EN-US">SimHei</span>中的<span lang="EN-US">code_points</span>是如何生成的，这个可以参考我上次写的这篇文章<span lang="EN-US"><a  href="http://www.cnblogs.com/gogoplayer/archive/2008/05/09/1189795.html">http://www.cnblogs.com/gogoplayer/archive/2008/05/09/1189795.html</a></span>，至此，实现<span lang="EN-US">Overlay</span>中文显示。</span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: '微软雅黑','sans-serif';">转载请注明出处：<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: '微软雅黑','sans-serif';">作者：<span lang="EN-US">gogoplayer<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: '微软雅黑','sans-serif';" lang="EN-US">E-mail : gogoplayer@163.com<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: '微软雅黑','sans-serif';" lang="EN-US">QQ : 78939328<o:p></o:p></span></p>
<span style="font-size: 10.5pt; font-family: 'calibri','sans-serif';" lang="EN-US"><a  href="http://www.gogoplayer.com.cn/"><span style="font-family: '微软雅黑','sans-serif';">http://www.gogoplayer.com.cn</span></a></span><img src ="http://www.cppblog.com/richardhe/aggbug/57981.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/richardhe/" target="_blank">RichardHe</a> 2008-08-04 17:02 <a href="http://www.cppblog.com/richardhe/articles/57981.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ogre命令行工具包使用说明</title><link>http://www.cppblog.com/richardhe/articles/57669.html</link><dc:creator>RichardHe</dc:creator><author>RichardHe</author><pubDate>Thu, 31 Jul 2008 12:12:00 GMT</pubDate><guid>http://www.cppblog.com/richardhe/articles/57669.html</guid><wfw:comment>http://www.cppblog.com/richardhe/comments/57669.html</wfw:comment><comments>http://www.cppblog.com/richardhe/articles/57669.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/richardhe/comments/commentRss/57669.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/richardhe/services/trackbacks/57669.html</trackback:ping><description><![CDATA[<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><span style="font-size: 22pt;" lang="EN-US"><font face="Times New Roman">Ogre</font></span><span style="font-size: 22pt; font-family: 宋体;">命令行工具包使用说明</span><span style="font-size: 22pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><font size="2"><span style="font-family: 宋体;">本文档由</span><font face="Times New Roman"> </font><span style="font-family: 宋体;">自由骑士笃志</span><font face="Times New Roman"> </font><span style="font-family: 宋体;">翻译整理</span><span lang="EN-US"><font face="Times New Roman">,</font></span><span style="font-family: 宋体;">版权属于</span><span lang="EN-US"><font face="Times New Roman">OgreTeam</font></span><span style="font-family: 宋体;">。转载请包含本行信息。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="left"><span lang="EN-US"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><o:p><font size="3" face="Times New Roman">&nbsp;</font></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">这个工具包包含了一些对</span><span lang="EN-US"><font face="Times New Roman">Ogre</font></span><span style="font-family: 宋体;">资源文件进行操作的预处理命令行工具。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">它包括</span><span lang="EN-US"><font face="Times New Roman">OgreXMLConveter, OgreMeshUpgrade, OgreMaterialUpgrade</font></span><span style="font-family: 宋体;">和</span><span lang="EN-US"><font face="Times New Roman">MeshMagick</font></span><span style="font-family: 宋体;">。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">您可以在<a  href="http://downloads.sourceforge.net/ogre/OgreCommandLineTools_v1.4.7.msi">这里</a>获得其</span><span lang="EN-US"><font face="Times New Roman">WindowsV<st1:chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on">1.4.7</st1:chsdate></font></span><span style="font-family: 宋体;">版本的下载</span><span lang="EN-US"><font face="Times New Roman">,</font></span><span style="font-family: 宋体;">或者在<a  href="http://downloads.sourceforge.net/ogre/OgreEihortToolsOSX_1.4.0.zip?downloads">这里</a>获取其</span><span lang="EN-US"><font face="Times New Roman">MacOSXV1.4.0</font></span><span style="font-family: 宋体;">版本的下载。以上两个版本均是</span><st1:chsdate year="2008" month="3" day="6" islunardate="False" isrocdate="False" w:st="on"><span lang="EN-US"><font face="Times New Roman">2008</font></span><span style="font-family: 宋体;">年</span><span lang="EN-US"><font face="Times New Roman">3</font></span><span style="font-family: 宋体;">月</span><span lang="EN-US"><font face="Times New Roman">6</font></span><span style="font-family: 宋体;">日</span></st1:chsdate><span style="font-family: 宋体;">的版本，即译者进行翻译的版本，若需要更多信息和更新的版本，可以访问</span><span lang="EN-US"><font face="Times New Roman"><a  href="http://www.ogre3d.org/">Ogre</a></font></span><span style="font-family: 宋体;"><a  href="javascript:void(0);/*1210036509359*/">官方</a>。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;"></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体;"></span><span lang="EN-US"><font size="4">.[OgreXMLConveter]</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">OgreXML</font></span><span style="font-family: 宋体;">转换器能够将</span><span lang="EN-US"><font face="Times New Roman"> .mesh </font></span><span style="font-family: 宋体;">模型网格文件</span><font face="Times New Roman"> </font><span style="font-family: 宋体;">和</span><span lang="EN-US"><font face="Times New Roman"> .skeleton </font></span><span style="font-family: 宋体;">骨骼文件</span><font face="Times New Roman"> </font><span style="font-family: 宋体;">由</span><span lang="EN-US"><font face="Times New Roman">XML</font></span><span style="font-family: 宋体;">格式转换为二进制格式，同时可以将其二进制格式转换回</span><span lang="EN-US"><font face="Times New Roman">XML</font></span><span style="font-family: 宋体;">格式。它同时也允许你在将</span><span lang="EN-US"><font face="Times New Roman">XML</font></span><span style="font-family: 宋体;">格式转换为二进制格式时设置</span><span lang="EN-US"><font face="Times New Roman">LOD</font></span><span style="font-family: 宋体;">层级信息。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">如果你的</span><span lang="EN-US"><font face="Times New Roman">Ogre</font></span><span style="font-family: 宋体;">脚本资源中原本使用的就是</span><span lang="EN-US"><font face="Times New Roman">XML</font></span><span style="font-family: 宋体;">格式文件的话，那么本工具则是</span><span lang="EN-US"><font face="Times New Roman">Ogre</font></span><span style="font-family: 宋体;">运行时必须的。所以你能够在</span><span lang="EN-US"><font face="Times New Roman">OgreSource</font></span><span style="font-family: 宋体;">包的</span><span lang="EN-US"><font face="Times New Roman">Tools/XMLConverter</font></span><span style="font-family: 宋体;">中找到它。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><o:p><font size="3" face="Times New Roman">&nbsp;</font></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><strong><span style="font-family: 宋体;">使用方法</span></strong><span style="font-family: 宋体;">：</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">OgreXMLConverter </font></span><span style="font-family: 宋体;">操作选项</span><font face="Times New Roman"> </font><span style="font-family: 宋体;">源文件路径</span><font face="Times New Roman"> </font><span style="font-family: 宋体;">目标文件路径</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><o:p><font size="3" face="Times New Roman">&nbsp;</font></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体;"><font size="3">有用的操作选项包括：</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-i<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;</span>= <span>&nbsp;</span></font></span><span style="font-family: 宋体;">控制与命令行。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-l<span>&nbsp; </span>nLODNum<span>&nbsp; </span>= </font></span><span style="font-family: 宋体;">指定总</span><span lang="EN-US"><font face="Times New Roman">LOD</font></span><span style="font-family: 宋体;">层级</span><span lang="EN-US"><font face="Times New Roman"> ( </font></span><span style="font-family: 宋体;">该项仅在</span><span lang="EN-US"><font face="Times New Roman">XML</font></span><span style="font-family: 宋体;">格式转换为</span><span lang="EN-US"><font face="Times New Roman">Mesh</font></span><span style="font-family: 宋体;">格式时有效</span><span lang="EN-US"><font face="Times New Roman"> )</font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-d<span>&nbsp; </span>nLODDis<span>&nbsp; </span>= </font></span><span style="font-family: 宋体;">指定</span><span lang="EN-US"><font face="Times New Roman">LOD</font></span><span style="font-family: 宋体;">层级间的距离增幅</span><span lang="EN-US"><font face="Times New Roman"> ( </font></span><span style="font-family: 宋体;">该项仅在</span><span lang="EN-US"><font face="Times New Roman">XML</font></span><span style="font-family: 宋体;">格式转换为</span><span lang="EN-US"><font face="Times New Roman">Mesh</font></span><span style="font-family: 宋体;">格式时有效</span><span lang="EN-US"><font face="Times New Roman"> )</font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-p<span>&nbsp; </span>nLODPer<span>&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">指定每两级</span><span lang="EN-US"><font face="Times New Roman">LOD</font></span><span style="font-family: 宋体;">层之间三角面减少百分比</span><span lang="EN-US"><font face="Times New Roman"> ( </font></span><span style="font-family: 宋体;">该项仅在</span><span lang="EN-US"><font face="Times New Roman">XML</font></span><span style="font-family: 宋体;">格式转换为</span><span lang="EN-US"><font face="Times New Roman">Mesh</font></span><span style="font-family: 宋体;">格式时有效</span><span lang="EN-US"><font face="Times New Roman"> )</font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-f<span>&nbsp; </span>nLODNum<span>&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">指定两级</span><span lang="EN-US"><font face="Times New Roman">LOD</font></span><span style="font-family: 宋体;">层之间的固定顶点减少量</span><span lang="EN-US"><font face="Times New Roman"> ( </font></span><span style="font-family: 宋体;">该项仅在</span><span lang="EN-US"><font face="Times New Roman">XML</font></span><span style="font-family: 宋体;">格式转换为</span><span lang="EN-US"><font face="Times New Roman">Mesh</font></span><span style="font-family: 宋体;">格式时有效</span><span lang="EN-US"><font face="Times New Roman"> )</font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-e<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">关闭模版阴影的</span><span lang="EN-US"><font face="Times New Roman">edge</font></span><span style="font-family: 宋体;">表</span><span lang="EN-US"><font face="Times New Roman"> ( </font></span><span style="font-family: 宋体;">当使用模版阴影时该项才有效</span><span lang="EN-US"><font face="Times New Roman"> )</font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-r<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">关闭</span><span lang="EN-US"><font face="Times New Roman">Ogre</font></span><span style="font-family: 宋体;">推荐的顶点缓冲区格式。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-t<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">为法线贴图生成切线信息</span><span lang="EN-US"><font face="Times New Roman"> ( </font></span><span style="font-family: 宋体;">当使用法线贴图时该项才有效</span><span lang="EN-US"><font face="Times New Roman"> )</font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-o<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">关闭冗余关键桢和运动轨迹的剔除</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-d3d<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">优先使用</span><span lang="EN-US"><font face="Times New Roman">D3D</font></span><span style="font-family: 宋体;">进行颜色格式的填充</span><span lang="EN-US"><font face="Times New Roman"> ( </font></span><span style="font-family: 宋体;">在</span><span lang="EN-US"><font face="Times New Roman">Windows</font></span><span style="font-family: 宋体;">平台中默认该项开启</span><span lang="EN-US"><font face="Times New Roman"> )</font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-gl<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">优先使用</span><span lang="EN-US"><font face="Times New Roman">GL</font></span><span style="font-family: 宋体;">进行颜色格式的填充</span><span lang="EN-US"><font face="Times New Roman"> ( </font></span><span style="font-family: 宋体;">在非</span><span lang="EN-US"><font face="Times New Roman">Windows</font></span><span style="font-family: 宋体;">平台中默认该项开启</span><span lang="EN-US"><font face="Times New Roman"> )</font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-E endian<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">设置</span><span lang="EN-US"><font face="Times New Roman">endian</font></span><span style="font-family: 宋体;">模式，可以选择</span><span lang="EN-US"><font face="Times New Roman">big, little </font></span><span style="font-family: 宋体;">或</span><font face="Times New Roman"> <span lang="EN-US">native ( </span></font><span style="font-family: 宋体;">默认为</span><span lang="EN-US"><font face="Times New Roman">native )</font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-q<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">轻量模式，减少输出。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-log filename<span>&nbsp;&nbsp; </span>=<span>&nbsp; </span>Log</font></span><span style="font-family: 宋体;">文件名称。（默认为</span><span lang="EN-US"><font face="Times New Roman">OgreXMLConverter.log</font></span><span style="font-family: 宋体;">）</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;"></span></font><span lang="EN-US"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="4">.[OgreMeshUpgrade]</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">这个工具能够将你的任何老版本的</span><span lang="EN-US"><font face="Times New Roman"> .mesh </font></span><span style="font-family: 宋体;">文件更新到当前版本的</span><span lang="EN-US"><font face="Times New Roman"> .mesh </font></span><span style="font-family: 宋体;">文件。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">你可以在</span><span lang="EN-US"><font face="Times New Roman">Ogre.log</font></span><span style="font-family: 宋体;">文件中得到</span><span lang="EN-US"><font face="Times New Roman">.mesh</font></span><span style="font-family: 宋体;">文件的版本信息。一般来说，</span><span lang="EN-US"><font face="Times New Roman">Ogre</font></span><span style="font-family: 宋体;">可以运行老版本的</span><span lang="EN-US"><font face="Times New Roman">.mesh</font></span><span style="font-family: 宋体;">文件，但是性能上会有一些差别。如果你更新了</span><span lang="EN-US"><font face="Times New Roman">Ogre</font></span><span style="font-family: 宋体;">的其他部分，你尽量应当将</span><span lang="EN-US"><font face="Times New Roman">.mesh</font></span><span style="font-family: 宋体;">文件更新为同样的版本。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><o:p><font size="3" face="Times New Roman">&nbsp;</font></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><strong><span style="font-family: 宋体;">使用方法</span></strong><span style="font-family: 宋体;">：</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">OgreMeshUpgrate </font></span><span style="font-family: 宋体;">操作选项</span><font face="Times New Roman"> </font><span style="font-family: 宋体;">源文件路径</span><font face="Times New Roman"> </font><span style="font-family: 宋体;">目标文件路径</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><o:p><font size="3" face="Times New Roman">&nbsp;</font></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体;"><font size="3">有用的操作选项包括：</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-i<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">控制与命令行。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-l<span>&nbsp; </span>nLODNum<span>&nbsp; </span>= </font></span><span style="font-family: 宋体;">指定总</span><span lang="EN-US"><font face="Times New Roman">LOD</font></span><span style="font-family: 宋体;">层级</span><span lang="EN-US"><font face="Times New Roman"> ( </font></span><span style="font-family: 宋体;">该项仅在</span><span lang="EN-US"><font face="Times New Roman">XML</font></span><span style="font-family: 宋体;">格式转换为</span><span lang="EN-US"><font face="Times New Roman">Mesh</font></span><span style="font-family: 宋体;">格式时有效</span><span lang="EN-US"><font face="Times New Roman"> )</font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-d<span>&nbsp; </span>nLODDis<span>&nbsp; </span>= </font></span><span style="font-family: 宋体;">指定</span><span lang="EN-US"><font face="Times New Roman">LOD</font></span><span style="font-family: 宋体;">层级间的距离增幅</span><span lang="EN-US"><font face="Times New Roman"> ( </font></span><span style="font-family: 宋体;">该项仅在</span><span lang="EN-US"><font face="Times New Roman">XML</font></span><span style="font-family: 宋体;">格式转换为</span><span lang="EN-US"><font face="Times New Roman">Mesh</font></span><span style="font-family: 宋体;">格式时有效</span><span lang="EN-US"><font face="Times New Roman"> )</font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-p<span>&nbsp; </span>nLODPer<span>&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">指定每两级</span><span lang="EN-US"><font face="Times New Roman">LOD</font></span><span style="font-family: 宋体;">层之间三角面减少百分比</span><span lang="EN-US"><font face="Times New Roman"> ( </font></span><span style="font-family: 宋体;">该项仅在</span><span lang="EN-US"><font face="Times New Roman">XML</font></span><span style="font-family: 宋体;">格式转换为</span><span lang="EN-US"><font face="Times New Roman">Mesh</font></span><span style="font-family: 宋体;">格式时有效</span><span lang="EN-US"><font face="Times New Roman"> )</font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-f<span>&nbsp; </span>nLODNum<span>&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">指定两级</span><span lang="EN-US"><font face="Times New Roman">LOD</font></span><span style="font-family: 宋体;">层之间的固定顶点减少量</span><span lang="EN-US"><font face="Times New Roman"> ( </font></span><span style="font-family: 宋体;">该项仅在</span><span lang="EN-US"><font face="Times New Roman">XML</font></span><span style="font-family: 宋体;">格式转换为</span><span lang="EN-US"><font face="Times New Roman">Mesh</font></span><span style="font-family: 宋体;">格式时有效</span><span lang="EN-US"><font face="Times New Roman"> )</font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-e<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">关闭模版阴影的</span><span lang="EN-US"><font face="Times New Roman">edge</font></span><span style="font-family: 宋体;">表</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-r<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">关闭</span><span lang="EN-US"><font face="Times New Roman">Ogre</font></span><span style="font-family: 宋体;">推荐的顶点缓冲区格式。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-t<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">为法线贴图生成切线信息</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-d3d<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">转换为</span><span lang="EN-US"><font face="Times New Roman">D3D</font></span><span style="font-family: 宋体;">颜色格式</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-gl<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">转换为</span><span lang="EN-US"><font face="Times New Roman">GL</font></span><span style="font-family: 宋体;">颜色格式</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-srcd3d<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">老版本的</span><span lang="EN-US"><font face="Times New Roman">mesh</font></span><span style="font-family: 宋体;">文件为</span><span lang="EN-US"><font face="Times New Roman">D3D</font></span><span style="font-family: 宋体;">颜色格式</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-srcgl<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">老版本的</span><span lang="EN-US"><font face="Times New Roman">mesh</font></span><span style="font-family: 宋体;">文件为</span><span lang="EN-US"><font face="Times New Roman">GL</font></span><span style="font-family: 宋体;">颜色格式</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-E endian<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">设置</span><span lang="EN-US"><font face="Times New Roman">endian</font></span><span style="font-family: 宋体;">模式，可以选择</span><span lang="EN-US"><font face="Times New Roman">big, little </font></span><span style="font-family: 宋体;">或</span><span lang="EN-US"><font face="Times New Roman"> native ( </font></span><span style="font-family: 宋体;">默认为</span><span lang="EN-US"><font face="Times New Roman">native )</font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><o:p><font size="3" face="Times New Roman">&nbsp;</font></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><font size="3"><span style="font-family: 宋体;">注意：</span><span lang="EN-US"><o:p></o:p></span></font></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">这个工具现在允许你自定义重组你的</span><span lang="EN-US"><font face="Times New Roman">mesh</font></span><span style="font-family: 宋体;">网格文件的顶点格式。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">如果你想更新</span><st1:chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on"><span lang="EN-US"><font face="Times New Roman">0.15.0</font></span></st1:chsdate><span style="font-family: 宋体;">之前的任意一个版本的</span><span lang="EN-US"><font face="Times New Roman">mesh</font></span><span style="font-family: 宋体;">，那么在该程序运行时会问你是否希望进行顶点格式的重组，你输入</span><span lang="EN-US"><font face="Times New Roman">&#8217;y&#8217;</font></span><span style="font-family: 宋体;">就可以了。在</span><span lang="EN-US"><font face="Times New Roman">0.15.0</font></span><span style="font-family: 宋体;">版本之后的</span><span lang="EN-US"><font face="Times New Roman">mesh</font></span><span style="font-family: 宋体;">在更新时会允许你对该</span><span lang="EN-US"><font face="Times New Roman">mesh</font></span><span style="font-family: 宋体;">做更多的操作：例如，你可以对每个独立模型节点的顶点指定不同的顶点结构，你既可以自定义顶点结构，也可以使用</span><span lang="EN-US"><font face="Times New Roman">&#8217;automatic&#8217;</font></span><span style="font-family: 宋体;">自动模式。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="4"><span lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="4"><span lang="EN-US"><o:p>.</o:p></span><span lang="EN-US">[OgreMaterialUpgrade]</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">这个工具能够将你的任何老版本的</span><span lang="EN-US"><font face="Times New Roman"> .material </font></span><span style="font-family: 宋体;">材质文件更新到当前版本的</span><span lang="EN-US"><font face="Times New Roman"> .material </font></span><span style="font-family: 宋体;">材质文件。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">值得注意的是这个自动更新是不会加入一些新的脚本语法功能的，这么说你可能不好理解。（例子：</span><font face="Times New Roman"> <span lang="EN-US">&#8220;scene_blend add&#8221;</span></font><span style="font-family: 宋体;">这句可能会被更新为</span><span lang="EN-US"><font face="Times New Roman">&#8221;scene_blend one one&#8221;</font></span><span style="font-family: 宋体;">，因为</span><span lang="EN-US"><font face="Times New Roman">&#8221;add&#8221;</font></span><span style="font-family: 宋体;">的底层实际上就是</span><span lang="EN-US"><font face="Times New Roman">&#8221;scene_blend one one&#8221;</font></span><span style="font-family: 宋体;">，自动更新会将一些高级语法更新为比较直接底层的语法）</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">另外，这个工具仅对</span><st1:chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on"><span lang="EN-US"><font face="Times New Roman">0.13.0</font></span></st1:chsdate><span style="font-family: 宋体;">版本以下的材质脚本更新有效，对</span><span lang="EN-US"><font face="Times New Roman">0.13.0</font></span><span style="font-family: 宋体;">版本以后的材质脚本是没有必要进行更新的。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><o:p><font size="3" face="Times New Roman">&nbsp;</font></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><font size="3"><span style="font-family: 宋体;">使用方法：</span><span lang="EN-US"><o:p></o:p></span></font></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">OgreMaterialUpgrade </font></span><span style="font-family: 宋体;">源文件路径</span><font face="Times New Roman"> </font><span style="font-family: 宋体;">目标文件路径</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="4"><span lang="EN-US"><o:p>&nbsp;.</o:p></span><span lang="EN-US">[MeshMagick]</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">Copyright 2007 by Daniel Wickert</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">这个工具是对</span><span lang="EN-US"><font face="Times New Roman">mesh</font></span><span style="font-family: 宋体;">文件和</span><span lang="EN-US"><font face="Times New Roman">skeleton</font></span><span style="font-family: 宋体;">文件进行一些处理的工具。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体;"><font size="3">大致包括以下功能：</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">Info<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>= </font></span><span style="font-family: 宋体;">输出</span><span lang="EN-US"><font face="Times New Roman">mesh</font></span><span style="font-family: 宋体;">的信息。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">Meshmerge<span>&nbsp;&nbsp; </span>= </font></span><span style="font-family: 宋体;">将多个</span><span lang="EN-US"><font face="Times New Roman">mesh</font></span><span style="font-family: 宋体;">合并为一个</span><span lang="EN-US"><font face="Times New Roman">mesh</font></span><span style="font-family: 宋体;">文件</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">rename <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>= </font></span><span style="font-family: 宋体;">重命名</span><span lang="EN-US"><font face="Times New Roman">mesh</font></span><span style="font-family: 宋体;">和</span><span lang="EN-US"><font face="Times New Roman">skeleton</font></span><span style="font-family: 宋体;">的不同元件</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">transform<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>= </font></span><span style="font-family: 宋体;">旋转，缩放一个</span><span lang="EN-US"><font face="Times New Roman">mesh</font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><o:p><font size="3" face="Times New Roman">&nbsp;</font></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><font size="3"><span style="font-family: 宋体;">使用方式：</span><span lang="EN-US"><o:p></o:p></span></font></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">MeshMagick &#8211;help=</font></span><span style="font-family: 宋体;">工具名</span><font face="Times New Roman"> </font><span style="font-family: 宋体;">可以获得更多相关信息。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><o:p><font size="3">&nbsp;</font></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="4"><span lang="EN-US"><o:p>.</o:p></span><span lang="EN-US">[</span><font face="Arial"><span style="font-family: 宋体;">译者笃志补充说明</span><span lang="EN-US">]</span></font></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">1</font></span><span style="font-family: 宋体;">：除</span><span lang="EN-US"><font face="Times New Roman">MeshMagick</font></span><span style="font-family: 宋体;">该工具外，其他三种工具，使用方式都可以是：将源资源文件拖拽到工具的</span><span lang="EN-US"><font face="Times New Roman">exe</font></span><span style="font-family: 宋体;">图标上。因为更新程序会将源文件覆盖，所以推荐做下备份后再更新。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">2</font></span><span style="font-family: 宋体;">：您可以写批处理文件对其进行使用。格式即为上面的使用方式。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">举例：新建一个文本文件</span><span lang="EN-US"><font face="Times New Roman">test.txt </font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 31.5pt;"><font size="3"><span style="font-family: 宋体;">编辑内容为</span><span lang="EN-US"><font face="Times New Roman"> OgreMeshUpgrate &#8211;d3d &#8211;l 4 &#8211;d 500 &#8211;p 30 E:\Ogre\Media\TestSrc.xml F:\Temp\TestDest.mesh</font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 31.5pt;"><font size="3"><span style="font-family: 宋体;">修改文本后缀名为</span><span lang="EN-US"><font face="Times New Roman">test.bat</font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 31.5pt;"><font size="3"><span style="font-family: 宋体;">将该批处理文件与</span><span lang="EN-US"><font face="Times New Roman">OgreMeshUpgrate.exe</font></span><span style="font-family: 宋体;">放置同一目录下，运行</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 31.5pt;"><font size="3"><span style="font-family: 宋体;">则会自动将</span><span lang="EN-US"><font face="Times New Roman">E:\Ogre\Media\TestSrc.xml</font></span><span style="font-family: 宋体;">文件转换为</span><span lang="EN-US"><font face="Times New Roman">F:\Temp\TestDest.mesh</font></span><span style="font-family: 宋体;">文件，同时开启了</span><span lang="EN-US"><font face="Times New Roman">4</font></span><span style="font-family: 宋体;">层</span><span lang="EN-US"><font face="Times New Roman">Lod</font></span><span style="font-family: 宋体;">，</span><span lang="EN-US"><font face="Times New Roman">Lod</font></span><span style="font-family: 宋体;">间距为</span><span lang="EN-US"><font face="Times New Roman">500</font></span><span style="font-family: 宋体;">象素，每一级间面数差距为</span><span lang="EN-US"><font face="Times New Roman">30%</font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">3</font></span><span style="font-family: 宋体;">：</span><span lang="EN-US"><font face="Times New Roman">OgreMeshUpgrate</font></span><span style="font-family: 宋体;">工具推荐使用</span><span lang="EN-US"><font face="Times New Roman">automatic</font></span><span style="font-family: 宋体;">自动模式顶点格式，效率会比较高，并且省去不少麻烦。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">4</font></span><span style="font-family: 宋体;">：</span><span lang="EN-US"><font face="Times New Roman">MeshMagick</font></span><span style="font-family: 宋体;">工具不推荐使用。本身功能有限，而且长期无人维护，对新的</span><span lang="EN-US"><font face="Times New Roman">mesh</font></span><span style="font-family: 宋体;">支持不好。</span></font></p><img src ="http://www.cppblog.com/richardhe/aggbug/57669.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/richardhe/" target="_blank">RichardHe</a> 2008-07-31 20:12 <a href="http://www.cppblog.com/richardhe/articles/57669.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ogre中的碰撞检测(转)</title><link>http://www.cppblog.com/richardhe/articles/56945.html</link><dc:creator>RichardHe</dc:creator><author>RichardHe</author><pubDate>Wed, 23 Jul 2008 07:28:00 GMT</pubDate><guid>http://www.cppblog.com/richardhe/articles/56945.html</guid><wfw:comment>http://www.cppblog.com/richardhe/comments/56945.html</wfw:comment><comments>http://www.cppblog.com/richardhe/articles/56945.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/richardhe/comments/commentRss/56945.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/richardhe/services/trackbacks/56945.html</trackback:ping><description><![CDATA[<div id="blog_text" class="cnt">
<p>原创  韩举<br>
<a  href="http://www.hjpdiy.com/">http://www.hjpdiy.com</a></p>
<p>Ogre采用树桩管理场景中的各种"元素"(摄像机、灯光、物体等)，所有的东西都挂在"树"上，不在"树"上的东西不会被渲染。<br>
Ogre::SceneManager就是"树"的管理者，Ogre::SceneNode是从SceneManager中创建的（当然BSP和8*树的管理也和这两个类有关，这暂时不讨论）。</p>
<p>AABB(轴对齐包围盒)</p>
<p>这个东西是碰撞检测的基础（怎么总想起JJYY呢），和它类似的还有OBB(有向包围盒)，由于OBB创建复杂，所以Ogre采用了AABB。</p>
<p>最简单的碰撞检测：</p>
<p>通<br>
过Ogre::SceneNode::_getWorldAABB()可以取得这个叶子节点的AABB(Ogre::AxisAlignedBox)，<br>
Ogre::AxisAlignedBox封装了对AABB的支持，该类的成员函数Ogre::AxisAlignedBox::intersects<br>
()可以判断一个AABB和"球体、点、面以及其他面"的相交情况（碰撞情况）。</p>
<p>&nbsp;&nbsp;&nbsp;  m_SphereNode树的叶子，挂了一个"球"<br>
&nbsp;&nbsp;&nbsp;  m_CubeNode树的叶子，挂了一个"正方体"</p>
<p>&nbsp;&nbsp;&nbsp;  AxisAlignedBox spbox=m_SphereNode-&gt;_getWorldAABB();<br>
AxisAlignedBox cbbox=m_CubeNode-&gt;_getWorldAABB();<br>
if(spbox.intersects(cbbox))<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp;  //相交</p>
<p>}</p>
<p>区域查询：</p>
<p>简单的讲就是，查询某一区域中有什么东西，分为AABB、球体、面查询。</p>
<p>&nbsp;&nbsp;  //创建一个球体查询，这里的100是m_SphereNode挂着的那个球体的半径<br>
&nbsp;&nbsp;  SphereSceneQuery * pQuery=m_SceneMgr-&gt;createSphereQuery(Sphere(m_SphereNode-&gt;getPosition(),100));<br>
&nbsp;&nbsp;  //执行这个查询<br>
&nbsp;&nbsp;  SceneQueryResult QResult=pQuery-&gt;execute();<br>
&nbsp;&nbsp;  //遍历查询列表找出范围内的物体<br>
&nbsp;&nbsp;  for (std::list&lt;MovableObject*&gt;::iterator iter = QResult.movables.begin(); iter != QResult.movables.end();++iter)<br>
&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;  MovableObject* pObject=static_cast&lt;MovableObject*&gt;(*iter);<br>
&nbsp;&nbsp;&nbsp;  if(pObject)<br>
&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;  if(pObject-&gt;getMovableType()=="Entity")<br>
&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Entity* ent = static_cast&lt;Entity*&gt;(pObject);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //这里简化了操作，由于只有一个"球体"和一个"正方体"，<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //所以只判断了球体和正方体的相交</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if(ent-&gt;getName()=="cube")<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //改变位置防止物体重叠<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  vtl=-vtl;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  m_SphereNode-&gt;translate(vtl);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  break;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;  }</p>
<p>相交查询</p>
<p>遍历所有的对象，找到一对一对的相交物体（废话呀，相交当然至少两个物体）。</p>
<p>&nbsp;&nbsp;&nbsp;  //创建相交检测<br>
&nbsp;&nbsp;&nbsp;  IntersectionSceneQuery* pISQuery=m_SceneMgr-&gt;createIntersectionQuery();<br>
&nbsp;&nbsp;&nbsp;  //执行查询<br>
&nbsp;&nbsp;&nbsp;  IntersectionSceneQueryResult QResult=pISQuery-&gt;execute();<br>
&nbsp;&nbsp;&nbsp;  //遍历查询列表找出两个相交的物体<br>
&nbsp;&nbsp;&nbsp;  for (SceneQueryMovableIntersectionList::iterator iter = QResult.movables2movables.begin();<br>
&nbsp;&nbsp;&nbsp;&nbsp;  iter != QResult.movables2movables.end();++iter)<br>
&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;&nbsp;  SceneQueryMovableObjectPair pObject=static_cast&lt;SceneQueryMovableObjectPair&gt;(*iter);<br>
&nbsp;&nbsp;&nbsp;&nbsp;  //if(pObject)<br>
&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  String strFirst=pObject.first-&gt;getName();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  String strSecond=pObject.second-&gt;getName();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //下面加入你自己的两个物体相交判断代码，或者简单的用AABB的判断方法，<br>
&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;  }</p>
</div><img src ="http://www.cppblog.com/richardhe/aggbug/56945.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/richardhe/" target="_blank">RichardHe</a> 2008-07-23 15:28 <a href="http://www.cppblog.com/richardhe/articles/56945.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ogre 的 四元数quaternion</title><link>http://www.cppblog.com/richardhe/articles/56944.html</link><dc:creator>RichardHe</dc:creator><author>RichardHe</author><pubDate>Wed, 23 Jul 2008 07:26:00 GMT</pubDate><guid>http://www.cppblog.com/richardhe/articles/56944.html</guid><wfw:comment>http://www.cppblog.com/richardhe/comments/56944.html</wfw:comment><comments>http://www.cppblog.com/richardhe/articles/56944.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/richardhe/comments/commentRss/56944.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/richardhe/services/trackbacks/56944.html</trackback:ping><description><![CDATA[<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><font face="Times New Roman"><font size="2"><font color="#000000"><span>quaternion是</span><span>一个标量和一个</span><span>3D</span><span>向量的组合。q={ w,x,y,z},Ogre中一个默认的quaternion</span></font></font><font size="2"><font color="#0000ff"><span><span> ={1,0,0,0} ,一般用于空间一点的旋转,假设空间一点叫p,将要旋转角度是<span>&#945;,旋转轴是(x,y,z),那么:</span></span></span></font></font></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><font size="2"><font color="#0000ff" face="Times New Roman"><span><span><span>p={0,x0,y0,z0}</span></span></span></font></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><font size="2"><font color="#0000ff"><font face="Times New Roman"><span>q= {cos(</span><span>&#945;</span><span>/ 2) , sina(</span><span>&#945;</span><span>/ 2) <strong>N</strong>x,  sin(</span><span>&#945;</span><span>/ 2)<strong>N</strong>y,  sin(</span><span>&#945;</span><span>/ 2)<strong>N</strong>z }  (<font color="#000000"><span><strong>N</strong></span><span>为单位向量)</span></font></span></font></font></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"> </p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="font-size: 14px; color: #363636; text-indent: 2em; line-height: 23px;"><span><font size="3"><font face="Times New Roman">p结果 =q*p*q<sup><font size="2" color="#0000ff">-1  </font></sup></font></font></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"> </p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="font-size: 14px; color: #363636; text-indent: 2em; line-height: 23px;"><span><font size="3"><font color="#000000"><font size="2"><font face="Times New Roman">在数学上，<span>quaternion</span><span>表示复数</span><span>w+xi+yj+zk</span><span>，其中</span><span>i,j,k</span><span>都是虚数单位,而复数乘法<span>(</span><span>叉乘</span><span>)</span><span>的几何意义实际上就是对复数进行旋转。这也是OGRE为什么要用quaternion的原因(比Matrix更快捷更节省空间),对最简单的二维复数</span><span>p= x + yi</span><span>来说，和另一个</span><span>q = ( con</span><span>&#945;，</span><span>sin</span><span>&#945;</span><span>)</span><span>相乘，则表示把</span><span>p</span><span>沿逆时针方向旋转&#945;：</span><span><font size="2" color="#000080"><font color="#0000ff">p&#8217; = pq</font>  ,这是2D旋转.</font></span></span></font></font></font></font></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="font-size: 14px; color: #363636; text-indent: 2em; line-height: 23px;"><span><font size="3"><font color="#000000"><font size="2" color="#000080" face="Times New Roman"><span><span>如果要表示3D旋转,就需要3D复数了,于是就有了"四元数",q=w+ix+jy+kz (i,j,k都是虚数)</span></span></font></font></font></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="font-size: 14px; color: #363636; text-indent: 2em; line-height: 23px;"><span><font size="3"><font color="#000000"><font size="2" color="#000080"><span><span><font color="#000000" face="Times New Roman">其中j,j,k关系如下:</font></span></span></font></font></font></span></span>
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"> </p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"> </p>
<p><font face="Times New Roman"><span style="font-weight: bold;">&nbsp;&nbsp; i</span><sup style="font-weight: bold;">2</sup><span style="font-weight: bold;"> = j</span><sup style="font-weight: bold;">2</sup><span style="font-weight: bold;"> = k</span><sup style="font-weight: bold;">2</sup><span style="font-weight: bold;"> = -1</span><br style="font-weight: bold;">
<span style="font-weight: bold;">&nbsp;&nbsp;  i * j = k = -j * i</span><br style="font-weight: bold;">
<span style="font-weight: bold;">&nbsp;&nbsp;  j * k = i = -k * j</span><br style="font-weight: bold;">
<span style="font-weight: bold;">&nbsp;&nbsp;  k * i = j = -i * k</span></font></p>
<p><br>
<font face="Times New Roman">四元数加法:<br>
</font><font face="Times New Roman">q<sub>1</sub> + q<sub>2</sub> = (w<sub>1</sub>+w<sub>2</sub>) + (x<sub>1</sub>+x<sub>2</sub>) i + (y<sub>1</sub>+y<sub>2</sub>) j + (z<sub>1</sub>+z<sub>2</sub>) k<br>
</font><font face="Times New Roman">四元数乘法:<br>
</font><font face="Times New Roman"><span style="font-weight: bold;">q<sub>1</sub> * q<sub>2</sub> =</span><br style="font-weight: bold;">
</font><font face="Times New Roman"><span style="font-weight: bold;">(w<sub>1</sub>*w<sub>2</sub> - x<sub>1</sub>*x<sub>2</sub> - y<sub>1</sub>*y<sub>2</sub> - z<sub>1</sub>*z<sub>2</sub>) +</span><br style="font-weight: bold;">
<span style="font-weight: bold;">(w</span><span style="font-weight: bold;"><sub>1</sub></span><span style="font-weight: bold;">*x</span><sub><span style="font-weight: bold;">2</span></sub><span style="font-weight: bold;"> + x</span><span style="font-weight: bold;"><sub>1</sub></span><span style="font-weight: bold;">*w</span><sub><span style="font-weight: bold;">2</span></sub><span style="font-weight: bold;"> + y</span><span style="font-weight: bold;"><sub>1</sub></span><span style="font-weight: bold;">*z</span><sub><span style="font-weight: bold;">2</span></sub><span style="font-weight: bold;"> - z</span><span style="font-weight: bold;"><sub>1</sub></span><span style="font-weight: bold;">*y</span><sub><span style="font-weight: bold;">2</span></sub><span style="font-weight: bold;">) i +</span><br style="font-weight: bold;">
<span style="font-weight: bold;">(w</span><span style="font-weight: bold;"><sub>1</sub></span><span style="font-weight: bold;">*y</span><sub><span style="font-weight: bold;">2</span></sub><span style="font-weight: bold;"> - x</span><span style="font-weight: bold;"><sub>1</sub></span><span style="font-weight: bold;">*z</span><sub><span style="font-weight: bold;">2</span></sub><span style="font-weight: bold;"> + y</span><span style="font-weight: bold;"><sub>1</sub></span><span style="font-weight: bold;">*w</span><sub><span style="font-weight: bold;">2</span></sub><span style="font-weight: bold;"> + z</span><span style="font-weight: bold;"><sub>1</sub></span><span style="font-weight: bold;">*x</span><span style="font-weight: bold;"><sub>1</sub></span><span style="font-weight: bold;">) j +</span><br style="font-weight: bold;">
<span style="font-weight: bold;">(w</span><span style="font-weight: bold;"><sub>1</sub></span><span style="font-weight: bold;">*z</span><sub><span style="font-weight: bold;">2</span></sub><span style="font-weight: bold;"> + x</span><span style="font-weight: bold;"><sub>1</sub></span><span style="font-weight: bold;">*y</span><sub><span style="font-weight: bold;">2</span></sub><span style="font-weight: bold;"> - y</span><span style="font-weight: bold;"><sub>1</sub></span><span style="font-weight: bold;">*x</span><sub><span style="font-weight: bold;">2</span></sub><span style="font-weight: bold;"> + z</span><span style="font-weight: bold;"><sub>1</sub></span><span style="font-weight: bold;">*w</span><sub><span style="font-weight: bold;">2</span></sub></font><span style="font-weight: bold;"><font face="Times New Roman">)&nbsp;&nbsp;&nbsp;  k<br>
</font></span></p>
<p><span style="font-weight: bold;"><font face="Times New Roman">OGRE源代码里这样定义乘法:</font></span></p>
<p> Quaternion Quaternion::operator* (const Quaternion&amp; rkQ) const<br>
&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  // cases p*q != q*p.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return Quaternion<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  (<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  w * rkQ.w - x * rkQ.x - y * rkQ.y - z * rkQ.z,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  w * rkQ.x + x * rkQ.w + y * rkQ.z - z * rkQ.y,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  w * rkQ.y + y * rkQ.w + z * rkQ.x - x * rkQ.z,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  w * rkQ.z + z * rkQ.w + x * rkQ.y - y * rkQ.x<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  );<br>
&nbsp;&nbsp;&nbsp;  }</p><img src ="http://www.cppblog.com/richardhe/aggbug/56944.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/richardhe/" target="_blank">RichardHe</a> 2008-07-23 15:26 <a href="http://www.cppblog.com/richardhe/articles/56944.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>本地化支持:OGRE&amp;CEGUI中文输入 </title><link>http://www.cppblog.com/richardhe/articles/56104.html</link><dc:creator>RichardHe</dc:creator><author>RichardHe</author><pubDate>Mon, 14 Jul 2008 06:33:00 GMT</pubDate><guid>http://www.cppblog.com/richardhe/articles/56104.html</guid><wfw:comment>http://www.cppblog.com/richardhe/comments/56104.html</wfw:comment><comments>http://www.cppblog.com/richardhe/articles/56104.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/richardhe/comments/commentRss/56104.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/richardhe/services/trackbacks/56104.html</trackback:ping><description><![CDATA[<h1 class="firstHeading">本地化支持:OGRE&amp;CEGUI中文输入:源代码</h1>
<h3 id="siteSub">From OGRE 3D 中文</h3>
<div id="jump-to-nav">Jump to: <a  href="http://ogre3d.cn/index.php?title=%E6%9C%AC%E5%9C%B0%E5%8C%96%E6%94%AF%E6%8C%81:OGRE%26CEGUI%E4%B8%AD%E6%96%87%E8%BE%93%E5%85%A5:%E6%BA%90%E4%BB%A3%E7%A0%81#column-one">navigation</a>, <a  href="http://ogre3d.cn/index.php?title=%E6%9C%AC%E5%9C%B0%E5%8C%96%E6%94%AF%E6%8C%81:OGRE%26CEGUI%E4%B8%AD%E6%96%87%E8%BE%93%E5%85%A5:%E6%BA%90%E4%BB%A3%E7%A0%81#searchInput">search</a></div>
<!-- start content -->
<table id="toc" class="toc" summary="目录">
    <tbody>
        <tr>
            <td>
            <div id="toctitle">
            <h2>目录</h2>
            <span class="toctoggle">[<a  href="javascript:toggleToc()" class="internal" id="togglelink">隐藏</a>]</span></div>
            <ul>
                <li class="toclevel-1"><a  href="http://ogre3d.cn/index.php?title=%E6%9C%AC%E5%9C%B0%E5%8C%96%E6%94%AF%E6%8C%81:OGRE%26CEGUI%E4%B8%AD%E6%96%87%E8%BE%93%E5%85%A5:%E6%BA%90%E4%BB%A3%E7%A0%81#.E8.AF.B4.E6.98.8E"><span class="tocnumber">1</span> <span class="toctext">说明</span></a></li>
                <li class="toclevel-1"><a  href="http://ogre3d.cn/index.php?title=%E6%9C%AC%E5%9C%B0%E5%8C%96%E6%94%AF%E6%8C%81:OGRE%26CEGUI%E4%B8%AD%E6%96%87%E8%BE%93%E5%85%A5:%E6%BA%90%E4%BB%A3%E7%A0%81#.E6.BA.90.E4.BB.A3.E7.A0.81"><span class="tocnumber">2</span> <span class="toctext">源代码</span></a></li>
                <li class="toclevel-1"><a  href="http://ogre3d.cn/index.php?title=%E6%9C%AC%E5%9C%B0%E5%8C%96%E6%94%AF%E6%8C%81:OGRE%26CEGUI%E4%B8%AD%E6%96%87%E8%BE%93%E5%85%A5:%E6%BA%90%E4%BB%A3%E7%A0%81#.E4.BD.BF.E7.94.A8.E6.96.B9.E6.B3.95"><span class="tocnumber">3</span> <span class="toctext">使用方法</span></a></li>
                <li class="toclevel-1"><a  href="http://ogre3d.cn/index.php?title=%E6%9C%AC%E5%9C%B0%E5%8C%96%E6%94%AF%E6%8C%81:OGRE%26CEGUI%E4%B8%AD%E6%96%87%E8%BE%93%E5%85%A5:%E6%BA%90%E4%BB%A3%E7%A0%81#.E7.9B.AE.E5.BD.95.E5.86.85.E5.AE.B9"><span class="tocnumber">4</span> <span class="toctext">目录内容</span></a></li>
            </ul>
            </td>
        </tr>
    </tbody>
</table>
<script type="text/javascript"> if (window.showTocToggle) { var tocShowText = "显示"; var tocHideText = "隐藏"; showTocToggle(); } </script>
<div class="editsection" style="float: right; margin-left: 5px;">[<a  href="http://ogre3d.cn/index.php?title=%E6%9C%AC%E5%9C%B0%E5%8C%96%E6%94%AF%E6%8C%81:OGRE%26CEGUI%E4%B8%AD%E6%96%87%E8%BE%93%E5%85%A5:%E6%BA%90%E4%BB%A3%E7%A0%81&amp;action=edit&amp;section=1" title="Edit section: 说明">编辑</a>]</div>
<a name=".E8.AF.B4.E6.98.8E"></a>
<h2> 说明 </h2>
<p>本代码为Win32平台上OGRE 3D图形引擎各版本中文输入所使用。代码中可能存在不完善的地方，如有问题可以到<a  href="http://bbs.gameres.com/showforum.asp?forumid=99" class="external text" target="_blank" title="http://bbs.gameres.com/showforum.asp?forumid=99" rel="nofollow">论坛</a>交流。
</p>
<div class="editsection" style="float: right; margin-left: 5px;">[<a  href="http://ogre3d.cn/index.php?title=%E6%9C%AC%E5%9C%B0%E5%8C%96%E6%94%AF%E6%8C%81:OGRE%26CEGUI%E4%B8%AD%E6%96%87%E8%BE%93%E5%85%A5:%E6%BA%90%E4%BB%A3%E7%A0%81&amp;action=edit&amp;section=2" title="Edit section: 源代码">编辑</a>]</div>
<a name=".E6.BA.90.E4.BB.A3.E7.A0.81"></a>
<h2> 源代码 </h2>
<p><a  href="http://www.ogre3d.cn/ogre3d@download/Ogre1_4_RC1CI.zip" class="external text" target="_blank" title="http://www.ogre3d.cn/ogre3d@download/Ogre1_4_RC1CI.zip" rel="nofollow">下载连接</a>（for OGRE 3D 1.4.0RC1 ）
</p>
<p><a  href="http://www.ogre3d.cn/ogre3d@download/Ogre1_2_5CI.zip" class="external text" target="_blank" title="http://www.ogre3d.cn/ogre3d@download/Ogre1_2_5CI.zip" rel="nofollow">下载连接</a>（for OGRE 3D 1.2.5）
</p>
<div class="editsection" style="float: right; margin-left: 5px;">[<a  href="http://ogre3d.cn/index.php?title=%E6%9C%AC%E5%9C%B0%E5%8C%96%E6%94%AF%E6%8C%81:OGRE%26CEGUI%E4%B8%AD%E6%96%87%E8%BE%93%E5%85%A5:%E6%BA%90%E4%BB%A3%E7%A0%81&amp;action=edit&amp;section=3" title="Edit section: 使用方法">编辑</a>]</div>
<a name=".E4.BD.BF.E7.94.A8.E6.96.B9.E6.B3.95"></a>
<h2> 使用方法 </h2>
<dl><dd>
<ul>
    <li>请先<a  href="http://www.ogre3d.org/index.php?option=com_remository&amp;Itemid=74" class="external text" target="_blank" title="http://www.ogre3d.org/index.php?option=com_remository&amp;Itemid=74" rel="nofollow">下载</a>Windows版本OGRE源代码，以及相应的依赖文件，然后把他们接压在同一目录下。
    </li>
</ul>
</dd></dl>
<dl><dd>
<ul>
    <li>然后把从这个网页下载的源代码相应版本的源代码解压到OgreNew目录下覆盖相应文件。
    </li>
</ul>
</dd></dl>
<dl><dd>
<ul>
    <li>打开工程文件Ogre_vc8.sln，如果之前都进行顺利的话，你可以看到一个叫做Demo_ChineseInput的项目。对这个项目启动生成，之后是漫长的等待时间。生成完毕，你会看到一个简单的带有中文输入的界面演示。
    </li>
</ul>
</dd></dl>
<div class="editsection" style="float: right; margin-left: 5px;">[<a  href="http://ogre3d.cn/index.php?title=%E6%9C%AC%E5%9C%B0%E5%8C%96%E6%94%AF%E6%8C%81:OGRE%26CEGUI%E4%B8%AD%E6%96%87%E8%BE%93%E5%85%A5:%E6%BA%90%E4%BB%A3%E7%A0%81&amp;action=edit&amp;section=4" title="Edit section: 目录内容">编辑</a>]</div>
<a name=".E7.9B.AE.E5.BD.95.E5.86.85.E5.AE.B9"></a>
<h2> 目录内容 </h2>
<ul>
    <li><strong>OGRE 3D 1.4.0RC1</strong>
    </li>
</ul>
<dl><dd>OgreMain\ <em>对引擎的修改，开出对处理win32消息的接口，以及实现</em>
</dd><dd>Samples\
<dl><dd>ChineseInput\<em>中文输入demo项目</em>
</dd><dd>Common\
<dl><dd>CEGUIChineseInput\<em>CEGUI输入窗口组件</em>
</dd><dd>CEGUIChineseInputWR\<em>CEGUI输入窗口渲染组件</em>
</dd><dd>CEGUIChineseInputDependencies\<em>CEGUI输入依赖项目</em>
</dd></dl>
</dd><dd>Media\
<dl><dd>gui\<em>中文输入demo依赖资源文件</em>
</dd></dl>
</dd></dl>
</dd><dd>Ogre_vc8.sln <em>新的工程文件</em>
</dd></dl>
<p><br>
</p>
<ul>
    <li><strong>OGRE 3D 1.2.5</strong>
    </li>
</ul>
<dl><dd>Dependencies\
<dl><dd>include\
<dl><dd>CEGUI\<em>CEGUI0.5.0包含文件</em>
</dd><dd>ois\<em>OIS包含文件</em>
</dd></dl>
</dd><dd>lib\<em>相应库文件（CEGUI&amp;OIS）</em>
</dd></dl>
</dd><dd>OgreMain\
<dl><dd>include\<em>对引擎的修改，开出对处理win32消息的接口</em>
</dd></dl>
</dd><dd>RenderSystems\
<dl><dd>Direct3D9\<em>对引擎的修改，开出对处理win32消息的D3D的实现</em>
</dd><dd>GL\<em>对引擎的修改，开出对处理win32消息的OpenGL的实现</em>
</dd></dl>
</dd><dd>Samples\
<dl><dd>ChineseInput\<em>中文输入demo项目</em>
</dd><dd>Common\
<dl><dd>bin\<em>运行时需要的支持库以及配制文件</em>
</dd><dd>CEGUIChineseInput\<em>CEGUI输入窗口组件</em>
</dd><dd>CEGUIChineseInputWR\<em>CEGUI输入窗口渲染组件</em>
</dd><dd>CEGUIChineseInputDependencies\<em>CEGUI输入依赖项目</em>
</dd><dd>CEGUIRenderer\<em>OGRE对CEGUI0.5版本支持的修改</em>
</dd></dl>
</dd><dd>Media\
<dl><dd>datafiles\<em>中文输入demo依赖资源文件</em>
</dd></dl>
</dd></dl>
</dd><dd>Ogre_vc8.sln <em>新的工程文件</em>
</dd></dl><img src ="http://www.cppblog.com/richardhe/aggbug/56104.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/richardhe/" target="_blank">RichardHe</a> 2008-07-14 14:33 <a href="http://www.cppblog.com/richardhe/articles/56104.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OGRE显示中文</title><link>http://www.cppblog.com/richardhe/articles/56101.html</link><dc:creator>RichardHe</dc:creator><author>RichardHe</author><pubDate>Mon, 14 Jul 2008 06:28:00 GMT</pubDate><guid>http://www.cppblog.com/richardhe/articles/56101.html</guid><wfw:comment>http://www.cppblog.com/richardhe/comments/56101.html</wfw:comment><comments>http://www.cppblog.com/richardhe/articles/56101.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/richardhe/comments/commentRss/56101.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/richardhe/services/trackbacks/56101.html</trackback:ping><description><![CDATA[&nbsp;
一、要显示中文，必须要有可以拿来用中文字体，这个中文字体从何而来呢？在你的C盘有，在你系统的字体里找(C:\WINDOWS\Fonts)。例如：
我们找到一个&#8220;simfang.ttf&#8221;字体（仿宋体）,将它copy并复制到OGRESDK目录下的Media目录下的fonts目录里面
（X:\OgreSDK\media\fonts），你也会发现这里原来就有几个字体。<br><br>&nbsp; &nbsp; 二、有字体以后，就要建立一个simfong.font的文件，这个文件是字体的xml配置文件。怎么创建这个文件呢？用记事本建立然后拷贝如下内容到记事本中：<br><br>
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 95%;">
<div><img  src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top"><span style="color: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version="1.0"&nbsp;</span><span style="color: #0000ff;">?&gt;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Font&nbsp;</span><span style="color: #ff0000;">Name</span><span style="color: #0000ff;">="simfang"</span><span style="color: #ff0000;">&nbsp;Filename</span><span style="color: #0000ff;">="simfang.ttf"</span><span style="color: #ff0000;">&nbsp;Type</span><span style="color: #0000ff;">="FreeType"</span><span style="color: #ff0000;">&nbsp;Size</span><span style="color: #0000ff;">="10"</span><span style="color: #ff0000;">&nbsp;NativeHorzRes</span><span style="color: #0000ff;">="800"</span><span style="color: #ff0000;">&nbsp;NativeVertRes</span><span style="color: #0000ff;">="600"</span><span style="color: #ff0000;">&nbsp;AutoScaled</span><span style="color: #0000ff;">="true"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span></div>
</div>
<br><br>然后将记事本重命名为simfong，然后将后缀名改为font，最后把他放在Media目录下的gui目录里面（X:\OgreSDK\media\gui），你也会发现这里原来就有几个font文件。<br><br>&nbsp; &nbsp; 三、用记事本方式打开OGRE下的TaharezLookSkin.scheme文件（版本不同，可能命名不同，但是后缀名和里面的内容是大同小异的，它的路径貌似X:\OgreSDK\media\gui）。然后在内容为：<br><br>
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 95%;">
<div><img  src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top"><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Font&nbsp;</span><span style="color: #ff0000;">Name</span><span style="color: #0000ff;">="BlueHighway-8"</span><span style="color: #ff0000;">&nbsp;Filename</span><span style="color: #0000ff;">="bluehighway-8.font"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span></div>
</div>
<br><br>的后面，插入如下内容：<br><br>
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 95%;">
<div><img  src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top"><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Font&nbsp;</span><span style="color: #ff0000;">Name</span><span style="color: #0000ff;">="simfang"</span><span style="color: #ff0000;">&nbsp;Filename</span><span style="color: #0000ff;">="simfong.font"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span></div>
</div>
<br><br>这样就完成了显示中文的必要条件了。<br><br>然后就是修改代码了。我们用OGRE官方网里面的WiKi基础教程的例子七做个练习，你也可以到中国的OGRE网(我是这样的称呼它）去看看学习这个练习。<br><br>将这个练习中的代码部分改写如下：<br>
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 95%;">
<div><img  src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top"><span style="color: #000000;">&#8230;&#8230;&#8230;&#8230;<br><img  src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top">&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">mSystem-&gt;setDefaultFont((CEGUI::utf8*)"BlueHighway-12");&nbsp;</span><span style="color: #008000;"><br><img  src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top"></span><span style="color: #000000;">&nbsp;&nbsp;mSystem</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">setDefaultFont((CEGUI::utf8</span><span style="color: #000000;">*</span><span style="color: #000000;">)</span><span style="color: #000000;">"</span><span style="color: #000000;">simfang</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span><span style="color: #008000;">//</span><span style="color: #008000;">SimHei-12</span><span style="color: #008000;"><br><img  src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top"></span><span style="color: #000000;">&#8230;&#8230;&#8230;&#8230;<br><img  src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top">&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">quit-&gt;setText((CEGUI::utf8*)"Quit");</span><span style="color: #008000;"><br><img  src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top"></span><span style="color: #000000;">&nbsp;&nbsp;quit</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">setText((CEGUI::utf8</span><span style="color: #000000;">*</span><span style="color: #000000;">)Ogre::UTFString(L</span><span style="color: #000000;">"</span><span style="color: #000000;">中文退出</span><span style="color: #000000;">"</span><span style="color: #000000;">).asUTF8_c_str());<br><img  src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top">&#8230;&#8230;&#8230;&#8230;</span></div>
</div>
<p><br><br>编译运行。就OK了。</p>
<hr>看到教程6, 就顺便试了试中文显示, 字体设置我倒是想到了, 只是没想到字符集转换这么恶心:<br>
<p>&nbsp;</p>
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 95%;">
<div><img  src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top"><span style="color: #000000;">&nbsp;&nbsp;quit</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">setText((CEGUI::utf8</span><span style="color: #000000;">*</span><span style="color: #000000;">)Ogre::UTFString(L</span><span style="color: #000000;">"</span><span style="color: #000000;">中文退出</span><span style="color: #000000;">"</span><span style="color: #000000;">).asUTF8_c_str());</span></div>
</div>
<p>关于layout文件:</p>
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 95%;">
<div><img  src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top"><span style="color: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version="1.0"&nbsp;</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br><img  src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top"></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">GUILayout</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><img  src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Window&nbsp;</span><span style="color: #ff0000;">Type</span><span style="color: #0000ff;">="DefaultWindow"</span><span style="color: #ff0000;">&nbsp;Name</span><span style="color: #0000ff;">="Tutorial&nbsp;Gui"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><img  src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Window&nbsp;</span><span style="color: #ff0000;">Type</span><span style="color: #0000ff;">="TaharezLook/Button"</span><span style="color: #ff0000;">&nbsp;Name</span><span style="color: #0000ff;">="Quit"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><img  src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Property&nbsp;</span><span style="color: #ff0000;">Name</span><span style="color: #0000ff;">="UnifiedPosition"</span><span style="color: #ff0000;">&nbsp;Value</span><span style="color: #0000ff;">="{{0.35,0},{0.45,0}}"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br><img  src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Property&nbsp;</span><span style="color: #ff0000;">Name</span><span style="color: #0000ff;">="UnifiedSize"</span><span style="color: #ff0000;">&nbsp;Value</span><span style="color: #0000ff;">="{{0.3,0},{0.1,0}}"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br><img  src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Property&nbsp;</span><span style="color: #ff0000;">Name</span><span style="color: #0000ff;">="Text"</span><span style="color: #ff0000;">&nbsp;Value</span><span style="color: #0000ff;">="退出"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br><img  src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">Window</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><img  src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">Window</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><img  src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top"></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">GUILayout</span><span style="color: #0000ff;">&gt;</span></div>
</div>
<p><br>一开始我只是简单的把配置文件中的"Quit"改了"退出",结果运行就报错了, LOG文件显示是:<br></p>
<p>
</p>
<table style="width: 580px; height: 68px;" summary="" width="580" border="1" cellpadding="1" cellspacing="1">
    <tbody>
        <tr>
            <td>Exception: ExpatParser::parseXMLFile - XML Parsing error 'not well-formed (invalid token)' at line 7</td>
        </tr>
    </tbody>
</table>
<p><br>查了查, 原来文件格式也要改成UTF-8格式的,呵呵</p><img src ="http://www.cppblog.com/richardhe/aggbug/56101.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/richardhe/" target="_blank">RichardHe</a> 2008-07-14 14:28 <a href="http://www.cppblog.com/richardhe/articles/56101.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>让OGRE支持中文</title><link>http://www.cppblog.com/richardhe/articles/56100.html</link><dc:creator>RichardHe</dc:creator><author>RichardHe</author><pubDate>Mon, 14 Jul 2008 06:27:00 GMT</pubDate><guid>http://www.cppblog.com/richardhe/articles/56100.html</guid><wfw:comment>http://www.cppblog.com/richardhe/comments/56100.html</wfw:comment><comments>http://www.cppblog.com/richardhe/articles/56100.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/richardhe/comments/commentRss/56100.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/richardhe/services/trackbacks/56100.html</trackback:ping><description><![CDATA[<font size="2">0．前言：<br>
本人非计算机专业，凭着爱好和一腔热血混入游戏开发大军候补小队，平面尚未钻透。为赶时髦，企图叛变到3D阵营，慌乱之中捡起&#8220;OGRE&#8221;。学到如
今，亦可让正方体飞机等不明物体在三次元空间胡乱打转。但觉得本引擎不支持中文显示而感到不爽，便四处寻求高人指教，但大部分高人指点说：&#8220;自己写引擎算
了。&#8221;衡量了一下自己份量，觉得&#8220;自己写&#8221;这件事十年内恐尚难做到。再后来找到3DCastle论坛，经过&#8220;bug王&#8221;以及&#8220;浪客☆龙猫&#8221;
两位前辈的指点，也通过高手&#8220;renwind&#8221;遗留下来的教程，误打误撞竟然自己改出了中文支持，兴奋之余便想写点东西留点纪念。<br>
<br>
1．准备工作<br>
&#8220;bug王&#8221;已经通过WINAPI实现了OGRE在Direct7.0下的中文支持，也有高手说这样效率不高，更因为本人基本上是不怎么熟悉
WINAPI的，所以就放弃了这种方法。企图直接通过贴图来实现中文显示，毕竟OGRE本身文字输出也是用的这种办法，更好的是OGRE引擎除了普通的
&#8220;ttf&#8221;字体外还支持位图字体（其实&#8220;ttf&#8221;在引擎中也被Ogre::Font::createTextureFromFont()转换成位图了），
基本上就是做一个很大很大的图片，然后上面画满汉字，直接读进去就可以了，问题也就变成了——如何找这个大图片。<br>
幸好GBA游戏的开发者们已经找到了很好的文字来源和取得方法，通过金山的16*16点阵字库得到接近9000个字模，然后通过程序读出并写到2048*2048的单色位图上，转换成&#8220;png&#8221;格式图片才221k。<br>
<br>
2．基本知识<br>
修改引擎之前，我们先要知道OGRE是如何显示字体的。OGRE本身面向对象的设计和自带文档都做得非常规范漂亮，很容易就能找到关于显示文字的类以及相关函数。在这里主要看一下关于位图字体是如何显示在画面上。<br>
<br>
(1)字体的读取。<br>
和这项功能相关的有两个类，一个是Ogre::FontManager类，负责分析字体信息（*.fontdef）文件。然后用builder模式构
建一个Ogre::Font类。在Font类中最重要的数据莫过于mTexCoords_u1、mTexCoords_u2、
mTexCoords_v1、mTexCoords_v2这四个数组，他们分别用来储存不同文字对应在图片上的纹理坐标。
不过数组大小明显不够储存9000个汉字的，一会儿要改的。<br>
<br>
(2)字体的显示。<br>
好像字体显示中用得较多的是Ogre::TextAreaGuiElement类，不过好像还有其他的，我们在这里只看这个吧，估计其他的也大同小异。看了看好像唯一和显示字体有关的函数就是void
TextAreaGuiElement::updateGeometry()了，基本上就是根据要写到屏幕上的字串，在Ogre::Font类中得到相应的贴图坐标和贴图，然后画上去，道理也不是很难。<br>
<br>
3．动手术<br>
目标锁定到Ogre::Font，Ogre::FontManager，Ogre::TextAreaGuiElement三个类中，把所有文件备份一遍手术开始！<br>
<br>
(1) Ogre::Font类。<br>
首先是储存文字贴图坐标的数组的大小不够，原来定义的是——宽字符集 (1024 - 32)、ASCII(256 -
32)。这点点大小怎么够我近9000字大军进入，索性都改成(9030 -
32)。还有就是set和get文字贴图的id都是char类型数据，256个id也不够分配给汉字，看来要都改成unsigned
long形（其实大部分机器上int也是32位，不过long是固定32位的类型，感觉统用点）。<br>
<br>
(2) Ogre::FontManager类。<br>
里面从脚本文件中解析贴图坐标的方法是根据单字符的方式，为支持汉字，改成同时可以分析int的。一个汉字对应数字是他的区位码+161（前160个留给了半角字）。<br>
<br>
(3) Ogre::TextAreaGuiElement类。<br>
这个是相对比较麻烦的，他要从字串中分辨出到半角字和中文。在这里增加一个std::vector&lt;unsigned long&gt;
caption，用来储存分辨的结果。增加以下几行：<br>
<br>
<font face="宋体">
&nbsp;&nbsp;&nbsp;
</font>
</font>
<font size="2" face="宋体">
std::vector&lt;unsigned long&gt; caption;<br>
&nbsp;&nbsp;&nbsp;
</font><font size="2" face="宋体">
unsigned char nTemp;<br>
&nbsp;&nbsp;&nbsp;
</font><font size="2" face="宋体">
String::iterator it=mCaption.begin();<br>
&nbsp;&nbsp;&nbsp;
</font><font size="2" face="宋体">
for(;it!=mCaption.end();++it)<br>
&nbsp;&nbsp;&nbsp;
</font><font size="2" face="宋体">
{<br>
&nbsp;&nbsp;&nbsp;
</font>
<font size="2" face="宋体">
&nbsp;&nbsp;&nbsp;
</font>
<font size="2" face="宋体">
if(unsigned char(*it)&lt;=160)//如果是半角<br>
&nbsp;&nbsp;&nbsp;
</font>
<font size="2" face="宋体">
&nbsp;&nbsp;&nbsp;
</font>
<font size="2" face="宋体">
{<br>
&nbsp;&nbsp;&nbsp;
</font>
<font size="2" face="宋体">
&nbsp;&nbsp;&nbsp;
</font>
<font size="2" face="宋体">
&nbsp;&nbsp;&nbsp;
</font>
<font size="2" face="宋体">
caption.push_back((unsigned char)*it);<br>
&nbsp;&nbsp;&nbsp;
</font>
<font size="2" face="宋体">
&nbsp;&nbsp;&nbsp;
</font>
<font size="2" face="宋体">
}<br>
&nbsp;&nbsp;&nbsp;
</font>
<font size="2" face="宋体">
&nbsp;&nbsp;&nbsp;
</font>
<font size="2" face="宋体">
else//处理全角字符<br>
&nbsp;&nbsp;&nbsp;
</font>
<font size="2" face="宋体">
&nbsp;&nbsp;&nbsp;
</font>
<font size="2" face="宋体">
{ <br>
&nbsp;&nbsp;&nbsp;
</font>
<font size="2" face="宋体">
&nbsp;&nbsp;&nbsp;
</font>
<font size="2" face="宋体">
&nbsp;&nbsp;&nbsp;
</font>
<font size="2" face="宋体">
nTemp=(unsigned char)(*it);<br>
&nbsp;&nbsp;&nbsp;
</font>
<font size="2" face="宋体">
&nbsp;&nbsp;&nbsp;
</font>
<font size="2" face="宋体">
&nbsp;&nbsp;&nbsp;
</font>
<font size="2" face="宋体">
++it;<br>
&nbsp;&nbsp;&nbsp;
</font>
<font size="2" face="宋体">
&nbsp;&nbsp;&nbsp;
</font>
<font size="2" face="宋体">
&nbsp;&nbsp;&nbsp;
</font>
<font size="2" face="宋体">
if(it==mCaption.end())<br>
&nbsp;&nbsp;&nbsp;
</font>
<font size="2" face="宋体">
&nbsp;&nbsp;&nbsp;
</font>
<font size="2" face="宋体">
&nbsp;&nbsp;&nbsp;
</font>
<font size="2" face="宋体">
&nbsp;&nbsp;&nbsp;
</font>
<font size="2" face="宋体">
break;<br>
&nbsp;&nbsp;&nbsp;
</font>
<font size="2" face="宋体">
&nbsp;&nbsp;&nbsp;
</font>
<font size="2" face="宋体">
&nbsp;&nbsp;&nbsp;
</font>
<font size="2" face="宋体">
//下面是得到区位码+161的公式。<br>
&nbsp;&nbsp;&nbsp;
</font>
<font size="2" face="宋体">
&nbsp;&nbsp;&nbsp;
</font>
<font size="2" face="宋体">
&nbsp;&nbsp;&nbsp;
</font>
<font size="2" face="宋体">
caption.push_back((94*(nTemp-0xa0-1)+((unsigned
char)(*it)-0xa0-1))+161);<br>
&nbsp;&nbsp;&nbsp;
</font>
<font size="2" face="宋体">
&nbsp;&nbsp;&nbsp;
</font>
<font size="2" face="宋体">
}<br>
&nbsp;&nbsp;&nbsp;
</font><font size="2"><font face="宋体">
}<br>
<br>
</font>
<font face="Arial">
然后后面所有关于mCaption的地方都用caption代替就ok了。<br>
<br>
4．结果。<br>
在OpenGL和DX9.0中成功的支持了中文，但是DX7.0中竟然出现了运行错误，具体问题还不清楚，还望各位高手指教。<br>
因为字体本身原因，文字很扁平的不好看，索性又改了改Ogre::Font，Ogre::FontManager两个类，实现脚本中支持修改文字纵横比例的系数的proportion，当这个值设置为0.8的时候比较好看了。<br>
<br>
<br>
</font>
<font face="宋体">
&nbsp;&nbsp;&nbsp;
</font>
<font face="Arial">
<a  href="http://dev.gameres.com/Program/Visual/3D/zhongwen.rar">相关文件</a><br>
</font>
<font face="宋体">
&nbsp;&nbsp;&nbsp; chinese.fontdef//字体信息文件 放在资源文件加中<br>
&nbsp;&nbsp;&nbsp; font.png//字体图片 放在资源文件加中<br>
<br>
&nbsp;&nbsp;&nbsp; OgreFont.cpp<br>
&nbsp;&nbsp;&nbsp; OgreFont.h<br>
&nbsp;&nbsp;&nbsp; OgreFontManager.cpp<br>
&nbsp;&nbsp;&nbsp; OgreTextAreaGuiElement.cpp<br>
&nbsp;&nbsp;&nbsp; //上面文件覆盖同名文件 就可以 先备份<br>
</font>
<font face="Arial">
<br>
这个是在ogre-win32-v0-13-1基础上改的，请到<a  href="http://jx.jlu.edu.cn/down/ogre-win32-v0-13-1.zip">ogre-win32-v0-13-1.zip</a>下载<br>
<br>
中文字体名字就叫 Chinese,以后能做中文游戏了！<br>
<br>
免费打工仔QQ:1850070</font></font><img src ="http://www.cppblog.com/richardhe/aggbug/56100.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/richardhe/" target="_blank">RichardHe</a> 2008-07-14 14:27 <a href="http://www.cppblog.com/richardhe/articles/56100.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第三人称摄象机系统例子</title><link>http://www.cppblog.com/richardhe/articles/55723.html</link><dc:creator>RichardHe</dc:creator><author>RichardHe</author><pubDate>Wed, 09 Jul 2008 07:42:00 GMT</pubDate><guid>http://www.cppblog.com/richardhe/articles/55723.html</guid><wfw:comment>http://www.cppblog.com/richardhe/comments/55723.html</wfw:comment><comments>http://www.cppblog.com/richardhe/articles/55723.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/richardhe/comments/commentRss/55723.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/richardhe/services/trackbacks/55723.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 第三人称摄象机系统例子Translator：自由骑士笃志（王宏张）Data：2008-5-14l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 前言Ogre是一款优秀的3D图形渲染引擎，在国内，很多前辈从04年甚至更早就对它有了深入的了解，并留了许多译文和心得，极大的便利了我的学习。虽然我起步比较晚，但仍希望自己学习间的这些记录和翻译能够帮助到...&nbsp;&nbsp;<a href='http://www.cppblog.com/richardhe/articles/55723.html'>阅读全文</a><img src ="http://www.cppblog.com/richardhe/aggbug/55723.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/richardhe/" target="_blank">RichardHe</a> 2008-07-09 15:42 <a href="http://www.cppblog.com/richardhe/articles/55723.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ogre命令行工具包使用说明</title><link>http://www.cppblog.com/richardhe/articles/55724.html</link><dc:creator>RichardHe</dc:creator><author>RichardHe</author><pubDate>Wed, 09 Jul 2008 07:42:00 GMT</pubDate><guid>http://www.cppblog.com/richardhe/articles/55724.html</guid><wfw:comment>http://www.cppblog.com/richardhe/comments/55724.html</wfw:comment><comments>http://www.cppblog.com/richardhe/articles/55724.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/richardhe/comments/commentRss/55724.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/richardhe/services/trackbacks/55724.html</trackback:ping><description><![CDATA[<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><span style="font-size: 22pt;" lang="EN-US"><font face="Times New Roman">Ogre</font></span><span style="font-size: 22pt; font-family: 宋体;">命令行工具包使用说明</span><span style="font-size: 22pt;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><font size="2"><span style="font-family: 宋体;">本文档由</span><font face="Times New Roman"> </font><span style="font-family: 宋体;">自由骑士笃志</span><font face="Times New Roman"> </font><span style="font-family: 宋体;">翻译整理</span><span lang="EN-US"><font face="Times New Roman">,</font></span><span style="font-family: 宋体;">版权属于</span><span lang="EN-US"><font face="Times New Roman">OgreTeam</font></span><span style="font-family: 宋体;">。转载请包含本行信息。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="left"><span lang="EN-US"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><o:p><font size="3" face="Times New Roman">&nbsp;</font></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">这个工具包包含了一些对</span><span lang="EN-US"><font face="Times New Roman">Ogre</font></span><span style="font-family: 宋体;">资源文件进行操作的预处理命令行工具。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">它包括</span><span lang="EN-US"><font face="Times New Roman">OgreXMLConveter, OgreMeshUpgrade, OgreMaterialUpgrade</font></span><span style="font-family: 宋体;">和</span><span lang="EN-US"><font face="Times New Roman">MeshMagick</font></span><span style="font-family: 宋体;">。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">您可以在<a href="http://downloads.sourceforge.net/ogre/OgreCommandLineTools_v1.4.7.msi">这里</a>获得其</span><span lang="EN-US"><font face="Times New Roman">WindowsV<st1:chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on">1.4.7</st1:chsdate></font></span><span style="font-family: 宋体;">版本的下载</span><span lang="EN-US"><font face="Times New Roman">,</font></span><span style="font-family: 宋体;">或者在<a href="http://downloads.sourceforge.net/ogre/OgreEihortToolsOSX_1.4.0.zip?downloads">这里</a>获取其</span><span lang="EN-US"><font face="Times New Roman">MacOSXV1.4.0</font></span><span style="font-family: 宋体;">版本的下载。以上两个版本均是</span><st1:chsdate year="2008" month="3" day="6" islunardate="False" isrocdate="False" w:st="on"><span lang="EN-US"><font face="Times New Roman">2008</font></span><span style="font-family: 宋体;">年</span><span lang="EN-US"><font face="Times New Roman">3</font></span><span style="font-family: 宋体;">月</span><span lang="EN-US"><font face="Times New Roman">6</font></span><span style="font-family: 宋体;">日</span></st1:chsdate><span style="font-family: 宋体;">的版本，即译者进行翻译的版本，若需要更多信息和更新的版本，可以访问</span><span lang="EN-US"><font face="Times New Roman"><a href="http://www.ogre3d.org/">Ogre</a></font></span><span style="font-family: 宋体;"><a href="javascript:void(0);/*1210036509359*/">官方</a>。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;"></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体;"></span><span lang="EN-US"><font size="4">.[OgreXMLConveter]</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">OgreXML</font></span><span style="font-family: 宋体;">转换器能够将</span><span lang="EN-US"><font face="Times New Roman"> .mesh </font></span><span style="font-family: 宋体;">模型网格文件</span><font face="Times New Roman"> </font><span style="font-family: 宋体;">和</span><span lang="EN-US"><font face="Times New Roman"> .skeleton </font></span><span style="font-family: 宋体;">骨骼文件</span><font face="Times New Roman"> </font><span style="font-family: 宋体;">由</span><span lang="EN-US"><font face="Times New Roman">XML</font></span><span style="font-family: 宋体;">格式转换为二进制格式，同时可以将其二进制格式转换回</span><span lang="EN-US"><font face="Times New Roman">XML</font></span><span style="font-family: 宋体;">格式。它同时也允许你在将</span><span lang="EN-US"><font face="Times New Roman">XML</font></span><span style="font-family: 宋体;">格式转换为二进制格式时设置</span><span lang="EN-US"><font face="Times New Roman">LOD</font></span><span style="font-family: 宋体;">层级信息。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">如果你的</span><span lang="EN-US"><font face="Times New Roman">Ogre</font></span><span style="font-family: 宋体;">脚本资源中原本使用的就是</span><span lang="EN-US"><font face="Times New Roman">XML</font></span><span style="font-family: 宋体;">格式文件的话，那么本工具则是</span><span lang="EN-US"><font face="Times New Roman">Ogre</font></span><span style="font-family: 宋体;">运行时必须的。所以你能够在</span><span lang="EN-US"><font face="Times New Roman">OgreSource</font></span><span style="font-family: 宋体;">包的</span><span lang="EN-US"><font face="Times New Roman">Tools/XMLConverter</font></span><span style="font-family: 宋体;">中找到它。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><o:p><font size="3" face="Times New Roman">&nbsp;</font></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><strong><span style="font-family: 宋体;">使用方法</span></strong><span style="font-family: 宋体;">：</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">OgreXMLConverter </font></span><span style="font-family: 宋体;">操作选项</span><font face="Times New Roman"> </font><span style="font-family: 宋体;">源文件路径</span><font face="Times New Roman"> </font><span style="font-family: 宋体;">目标文件路径</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><o:p><font size="3" face="Times New Roman">&nbsp;</font></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体;"><font size="3">有用的操作选项包括：</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-i<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;</span>= <span>&nbsp;</span></font></span><span style="font-family: 宋体;">控制与命令行。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-l<span>&nbsp; </span>nLODNum<span>&nbsp; </span>= </font></span><span style="font-family: 宋体;">指定总</span><span lang="EN-US"><font face="Times New Roman">LOD</font></span><span style="font-family: 宋体;">层级</span><span lang="EN-US"><font face="Times New Roman"> ( </font></span><span style="font-family: 宋体;">该项仅在</span><span lang="EN-US"><font face="Times New Roman">XML</font></span><span style="font-family: 宋体;">格式转换为</span><span lang="EN-US"><font face="Times New Roman">Mesh</font></span><span style="font-family: 宋体;">格式时有效</span><span lang="EN-US"><font face="Times New Roman"> )</font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-d<span>&nbsp; </span>nLODDis<span>&nbsp; </span>= </font></span><span style="font-family: 宋体;">指定</span><span lang="EN-US"><font face="Times New Roman">LOD</font></span><span style="font-family: 宋体;">层级间的距离增幅</span><span lang="EN-US"><font face="Times New Roman"> ( </font></span><span style="font-family: 宋体;">该项仅在</span><span lang="EN-US"><font face="Times New Roman">XML</font></span><span style="font-family: 宋体;">格式转换为</span><span lang="EN-US"><font face="Times New Roman">Mesh</font></span><span style="font-family: 宋体;">格式时有效</span><span lang="EN-US"><font face="Times New Roman"> )</font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-p<span>&nbsp; </span>nLODPer<span>&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">指定每两级</span><span lang="EN-US"><font face="Times New Roman">LOD</font></span><span style="font-family: 宋体;">层之间三角面减少百分比</span><span lang="EN-US"><font face="Times New Roman"> ( </font></span><span style="font-family: 宋体;">该项仅在</span><span lang="EN-US"><font face="Times New Roman">XML</font></span><span style="font-family: 宋体;">格式转换为</span><span lang="EN-US"><font face="Times New Roman">Mesh</font></span><span style="font-family: 宋体;">格式时有效</span><span lang="EN-US"><font face="Times New Roman"> )</font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-f<span>&nbsp; </span>nLODNum<span>&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">指定两级</span><span lang="EN-US"><font face="Times New Roman">LOD</font></span><span style="font-family: 宋体;">层之间的固定顶点减少量</span><span lang="EN-US"><font face="Times New Roman"> ( </font></span><span style="font-family: 宋体;">该项仅在</span><span lang="EN-US"><font face="Times New Roman">XML</font></span><span style="font-family: 宋体;">格式转换为</span><span lang="EN-US"><font face="Times New Roman">Mesh</font></span><span style="font-family: 宋体;">格式时有效</span><span lang="EN-US"><font face="Times New Roman"> )</font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-e<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">关闭模版阴影的</span><span lang="EN-US"><font face="Times New Roman">edge</font></span><span style="font-family: 宋体;">表</span><span lang="EN-US"><font face="Times New Roman"> ( </font></span><span style="font-family: 宋体;">当使用模版阴影时该项才有效</span><span lang="EN-US"><font face="Times New Roman"> )</font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-r<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">关闭</span><span lang="EN-US"><font face="Times New Roman">Ogre</font></span><span style="font-family: 宋体;">推荐的顶点缓冲区格式。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-t<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">为法线贴图生成切线信息</span><span lang="EN-US"><font face="Times New Roman"> ( </font></span><span style="font-family: 宋体;">当使用法线贴图时该项才有效</span><span lang="EN-US"><font face="Times New Roman"> )</font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-o<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">关闭冗余关键桢和运动轨迹的剔除</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-d3d<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">优先使用</span><span lang="EN-US"><font face="Times New Roman">D3D</font></span><span style="font-family: 宋体;">进行颜色格式的填充</span><span lang="EN-US"><font face="Times New Roman"> ( </font></span><span style="font-family: 宋体;">在</span><span lang="EN-US"><font face="Times New Roman">Windows</font></span><span style="font-family: 宋体;">平台中默认该项开启</span><span lang="EN-US"><font face="Times New Roman"> )</font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-gl<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">优先使用</span><span lang="EN-US"><font face="Times New Roman">GL</font></span><span style="font-family: 宋体;">进行颜色格式的填充</span><span lang="EN-US"><font face="Times New Roman"> ( </font></span><span style="font-family: 宋体;">在非</span><span lang="EN-US"><font face="Times New Roman">Windows</font></span><span style="font-family: 宋体;">平台中默认该项开启</span><span lang="EN-US"><font face="Times New Roman"> )</font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-E endian<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">设置</span><span lang="EN-US"><font face="Times New Roman">endian</font></span><span style="font-family: 宋体;">模式，可以选择</span><span lang="EN-US"><font face="Times New Roman">big, little </font></span><span style="font-family: 宋体;">或</span><font face="Times New Roman"> <span lang="EN-US">native ( </span></font><span style="font-family: 宋体;">默认为</span><span lang="EN-US"><font face="Times New Roman">native )</font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-q<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">轻量模式，减少输出。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-log filename<span>&nbsp;&nbsp; </span>=<span>&nbsp; </span>Log</font></span><span style="font-family: 宋体;">文件名称。（默认为</span><span lang="EN-US"><font face="Times New Roman">OgreXMLConverter.log</font></span><span style="font-family: 宋体;">）</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;"></span></font><span lang="EN-US"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="4">.[OgreMeshUpgrade]</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">这个工具能够将你的任何老版本的</span><span lang="EN-US"><font face="Times New Roman"> .mesh </font></span><span style="font-family: 宋体;">文件更新到当前版本的</span><span lang="EN-US"><font face="Times New Roman"> .mesh </font></span><span style="font-family: 宋体;">文件。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">你可以在</span><span lang="EN-US"><font face="Times New Roman">Ogre.log</font></span><span style="font-family: 宋体;">文件中得到</span><span lang="EN-US"><font face="Times New Roman">.mesh</font></span><span style="font-family: 宋体;">文件的版本信息。一般来说，</span><span lang="EN-US"><font face="Times New Roman">Ogre</font></span><span style="font-family: 宋体;">可以运行老版本的</span><span lang="EN-US"><font face="Times New Roman">.mesh</font></span><span style="font-family: 宋体;">文件，但是性能上会有一些差别。如果你更新了</span><span lang="EN-US"><font face="Times New Roman">Ogre</font></span><span style="font-family: 宋体;">的其他部分，你尽量应当将</span><span lang="EN-US"><font face="Times New Roman">.mesh</font></span><span style="font-family: 宋体;">文件更新为同样的版本。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><o:p><font size="3" face="Times New Roman">&nbsp;</font></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><strong><span style="font-family: 宋体;">使用方法</span></strong><span style="font-family: 宋体;">：</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">OgreMeshUpgrate </font></span><span style="font-family: 宋体;">操作选项</span><font face="Times New Roman"> </font><span style="font-family: 宋体;">源文件路径</span><font face="Times New Roman"> </font><span style="font-family: 宋体;">目标文件路径</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><o:p><font size="3" face="Times New Roman">&nbsp;</font></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体;"><font size="3">有用的操作选项包括：</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-i<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">控制与命令行。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-l<span>&nbsp; </span>nLODNum<span>&nbsp; </span>= </font></span><span style="font-family: 宋体;">指定总</span><span lang="EN-US"><font face="Times New Roman">LOD</font></span><span style="font-family: 宋体;">层级</span><span lang="EN-US"><font face="Times New Roman"> ( </font></span><span style="font-family: 宋体;">该项仅在</span><span lang="EN-US"><font face="Times New Roman">XML</font></span><span style="font-family: 宋体;">格式转换为</span><span lang="EN-US"><font face="Times New Roman">Mesh</font></span><span style="font-family: 宋体;">格式时有效</span><span lang="EN-US"><font face="Times New Roman"> )</font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-d<span>&nbsp; </span>nLODDis<span>&nbsp; </span>= </font></span><span style="font-family: 宋体;">指定</span><span lang="EN-US"><font face="Times New Roman">LOD</font></span><span style="font-family: 宋体;">层级间的距离增幅</span><span lang="EN-US"><font face="Times New Roman"> ( </font></span><span style="font-family: 宋体;">该项仅在</span><span lang="EN-US"><font face="Times New Roman">XML</font></span><span style="font-family: 宋体;">格式转换为</span><span lang="EN-US"><font face="Times New Roman">Mesh</font></span><span style="font-family: 宋体;">格式时有效</span><span lang="EN-US"><font face="Times New Roman"> )</font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-p<span>&nbsp; </span>nLODPer<span>&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">指定每两级</span><span lang="EN-US"><font face="Times New Roman">LOD</font></span><span style="font-family: 宋体;">层之间三角面减少百分比</span><span lang="EN-US"><font face="Times New Roman"> ( </font></span><span style="font-family: 宋体;">该项仅在</span><span lang="EN-US"><font face="Times New Roman">XML</font></span><span style="font-family: 宋体;">格式转换为</span><span lang="EN-US"><font face="Times New Roman">Mesh</font></span><span style="font-family: 宋体;">格式时有效</span><span lang="EN-US"><font face="Times New Roman"> )</font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-f<span>&nbsp; </span>nLODNum<span>&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">指定两级</span><span lang="EN-US"><font face="Times New Roman">LOD</font></span><span style="font-family: 宋体;">层之间的固定顶点减少量</span><span lang="EN-US"><font face="Times New Roman"> ( </font></span><span style="font-family: 宋体;">该项仅在</span><span lang="EN-US"><font face="Times New Roman">XML</font></span><span style="font-family: 宋体;">格式转换为</span><span lang="EN-US"><font face="Times New Roman">Mesh</font></span><span style="font-family: 宋体;">格式时有效</span><span lang="EN-US"><font face="Times New Roman"> )</font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-e<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">关闭模版阴影的</span><span lang="EN-US"><font face="Times New Roman">edge</font></span><span style="font-family: 宋体;">表</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-r<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">关闭</span><span lang="EN-US"><font face="Times New Roman">Ogre</font></span><span style="font-family: 宋体;">推荐的顶点缓冲区格式。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-t<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">为法线贴图生成切线信息</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-d3d<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">转换为</span><span lang="EN-US"><font face="Times New Roman">D3D</font></span><span style="font-family: 宋体;">颜色格式</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-gl<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">转换为</span><span lang="EN-US"><font face="Times New Roman">GL</font></span><span style="font-family: 宋体;">颜色格式</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-srcd3d<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">老版本的</span><span lang="EN-US"><font face="Times New Roman">mesh</font></span><span style="font-family: 宋体;">文件为</span><span lang="EN-US"><font face="Times New Roman">D3D</font></span><span style="font-family: 宋体;">颜色格式</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-srcgl<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">老版本的</span><span lang="EN-US"><font face="Times New Roman">mesh</font></span><span style="font-family: 宋体;">文件为</span><span lang="EN-US"><font face="Times New Roman">GL</font></span><span style="font-family: 宋体;">颜色格式</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">-E endian<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>=<span>&nbsp; </span></font></span><span style="font-family: 宋体;">设置</span><span lang="EN-US"><font face="Times New Roman">endian</font></span><span style="font-family: 宋体;">模式，可以选择</span><span lang="EN-US"><font face="Times New Roman">big, little </font></span><span style="font-family: 宋体;">或</span><span lang="EN-US"><font face="Times New Roman"> native ( </font></span><span style="font-family: 宋体;">默认为</span><span lang="EN-US"><font face="Times New Roman">native )</font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><o:p><font size="3" face="Times New Roman">&nbsp;</font></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><font size="3"><span style="font-family: 宋体;">注意：</span><span lang="EN-US"><o:p></o:p></span></font></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">这个工具现在允许你自定义重组你的</span><span lang="EN-US"><font face="Times New Roman">mesh</font></span><span style="font-family: 宋体;">网格文件的顶点格式。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">如果你想更新</span><st1:chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on"><span lang="EN-US"><font face="Times New Roman">0.15.0</font></span></st1:chsdate><span style="font-family: 宋体;">之前的任意一个版本的</span><span lang="EN-US"><font face="Times New Roman">mesh</font></span><span style="font-family: 宋体;">，那么在该程序运行时会问你是否希望进行顶点格式的重组，你输入</span><span lang="EN-US"><font face="Times New Roman">&#8217;y&#8217;</font></span><span style="font-family: 宋体;">就可以了。在</span><span lang="EN-US"><font face="Times New Roman">0.15.0</font></span><span style="font-family: 宋体;">版本之后的</span><span lang="EN-US"><font face="Times New Roman">mesh</font></span><span style="font-family: 宋体;">在更新时会允许你对该</span><span lang="EN-US"><font face="Times New Roman">mesh</font></span><span style="font-family: 宋体;">做更多的操作：例如，你可以对每个独立模型节点的顶点指定不同的顶点结构，你既可以自定义顶点结构，也可以使用</span><span lang="EN-US"><font face="Times New Roman">&#8217;automatic&#8217;</font></span><span style="font-family: 宋体;">自动模式。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="4"><span lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="4"><span lang="EN-US"><o:p>.</o:p></span><span lang="EN-US">[OgreMaterialUpgrade]</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">这个工具能够将你的任何老版本的</span><span lang="EN-US"><font face="Times New Roman"> .material </font></span><span style="font-family: 宋体;">材质文件更新到当前版本的</span><span lang="EN-US"><font face="Times New Roman"> .material </font></span><span style="font-family: 宋体;">材质文件。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">值得注意的是这个自动更新是不会加入一些新的脚本语法功能的，这么说你可能不好理解。（例子：</span><font face="Times New Roman"> <span lang="EN-US">&#8220;scene_blend add&#8221;</span></font><span style="font-family: 宋体;">这句可能会被更新为</span><span lang="EN-US"><font face="Times New Roman">&#8221;scene_blend one one&#8221;</font></span><span style="font-family: 宋体;">，因为</span><span lang="EN-US"><font face="Times New Roman">&#8221;add&#8221;</font></span><span style="font-family: 宋体;">的底层实际上就是</span><span lang="EN-US"><font face="Times New Roman">&#8221;scene_blend one one&#8221;</font></span><span style="font-family: 宋体;">，自动更新会将一些高级语法更新为比较直接底层的语法）</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">另外，这个工具仅对</span><st1:chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on"><span lang="EN-US"><font face="Times New Roman">0.13.0</font></span></st1:chsdate><span style="font-family: 宋体;">版本以下的材质脚本更新有效，对</span><span lang="EN-US"><font face="Times New Roman">0.13.0</font></span><span style="font-family: 宋体;">版本以后的材质脚本是没有必要进行更新的。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><o:p><font size="3" face="Times New Roman">&nbsp;</font></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><font size="3"><span style="font-family: 宋体;">使用方法：</span><span lang="EN-US"><o:p></o:p></span></font></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">OgreMaterialUpgrade </font></span><span style="font-family: 宋体;">源文件路径</span><font face="Times New Roman"> </font><span style="font-family: 宋体;">目标文件路径</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="4"><span lang="EN-US"><o:p>&nbsp;.</o:p></span><span lang="EN-US">[MeshMagick]</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font size="3" face="Times New Roman">Copyright 2007 by Daniel Wickert</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">这个工具是对</span><span lang="EN-US"><font face="Times New Roman">mesh</font></span><span style="font-family: 宋体;">文件和</span><span lang="EN-US"><font face="Times New Roman">skeleton</font></span><span style="font-family: 宋体;">文件进行一些处理的工具。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体;"><font size="3">大致包括以下功能：</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">Info<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>= </font></span><span style="font-family: 宋体;">输出</span><span lang="EN-US"><font face="Times New Roman">mesh</font></span><span style="font-family: 宋体;">的信息。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">Meshmerge<span>&nbsp;&nbsp; </span>= </font></span><span style="font-family: 宋体;">将多个</span><span lang="EN-US"><font face="Times New Roman">mesh</font></span><span style="font-family: 宋体;">合并为一个</span><span lang="EN-US"><font face="Times New Roman">mesh</font></span><span style="font-family: 宋体;">文件</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">rename <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>= </font></span><span style="font-family: 宋体;">重命名</span><span lang="EN-US"><font face="Times New Roman">mesh</font></span><span style="font-family: 宋体;">和</span><span lang="EN-US"><font face="Times New Roman">skeleton</font></span><span style="font-family: 宋体;">的不同元件</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">transform<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>= </font></span><span style="font-family: 宋体;">旋转，缩放一个</span><span lang="EN-US"><font face="Times New Roman">mesh</font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><o:p><font size="3" face="Times New Roman">&nbsp;</font></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><font size="3"><span style="font-family: 宋体;">使用方式：</span><span lang="EN-US"><o:p></o:p></span></font></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">MeshMagick &#8211;help=</font></span><span style="font-family: 宋体;">工具名</span><font face="Times New Roman"> </font><span style="font-family: 宋体;">可以获得更多相关信息。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><o:p><font size="3">&nbsp;</font></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="4"><span lang="EN-US"><o:p>.</o:p></span><span lang="EN-US">[</span><font face="Arial"><span style="font-family: 宋体;">译者笃志补充说明</span><span lang="EN-US">]</span></font></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">1</font></span><span style="font-family: 宋体;">：除</span><span lang="EN-US"><font face="Times New Roman">MeshMagick</font></span><span style="font-family: 宋体;">该工具外，其他三种工具，使用方式都可以是：将源资源文件拖拽到工具的</span><span lang="EN-US"><font face="Times New Roman">exe</font></span><span style="font-family: 宋体;">图标上。因为更新程序会将源文件覆盖，所以推荐做下备份后再更新。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">2</font></span><span style="font-family: 宋体;">：您可以写批处理文件对其进行使用。格式即为上面的使用方式。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">举例：新建一个文本文件</span><span lang="EN-US"><font face="Times New Roman">test.txt </font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 31.5pt;"><font size="3"><span style="font-family: 宋体;">编辑内容为</span><span lang="EN-US"><font face="Times New Roman"> OgreMeshUpgrate &#8211;d3d &#8211;l 4 &#8211;d 500 &#8211;p 30 E:\Ogre\Media\TestSrc.xml F:\Temp\TestDest.mesh</font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 31.5pt;"><font size="3"><span style="font-family: 宋体;">修改文本后缀名为</span><span lang="EN-US"><font face="Times New Roman">test.bat</font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 31.5pt;"><font size="3"><span style="font-family: 宋体;">将该批处理文件与</span><span lang="EN-US"><font face="Times New Roman">OgreMeshUpgrate.exe</font></span><span style="font-family: 宋体;">放置同一目录下，运行</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 31.5pt;"><font size="3"><span style="font-family: 宋体;">则会自动将</span><span lang="EN-US"><font face="Times New Roman">E:\Ogre\Media\TestSrc.xml</font></span><span style="font-family: 宋体;">文件转换为</span><span lang="EN-US"><font face="Times New Roman">F:\Temp\TestDest.mesh</font></span><span style="font-family: 宋体;">文件，同时开启了</span><span lang="EN-US"><font face="Times New Roman">4</font></span><span style="font-family: 宋体;">层</span><span lang="EN-US"><font face="Times New Roman">Lod</font></span><span style="font-family: 宋体;">，</span><span lang="EN-US"><font face="Times New Roman">Lod</font></span><span style="font-family: 宋体;">间距为</span><span lang="EN-US"><font face="Times New Roman">500</font></span><span style="font-family: 宋体;">象素，每一级间面数差距为</span><span lang="EN-US"><font face="Times New Roman">30%</font></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">3</font></span><span style="font-family: 宋体;">：</span><span lang="EN-US"><font face="Times New Roman">OgreMeshUpgrate</font></span><span style="font-family: 宋体;">工具推荐使用</span><span lang="EN-US"><font face="Times New Roman">automatic</font></span><span style="font-family: 宋体;">自动模式顶点格式，效率会比较高，并且省去不少麻烦。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font size="3"><span lang="EN-US"><font face="Times New Roman">4</font></span><span style="font-family: 宋体;">：</span><span lang="EN-US"><font face="Times New Roman">MeshMagick</font></span><span style="font-family: 宋体;">工具不推荐使用。本身功能有限，而且长期无人维护，对新的</span><span lang="EN-US"><font face="Times New Roman">mesh</font></span><span style="font-family: 宋体;">支持不好。</span></font></p><img src ="http://www.cppblog.com/richardhe/aggbug/55724.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/richardhe/" target="_blank">RichardHe</a> 2008-07-09 15:42 <a href="http://www.cppblog.com/richardhe/articles/55724.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> Ogre学习记录</title><link>http://www.cppblog.com/richardhe/articles/55722.html</link><dc:creator>RichardHe</dc:creator><author>RichardHe</author><pubDate>Wed, 09 Jul 2008 07:36:00 GMT</pubDate><guid>http://www.cppblog.com/richardhe/articles/55722.html</guid><wfw:comment>http://www.cppblog.com/richardhe/comments/55722.html</wfw:comment><comments>http://www.cppblog.com/richardhe/articles/55722.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/richardhe/comments/commentRss/55722.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/richardhe/services/trackbacks/55722.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1： 设计初衷它设计初衷是完全跨平台的。抽象的接口隐藏了平台相关的细节。它设计初衷是大幅度支持扩展的。支持多种场景类型，独立出平台和3D接口限制。2： 基本类结构关系Roo：对象为一切的入口，它负责创建Ogre的所有基础元素，三大基础元素大致包括：场景管理器，绘制系统，资源管理器。场景管理器：场景节点，动态对象。资源管理器：资源组管理，资源管理渲染模块：硬件缓冲区管理，...&nbsp;&nbsp;<a href='http://www.cppblog.com/richardhe/articles/55722.html'>阅读全文</a><img src ="http://www.cppblog.com/richardhe/aggbug/55722.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/richardhe/" target="_blank">RichardHe</a> 2008-07-09 15:36 <a href="http://www.cppblog.com/richardhe/articles/55722.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 游戏开发中常用的设计模式</title><link>http://www.cppblog.com/richardhe/articles/55721.html</link><dc:creator>RichardHe</dc:creator><author>RichardHe</author><pubDate>Wed, 09 Jul 2008 07:34:00 GMT</pubDate><guid>http://www.cppblog.com/richardhe/articles/55721.html</guid><wfw:comment>http://www.cppblog.com/richardhe/comments/55721.html</wfw:comment><comments>http://www.cppblog.com/richardhe/articles/55721.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/richardhe/comments/commentRss/55721.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/richardhe/services/trackbacks/55721.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 出自http://blog.csdn.net/duzhi5368/archive/2008/04/22/2314232.aspx使用设计模式来提高程序库的重复利用性是大型程序项目开发必须的。但是在&#8220;四人帮&#8221;的设计模式概述中提到了23种标准设计模式，不但难以记住，而且有些设计模式更多的适用于应用程序开发，对游戏项目引擎设计并没有很多的利用价值。根据经验，精挑细选后，笃志在...&nbsp;&nbsp;<a href='http://www.cppblog.com/richardhe/articles/55721.html'>阅读全文</a><img src ="http://www.cppblog.com/richardhe/aggbug/55721.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/richardhe/" target="_blank">RichardHe</a> 2008-07-09 15:34 <a href="http://www.cppblog.com/richardhe/articles/55721.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OGRE+Physx赛车游戏开发心得</title><link>http://www.cppblog.com/richardhe/articles/55720.html</link><dc:creator>RichardHe</dc:creator><author>RichardHe</author><pubDate>Wed, 09 Jul 2008 07:30:00 GMT</pubDate><guid>http://www.cppblog.com/richardhe/articles/55720.html</guid><wfw:comment>http://www.cppblog.com/richardhe/comments/55720.html</wfw:comment><comments>http://www.cppblog.com/richardhe/articles/55720.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/richardhe/comments/commentRss/55720.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/richardhe/services/trackbacks/55720.html</trackback:ping><description><![CDATA[<p>出自: <a href="http://blog.csdn.net/tonywjd/archive/2006/08/11/1052346.aspx">http://blog.csdn.net/tonywjd/archive/2006/08/11/1052346.aspx</a></p>
<p>游戏主要用到了几个引擎，物理引擎（PhysicsX SDK <st1:chsdate isrocdate="False" islunardate="False" day="30" month="12" year="1899">2.3.2</st1:chsdate>，即NovedeX的新版本），图形渲染引擎（OGRE 1.2.0，包括人机界面的CEGUI部分），声音引擎（Direct Sound），网络引擎（RakNet，可惜由于时间等原因，加入失败，大大降低游戏可玩性），建模用Maya和3dsMax。</p>
<p><strong>模型的导出</strong><strong></strong></p>
<p>OGRE有自己的3D模型格式（.mesh格式）。导出可以直接出OGRE官方网站下载导出插件。不过导出插件有好些Bug。对于建模方式的不同导出也不同，Maya的导出插件不能导出非封闭的曲面，而3dsMax可以，所以可以通过它导成.mesh。</p>
<p>另外，在物理引擎中要表现精确的碰撞，最好能得到模型的网格结构，即模型的点面信息，而不是用简单的规则形式来包裹。我们的游戏中地图用的是前者，而车辆道具等用的是后者。</p>
<p>但PhysicsX并不支持.mesh。所以我们是通过导出插件导出的.mesh.xml格式文件中读取点面信息（仅此），再写到自定义的二进制文件格式中，为物理引擎使用。</p>
<p><strong>OGRE</strong><strong>与</strong><strong>PhysicsX</strong><strong>之间的耦合</strong><strong></strong></p>
<p>PhysicsX和OGRE场景管理比较类似，都有对应的类。一个可以移动的物体，在OGRE中可以用SceneNode实现，并加入到场景管理
中，在PhysicsX中则可以用NxActor对应。NxActor中PhysicsX中的一个物理单位，它可以把一个物体用简单的几个规则几何形状包
裹起来，所以的重力、碰撞等物理作用都作用在NxActor中，并产生相应的物理反应。得到相应的物理数据之后，再通过设置SceneNode相应属性，
就可以实现逼真的物理效果。</p>
<p>事实上，地图场景也是作为普通的3D物体来实现。</p>
<p>而OGRE与PhysicsX之间的映射并不是对于每一个物体进行映射封装实现。而是把这两部分封装成独立的两个模块，但这两部分中所有的物体都是
一一对应的。在主程序中，再把从PhysicsX部分计算出的结果，传递给OGRE部分，进行绘制。这样也为网络的加入提供了好的嵌入点。因为只要服务端
进行全部物理运算，再把运算的结果发给客户端OGRE进行渲染。</p>
<p>OGRE中的frameStated(const FrameEvent &amp;evt)作为程序的主线程，在其中调用</p>
<p>m_NxScene-&gt;simulate(evt.timeSinceLastFrame); // m_NxScene, instance of (NxScene*)</p>
<p>m_NxScene-&gt;flushStream();</p>
<p>m_NxScene-&gt;fetchResults(NX_RIGID_BODY_FINISHED);</p>
<p>再把运算的物理结果给OGRE绘制。</p>
<p>这样OGRE与PhysicsX结合在一起，而两者的内部实现是互不影响的，可以独立编程，只要处理好两者物体的一一对应关系。</p>
<p><strong>地图场景的实现</strong></p>
<p>对于OGRE来说有专门的室外地图场景管理。但是由于其高度图很难导入到PhysicsX中，除非通过建模时得到点面信息，但在具体操作中很难做到
高度图与网格点面信息的一致。我们还试过在程序初始化时通过OGRE的Ray取得地图上M*N个点的坐标，组成2*M*N个三角形面片，使用到物理引擎
中，近似的实现物理地图。但这种实现所有的三角形在XZ平面上的投影都是一样的，面片太少可能不精确，太多又会增加不必要的开销，总的来说不够理想。</p>
<p>PhysicsX中也有专门用于处理地图场景的NxActor，可以在创建NxActor前通过</p>
<p>terrainDesc.heightFieldVerticalAxis = NX_Y;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  // terrainDesc is a NxTriangleMeshDes</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  // Default: NX_NOT_HEIGHTFIELD</p>
<p>terrainDesc.heightFieldVerticalExtent&nbsp;&nbsp;&nbsp;  = <st1:chmetcnv tcsc="0" numbertype="1" negative="True" hasspace="False" sourcevalue="1000" unitname="F">-1000.0f</st1:chmetcnv>;</p>
<p>进行设置。这样可以大大的提高效率。这本来应该是一个理想的做法。但由于我们建模时模型导出有些误差的原因，会出现某些面片为垂直，物理碰撞的效果
在这些地方过于激烈，表现在屏幕上就是车会突然被撞得飞起来很高。我们试了很久都没找到合适的模型导出方法避免这一现象。所以只有所地图场景也作为一个普
通的NxActor进行处理，这样，虽然克服不了建模导出时的这个问题，但也不易被玩家发觉。</p>
<p>这样，地图场景就有了实现的方法了：在OGRE中作为普通的.mesh对待，创建SceneNode和Entity；在PhysicsX中，作为普通的NxActor对待，只是用NxCooking进行处理，具体没去细究，可能是为了提高性能。</p>
<p><strong>车辆的实现</strong><strong></strong></p>
<p>车辆的实现是本游戏的重点。</p>
<p>当然也分OGRE和PhysicsX两部分实现。</p>
<p>OGRE部分还包括视角即（Camera），而其他诸如油量，道具之类的与车辆本身无关的这里不做描述。一辆车的主要结构如下：</p>
<p><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/tonywjd/image002.gif" alt="车辆结构图"></p>
<p>对于一辆车的建模，这里还是比较粗糙，只是分为车轮和车体，把车轮分离出来主要是实现轮子的转向效果。</p>
<p>由于本游戏的初衷是实现多人对战的网络游戏，只是到最后没能实现网络，改为单机。但所以的封装都是为多人网络游戏准备的。</p>
<p>所有车会由一个类进行统一管理，而这个类用了Singleton设计模式。在其上有另一个封装OGRE场景和车辆的总类。</p>
<p>PhysicsX部分，车体由十几简单的面片进行包裹，而车轮是关键。</p>
<p>车辆通过构造轮子的层次结构实现，车由车体和四个车轮组成，实现运动主要由车轮控制。</p>
<p>所有车辆可控的运动（比如碰撞为不可控）都由车轮带动。这也符合实现的物理。</p>
<p>车轮的实现主要是通过NxWheelShape实现。下面是部分对NxWheelShape的分析。</p>
<p>NxWheelShape属性：</p>
<p>radius：Range: (0,inf) 车轮半径</p>
<p>suspensionTravel：Range: [0,inf)，suspension的作用距离</p>
<p>virtual void setLongitudalTireForceFunction (NxTireFunctionDesc tireFunc)=0</p>
<p>设定动力对正向的加速度等的影响</p>
<p>virtual void setLateralTireForceFunction (NxTireFunctionDesc tireFunc)</p>
<p>设定动力对侧向的加速度等的影响，可以实现侧滑之类的</p>
<p>axleSpeed：Range: (-inf,inf)</p>
<p>NOTE: NX_WF_AXLE_SPEED_OVERRIDE flag must be raised for this to have effect</p>
<p>An overridden axle speed of course renders the axle motor and brake torques ineffective</p>
<p>用setAxleSpeed时，直接设定速度，这种模式不再受motorTorque和brakeTorque等影响</p>
<p>brakeTorque：Range: [0,inf)</p>
<p>刹车力矩</p>
<p>inverseWheelMass：设定动力对加速度等的影响，越大作用产生的效果越强</p>
<p>motorTorque：Range: (-inf,inf)</p>
<p>动力矩，使车前进</p>
<p>steerAngle：Range: (-PI,PI) 车轮的偏向角，以弧度表示</p>
<p>virtual void NxWheeleShape::setSuspension(NxSpringDesc spring) [pure virtual]</p>
<p>与其他物体的联接有关</p>
<p>上面这部分是以前写的总结，虽然不完整，现在也不想再细下去了，到此。</p>
<p>不过有一点要提的是，虽然车轮的摩擦力，弹性系数什么的
（restitution，staticFriction，dynamicFriction）可以设置，就像其他基本形状一样，但似乎没什么作用，就跟全
为0一般，我试了很久，都是这样，不知什么原因。这样要使车表现出一定的阻力效果，可以通过把刹车力设为一定值实现。实现上可控地去影响轮子运动速度的只
有动力和刹车力（setMotorTorque，setBrakeTorque），而影响车轮角度的是（setSteerAngle），另外当然也可以直
接设置轮子的前进速度和转动的角速度，NxWheelShape提供了这种接口。不过为了逼真性，最好不要调用这两个接口，因为自己实现物理效果可能有一
堆公式转化，而只有在车辆初始化或使用什么道具的时候调用。</p>
<p>要实现侧滑之类的效果，只要调用setLateralTireForceFunction即可。</p>
<p>另外，用现成的NxWheelShape还是有缺点的，就是很难调手感，可能也较难实现复杂的效果。我调了很久，最后只能将就了。</p>
<p>PhysicsX不需视角处理。</p>
<p>PhysicsX类之间的结构与OGRE部分基本上一模一样。</p>
<p><strong>赛道圈数的判断实现</strong><strong></strong></p>
<p>不知道像极品飞车之类的游戏赛道圈数是怎么实现的，应该与我们的不同，因为它可以每时每刻的判断车辆是不是在往回走。我们想过可能的方法，比如赛道内某一点，判断其到车位置的矢量和速度矢量的夹角。没试过。</p>
<p>我们用的是另一种只能判断当前圈数的办法，对实现这点来说很准确，无论倒开，车体一半穿过起跑线再返回什么的都能准确判断。这利用了PhysicsX的Trigger。</p>
<p>在赛道起跑线位置放置两个相隔很近的很薄但很高且与起跑线等长的长方体NxActor。该NxActor的形状属性为：</p>
<p>BoxDesc.shapeFlags |= NX_TRIGGER_ENABLE;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  // NxBoxShapeDesc BoxDesc;</p>
<p>这样任何NxActor碰到了这个物理都会触发一个onTrigger过程。这里只要定义一个类的对象（如mItemTrigger）为接受触发事件，而这个类继承NxUserTriggerReport，并实现</p>
<p>virtual void onTrigger(NxShape&amp; triggerShape, NxShape&amp; otherShape, NxTriggerFlag status)方法。再</p>
<p>mScene-&gt;setUserTriggerReport(mItemTrigger);  // NxScene* mScene;</p>
<p>就可能实现。</p>
<p>每次触发都会调用一次onTrigger，在onTrigger中可以判断是刚进入该物体还是离开。实际上对于车在两个长方体NxActor中的位
置，总共有七种状态（从哪一头进入到该位置，虽然结果位置一样，但算为不同状态，这样可排除车辆一半进起跑线又返回引起的计数错误）。具体状态如下图：</p>
<p><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/tonywjd/image003.gif"></p>
<p>这样状态间的转换即为：</p>
<p><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/tonywjd/image004.gif" alt="状态转换图"></p>
<p>由于只能检测到是哪个NxActor，而车辆对应的类（这里NxVehicle）是自己封装的，里面包含一个NxActor，所以得到哪个
NxVehicle可以充分利用NxActor中的一个public成员void*
userData的作用，让它指向它所在的NxVehicle对象（this）即可。</p>
<p><strong>CEGUI</strong><strong>的实现</strong><strong></strong></p>
<p>引用Lzx一段：</p>
<p>&#8220;利用OGRE引擎和CEGUI进行了基本的场景和GUI布局进行了编写。</p>
<p>CEGUI读取2DGUI布局的配置文件，这个文件是用xml来编写的。这样可以将程序编写和UI的设计相对分开，使得程序设计和UI美工设计可以更好的分开。读取后在3D场景中进行绘制。&#8221;</p>
<p>这个实际与游戏过程部分是独立的。由于时间紧迫，我们并没进行很好的封装实现，只在一味在写在类（class
CuteCarFrameListener : public ExampleFrameListener, public
MouseMotionListener, public MouseListener）中。</p>
<p>这部分具体不是我做的，也没去细究。而且是在网络加入失败后做的，所以并没考虑网络方面的接口，这里便不详述了。</p>
<p>另外，小地图和车速表的实现也是这部分内容。</p>
<p>小地图实现先贴一张赛道图，在从物理引擎得到车辆的位置，算出在地图上的相当位置（百分比），映射显示到小地图上即可。</p>
<p>车速表则更简单，读出速度，画个图就可。</p>
<p><strong>玩家视角</strong><strong>Camera</strong><strong>的实现</strong><strong></strong></p>
<p>在车辆实现中已有描述，这里只是一种实现方案。</p>
<p>只创建一个Camera对象，注意它不能被多个SceneNode来attach，所以转换视角时，要先detatch。这个当时探索了好些时间，不过都是Ogre基本知识，做起来还是简单的，不说罢。</p>
<p>提一下，在实际车辆行驰中，人的视线跟随通常会比车辆转弯的动作稍晚一点点，这里就加了一个缓冲，也就是每次看到的东西都是30帧之前的场景，以实现更好的效果。这个通过一个链表（数组）就很容易实现。</p>
<p>另外车辆左右摆动时，人的视角是不会跟着左右摆的，虽然现实中可能会一些，但在游戏中会给人过于晃动的感觉，这里就把左右摆动去掉了，也就是Camera向上向量始终与y轴平时，这通过一些数学运算便可，说实话，我是凑出来了，花好长时间。</p>
<p><strong>声音的实现</strong><strong></strong></p>
<p>也不是我做的，同学Lzx做的，引用一段：</p>
<p>&#8220;音频模块支持3D和非3D的播放模式。考虑到播放时多次读音频文件会提高音频模块的CPU占用率而影响游戏进行，所以针对一个音频文件，每次把音频文件全部读取到缓存中而不是多次读取，每次读取一部分。这是个用内存换CPU效率的选择。&#8221;</p>
<p>声音的加入，对原先的程序基本无影响。因为使用的DirectSound和上面这些基本算独立，Lzx封装得也相当不错。声音播放时自动会开线程，对游戏其它模块无任何影响。</p>
<p><strong>有关网络引擎加入失败</strong><strong></strong></p>
<p>原计划网络引擎采用RakNet，也封装了一些东西，也提供了不错的接口。但由于当初游戏的整体设计不充分，游戏框架设计成一个Ogre作为主线
程，而网络部分需要单独开辟一个线程来进行数据传输和处理，如果并在一个线程里面，会使线程阻塞，使数据传送相当缓慢，甚至不成功，导致游戏的无法继续.
由于时间的关系，框架更新时间不足，只好放弃这块，做成单机版。</p>
<p>由于网络引擎需要额外的线程和缓冲，而OGRE并不提供这种功能。最好的办法是创建一个主线程，而把OGRE中循环作为一个子线程来处理。但这样做，原先我们封装的系统是不能够支持，大量改变代码，时间已不够，所以无奈只好放弃。</p>
<p>在网络上花的精力太少，一开始不够重视也是个原因啊。而事实上我们对于网络上的编程毫无经验。</p>
<p><strong>贴些游戏截图，美工还蛮</strong><strong>PP</strong></p>
<p><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/tonywjd/image005.png" alt="登录界面" vspace="3" width="269" height="203" hspace="3"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/tonywjd/image007.png" alt="帮助" vspace="3" width="269" height="203" hspace="3"><br>
<img src="http://p.blog.csdn.net/images/p_blog_csdn_net/tonywjd/image009.png" alt="游戏1" vspace="3" width="269" height="203" hspace="3"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/tonywjd/image011.png" alt="游戏2" vspace="3" width="269" height="203" hspace="3"><br>
<img src="http://p.blog.csdn.net/images/p_blog_csdn_net/tonywjd/image013.png" alt="游戏3" vspace="3" width="269" height="203" hspace="3"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/tonywjd/image015.png" alt="游戏4" vspace="3" width="269" height="203" hspace="3"><br>
<img src="http://p.blog.csdn.net/images/p_blog_csdn_net/tonywjd/image017.png" alt="结束" vspace="3" width="269" height="203" hspace="3"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/tonywjd/image019.png" alt="排行榜" vspace="3" width="269" height="203" hspace="3"></p>
<p><strong>后话</strong><strong></strong></p>
<p>调试就用OGRE提供的Log好了，不能一步步进行调试。还有一个好办法就是生成.map文件，再根据windows中出错提示框中通常提示运行到
哪个虚拟地址出错，在.map文件中找出代码的具体出错行。这实际上对于已经给玩家使用的程序根据玩家获得的出错信息找Bug很有帮助</p><img src ="http://www.cppblog.com/richardhe/aggbug/55720.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/richardhe/" target="_blank">RichardHe</a> 2008-07-09 15:30 <a href="http://www.cppblog.com/richardhe/articles/55720.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NxOgre编译备忘</title><link>http://www.cppblog.com/richardhe/articles/55701.html</link><dc:creator>RichardHe</dc:creator><author>RichardHe</author><pubDate>Wed, 09 Jul 2008 03:51:00 GMT</pubDate><guid>http://www.cppblog.com/richardhe/articles/55701.html</guid><wfw:comment>http://www.cppblog.com/richardhe/comments/55701.html</wfw:comment><comments>http://www.cppblog.com/richardhe/articles/55701.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/richardhe/comments/commentRss/55701.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/richardhe/services/trackbacks/55701.html</trackback:ping><description><![CDATA[<p style="text-align: left;" class="MsoNormal" align="left"><strong><span style="font-size: 18pt; font-family: 宋体;" lang="EN-US">NxOgre编译备忘<o:p></o:p></span></strong></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">windows2000，VS2005编译NxOgre<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;">环境：<span lang="EN-US">windows2000，vs2005（c++，team suite），.net1.0<o:p></o:p></span></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;">主要内容<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">1. vs2005 sp1<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">2. ogre1.40:<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">3 PhsyX2.62<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">4. NxOgre<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">5 编译NxOgre tutorials<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">1. vs2005 sp1<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp; 1.1 查看自己的vs2005是否已经安装了sp1。<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;a) 在IDE里选择&#8220;帮助-&gt;关于Visual Studio 2005&#8221;菜单项，查看一下，确认SP1列为其中一个安装的产品：<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;b) 在IDE里选择&#8220;文件-&gt;新项目&#8221;菜单项，查看一下，确认VS 2005 Web应用项目模型选项(是内置于SP1中的)被安装了，而且是起作用的：<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;（引自<a href="http://www.shengfang.org/blog/index.php?job=art&amp;articleid=a_20070812_152935?==79ad98600eb626adf3642eda2aaf8dc91169701875" target="_blank">http://www.shengfang.org/blog/in ... a2aaf8dc91169701875</a>）<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp; 1.2 sp1的下载<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;（引自<a href="http://hi.baidu.com/yongfa365/blog/item/131ab31112e5b57fcb80c484.html" target="_blank">http://hi.baidu.com/yongfa365/bl ... e5b57fcb80c484.html</a>）<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;VS2005 SP1英文正式版下载地址 431M <a href="http://download.microsoft.com/download/6/3/c/63c69e5d-74c9-48ea-b905-30ac3831f288/VS80sp1-KB926601-X86-ENU.exe" target="_blank">http://download.microsoft.com/do ... B926601-X86-ENU.exe</a><o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;VS2005 SP1中文正式版下载地址 440M<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><a href="http://download.microsoft.com/download/8/0/7/8071514d-9370-45c3-8af1-4ff09a70e59d/VS80sp1-KB926604-X86-CHS.exe" target="_blank">http://download.microsoft.com/do ... B926604-X86-CHS.exe</a><o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp; 1.3 sp1的安装注意事项<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;1.安装时间会非常长，如果机器配置不是很高的话需要2个小时，一般的话也需要1个小时左右所以请耐心等待。<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;2.安装前检查你的c盘是否有大于3G的空余空间，因为安装的时候会释放很多临时文件在c盘，如果不能保证大于3g的话可能会发生异常错误，不过我在安装的时候没有占用3G这么恐怖，不过也起码占用了1G多的空间。<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; （sp1下载到的那个磁盘分区，最好空间也要大一些）<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;3.如果你以前安装过web application project，在安装vs2005 sp1以前请先把他卸载，不然不能成功安装vs2005 sp1<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;4.vs2005sp1的补丁包是把你机器上所有单独装过vs2005的版本的补丁都打上,如果机器上装了Visual Web Developer Express和Visual Studio team sutie,那么他就要运行安装补丁两次.<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp; （引自<a href="http://www.cnblogs.com/ltp/archive/2007/02/25/656562.html" target="_blank">http://www.cnblogs.com/ltp/archive/2007/02/25/656562.html</a>）<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp; 1.4 安装sp1<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;在<a href="http://www.cnblogs.com/ltp/archive/2007/02/25/656562.html" target="_blank">http://www.cnblogs.com/ltp/archive/2007/02/25/656562.html</a>【文1】中有vs2005 sp1安装的一般方法。<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;可是，1.我的机器是windows2000，找不到&#8220;软件限制策略&#8221;。2.执行【文1】中的.bat文件时出错－－无法将相应的键值导入注册表。<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;解决方法是手动导入注册表键值：<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; * "开始"－》&#8220;运行&#8221;－》键入regedit（回车）。<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; * 找到HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\Installer<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; * 在其下面建立一项：名称：MaxPatchCacheSize，类型：REG_DWORD，数据值：0<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp; 现在执行批处理文件来安装<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp; 假设下载的sp1存放在目录dir下，<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;1）.在dir目录下建立a.bat文件。<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;2）.用记事本打开a.bat，把下列的代码复制进去，保存，关闭。<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; regedit export HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\Installer installer.reg<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; regedit add
HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\Installer /v
MaxPatchCacheSize /t REG_DWORD /d 0 /f<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; net stop msiserver<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; start /wait VS80sp1-KB926604-X86-CHS.exe<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; //（本行是注释，不要拷贝）VS80sp1-KB926604-X86-CHS.exe是下载的中文sp1文件的名称。如果下载英文的sp1，需作相应的替换<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; regedit delete HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\Installer /v MaxPatchCacheSize /f<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; regedit import installer.reg<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; net stop msiserver<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; </span><st1:state><st1:place><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">del</span></st1:place></st1:state><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"> /q installer.reg 2&gt;nul<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;3）.双击执行a.bat。虽然在我的window2000上仍旧会有几个错误。但可以无视之。 sp1开始安装了。<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp; cpu1.7G，内存256M。安装时间近3小时，c盘占了1G。<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;">安装<span lang="EN-US">NxOgre基本是按照官方的安装步骤：<a href="http://nxogre.org/Installing" target="_blank">http://nxogre.org/Installing</a><o:p></o:p></span></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">2. ogre1.40:<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp; 在这里下载以下两个包<a href="http://www.ogre3d.org/index.php?option=com_content&amp;task=view&amp;id=412&amp;Itemid=132" target="_blank">http://www.ogre3d.org/index.php? ... =412&amp;Itemid=132</a><o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp; ogre-win32-v1-4-0.zip（解压缩到H:\ProgramFiles\Ogre\ogrenew）<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp; OgreDependencies_VC8SP1_Eihort_20070323.zip（解压缩到H:\ProgramFiles\Ogre\ogrenew下）<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp; 编译ogre.sln顺利通过<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp; 注意，要有足够的硬盘空间来编译ogre的源代码！我选择批编译－》全部。编译完成后，ogrenew目录竟然有4.59G！！！*.obj *.ncb *.sbr *.idb *.pdb *.dep文件占了3.47G！<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">3 PhsyX2.62<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp; 可以参照官方的步骤<a href="http://nxogre.org/Installing" target="_blank">http://nxogre.org/Installing</a><o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">4. NxOgre<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp; 4.1 下载NxOgre<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;NxOgre.0.4.RC3.zip（可以在官方<a href="http://nxogre.org/" target="_blank">http://nxogre.org</a>下载）<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;NxOgre.0.4.RC3.tutorials.zip（可以在官方<a href="http://nxogre.org/" target="_blank">http://nxogre.org</a>下载）<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;NxOgrePatch-ForEihort-VS8SP1.zip（download from <a href="http://www.ogre3d.org/phpBB2addons/viewtopic.php?t=3505" target="_blank">http://www.ogre3d.org/phpBB2addons/viewtopic.php?t=3505</a>）<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp; 4.2 解压缩<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;三个包全部解压缩到H:\ProgramFiles\Ogre\NxOgre<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp; 4.3 设置环境变量<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;NXOGRE_DIR=H:\ProgramFiles\Ogre\NxOgre<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;OGRE_HOME=H:\ProgramFiles\Ogre\ogrenew\OgreMain;H:\ProgramFiles\Ogre\ogrenew<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;(OGRE_HOME的值设置的可能有问题。因为编译NxOgre tutorials时提示找不到ogre.h)<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;PHYSX_DIR=H:\Program Files\AGEIA Technologies\AGEIA PhysX SDK\v2.6.2<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp; 4.4 编译NxOgre<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;打开H:\ProgramFiles\Ogre\NxOgre\NxOgre.VC8.sln<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;可能是前面的OGRE_HOME设置的不对，所以需要加入ogre的目录才能编译通过<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;在属性－&gt;c/c++－&gt;inlude目录里&#8220;最前面&#8221;加入&#8220;H:\ProgramFiles\Ogre\ogrenew\OgreMain\include&#8221;编译ok<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;在属性-&gt;链接－&gt;库目录&#8220;最后&#8221;加入"H:\ProgramFiles\Ogre\ogrenew\lib"<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">5 编译NxOgre tutorials<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp; 5.1 <o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;打开H:\ProgramFiles\Ogre\NxOgre\tutorials\NxOgreTutorials.sln<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;可能是前面的OGRE_HOME设置的不对，所以需要加入ogre的目录才能编译通过<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;在属性－&gt;c/c++－&gt;inlude目录里后面附加<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;H:\ProgramFiles\Ogre\ogrenew\OgreMain\include;<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;H:\ProgramFiles\Ogre\ogrenew\Dependencies\include<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;在属性-&gt;链接－&gt;库目录&#8220;最后&#8221;附加<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;H:\ProgramFiles\Ogre\ogrenew\lib;<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;H:\ProgramFiles\Ogre\ogrenew\Dependencies\lib\Release<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp; 5.2 修改源文件<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;引自<a href="http://www.ogre3d.org/phpBB2addons/viewtopic.php?t=3508" target="_blank">http://www.ogre3d.org/phpBB2addons/viewtopic.php?t=3508</a><o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;以101.cpp文件和其项目为例。其他同理<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;1.如果提示&#8220;error C2039: 'relX' : is not a member of 'OIS::MouseState' &#8221;<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;需要用ms.X.rel替换ms.relX<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;如果提示&#8220;error C2039: 'relY' : is not a member of 'OIS::MouseState' &#8221;<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;需要用ms.X.rel替换ms.relY<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;如果提示&#8220;error C2039: 'relZ' : is not a member of 'OIS::MouseState' &#8221;<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;需要用ms.Z.rel替换ms.relZ<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp;
&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;2.如果提示MSVCRT.lib(crtexe.obj) : error LNK2019: unresolved
external symbol _main referenced in function ___tmainCRTStartup<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Release/nxTutorial101.exe : fatal error LNK1120: 1 unresolved externals<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;一个可行的解决方法：<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; a.先将tutorialApplicationEihort.h中的这段代码注释掉<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;#ifdef _CONSOLE<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; #define TUTORIAL_VOIDMAIN \<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; int main(int argc, char *argv[]) {\<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;...<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; }<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;#else<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; #define TUTORIAL_VOIDMAIN \<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT ) {\<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;...<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; }<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;#endif<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; b.将a中所说的main函数或winmain函数拷贝到101.cpp末尾。<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;3.可能还需要注释掉main或WinMain函数中的SET_TERM_HANDLER;<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;4.注释掉101.cpp末尾的TUTORIAL_VOIDMAIN<o:p></o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p style="text-align: left;" class="MsoNormal" align="left"><span style="font-size: 12pt; font-family: 宋体;">其他问题可以到<span lang="EN-US">NxOgre论坛咨询：<o:p></o:p></span></span></p>
<span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"><a href="http://www.ogre3d.org/phpBB2addons/viewforum.php?f=6&amp;sid=86bebdfe6b0465649a7b87f21b4a057b" target="_blank">http://www.ogre3d.org/phpBB2addo ... 5649a7b87f21b4a057b</a></span><img src ="http://www.cppblog.com/richardhe/aggbug/55701.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/richardhe/" target="_blank">RichardHe</a> 2008-07-09 11:51 <a href="http://www.cppblog.com/richardhe/articles/55701.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>