??xml version="1.0" encoding="utf-8" standalone="yes"?>国产福利电影一区二区三区久久久久成人精品综合 ,天堂久久天堂AV色综合,久久久久亚洲AV无码去区首http://www.shnenglu.com/richardhe/category/7539.html学无止境!永远学下?zh-cnWed, 01 Jul 2009 08:58:41 GMTWed, 01 Jul 2009 08:58:41 GMT60Ogre源码剖析3–可扩展?amp;插g机制http://www.shnenglu.com/richardhe/articles/88911.htmlRichardHeRichardHeWed, 01 Jul 2009 05:54:00 GMThttp://www.shnenglu.com/richardhe/articles/88911.htmlhttp://www.shnenglu.com/richardhe/comments/88911.htmlhttp://www.shnenglu.com/richardhe/articles/88911.html#Feedback0http://www.shnenglu.com/richardhe/comments/commentRss/88911.htmlhttp://www.shnenglu.com/richardhe/services/trackbacks/88911.htmlOgre源码剖析3–可扩展?/span>&插g机制

 

Ogre是一个跨操作pȝq_的开?D引擎Q既支持DirectXQ也支持使用OpenGLQ支持可替换的场景管理算法(BSP, OCTQ。ؓOgre提供q些灉|可扩展性的基础之一是光向插件的设计?br>
 

很多常用的Y件大都提供了插g接口Q用以扩展应用程序设计者最初未惛_的功能,比较常见的譬如PhotoShop的o镜,After Effect中的各种插gQ最有名的比如shineQ,3dMax的插件譬如渲染器Q魔兽世界的辅助插g{等?br>
通常Q插件本w通常也需要实C应用E序所需要的必要接口Q从而得插件可以被应用E序加蝲执行。此外,插g的实C需要由d用程序提供一些接口apiQ通过q些接口Q插件可以对d用程序的功能q行调用?br>
插g可以是动态链接库Qwin32q_上ؓDLL文gQ,也可以是以脚本的形式提供的,比如兽世界中的插g是使用lua~写的,插g也可能是某种应用E序自定义的文gQ只要该应用E序提供了创cL件的Ҏ(gu)q实现解析、执行功能即可。(不同的实现Ş式各有利弊,具体需要参考插件及应用E序所处的q行环境q行取舍Q?br>
采用插g的一个巨大的好处Q以及很多应用程序中使用插g的主要目的就是,我们可以在不需要改动应用程序本w的情况下扩展应用程序的功能?br>
 

在Ogre中,插g被用来提供渲染子pȝQRenderSystemQ,不同cd的图形API被封装在不同的渲染子pȝ的视U当中,Ogre默认提供了DX和OpenGL的实玎ͼ甚至Q如果我们乐意,甚至可以只用l点函数实现一套纯软g的渲染子pȝ提供lOgre使用。以此ؓ例,用简单的形式来展CU实现大概类g下面q样Q?br>
class RenderSystem

{

         
// … operations that a render system need to support

};

// In DX_RenderSystem.dll (in plugin dx rendersystem )

class DX_RenderSystem : public RenderSystem

{

         
// … implementation & override of the operations from RenderSystem using DirectX

};

// In GL_RenderSystem.dll (in plugin openGL rendersystem)

class GL_RenderSystem : public RenderSystem

{

         
// … implementation & override of the operations from RenderSystem using OpenGL

};

// …. We could implement any other rendersystem as we like

 

在引擎的内部QOgreMainQ,插g在初始化的时候,一个渲染子pȝ的实例创建出来(可能是DX_RenderSystemQ也可能?nbsp;GL_RenderSystemQ也可能是其他)Qƈ之挂接到OgreMain的Root对象当中。此后,OgreMain中的Root所有的渲染操作也就可以通过该接口访问插件中创徏的渲染子pȝ了?br>
 

         本文接下来分析Ogre是如何实现插件的Q以及插件是如何与OgreMaind擎进行配合的?br>
         事实上,想编写一个插件是很简单的Q我们只需要约定几个接口,插g这些接口实CQ主应用E序通过某种机制Q配|文?/span>/遍历某个目录Q加载插Ӟq查找接口在插g中是否被实现了,如果实现了,则调用之卛_?br>
 

一个简单的例子如下Q?br>
// in xx.dll

__declspec(dllexport) 
extern “C”    // __declspec(dllexport)告知~译器需要将该函数导?br>
                                                                 
// extern “C” 告知~译器不要对函数做C++名字重整

const char* GetPluginName(void)

{

         
return “Test Plugin”;

}

 

// in application

HMODULE hInst 
= LoadLibrary(”xx.dll”);

if (!hInst) return;

typedef 
const char* (*GetPluginNameFunc)(void);

GetPluginNameFunc pFunc 
= GetProcAddress(hInst, “GetPluginName”);

if (!pFunc) return;

const char* szPluginName = pFunc();

// … do other things

 

事实上,在C语言里,我们可以通过q种方式Q约定一套需要实现的接口Q交l插件实现即可。在q里Q插件的功能都是在dll中实现的Q我们需要加?nbsp;dllQ保存句柄,q在插g卸蝲的时候释攄应的资源。在C
++中,我们昄可以做的更好一点,比如dll模块相关的功能以及资源封装v来:

 

class DynLib

{

public:

         
bool Load(const char* szPluginPath);

         
void* GetProcAddress(const char* szProcName);

private:

         HMODULE m_hInst;

};

 

bool DynLib::Load(const char* szPluginPath)

{

m_hInst 
= LoadLibrary(szPluginPath);

return m_hInst != NULL;

}

 

void* DynLib::GetProcAddress(const char* szProcName)

{

         
return ::GetProcAddress(m_hInst, szProcName);

}

 

q样一来,我们有了一个DLL的简单封装?br>
但是一个dll里未必只能有一个插Ӟ假若我们单的把插件接口设计ؓ一套C导出函数Q我们就不得不面对这U局限。经典的做法依旧是抽象,Ogre中定义了一个插件接口,每一个实C插g接口的实例都代表了一个插Ӟ如下Q?br>
 

class Plugin

{

public:

         
virtual const String& getName() = 0;

         
virtual void install() = 0;

         
virtual void initialize() = 0;

         
virtual void shutdown() = 0;

         
virtual void uninstall() = 0;

};

 

Ogre的每一个插仉需要实C上接口。该接口提供的功能包括:

install 插g被加载时调用?br>
initialize 插g被初始化时调用?br>
shutdown 插g被反初始化时调用?br>
uninstall 插g被卸载时调用?br>
 

不过Q单有这个接口,插gq是无法工作。插件中q需要提供两个约定的C导出函数。这个稍后再说?br>
 

Ogre在Root对象中统一理插gQ因此Root对象提供了以下与插g相关的接口:

class Root

{

         
// …

void loadPlugin(const String& pluginName);

void unloadPlugin(const String& pluginName);

void installPlugin(Plugin* plugin);

void uninstallPlugin(Plugin* plugin);

// 以及对应的处理多个插件的接口

         
// …

};

 

当loadPlugin函数被调用时QOgre加载该插g的dllQ从中查扑ƈ调用名ؓdllStartPlugin的导出函数?br>
对应的,当unloadPlugin函数被调用时QOgre从该dll中调用dllStopPlugin函数。ƈ该dll卸蝲?br>
 

每个插g在实现的时候,都必L供上q的两个C导出函数。其中,dllStartPlugin负责创徏插g实例Qƈ调用 Root::installPluginQ将创徏好的插g指针传递给Root对象。在q里QdllStartPlugin实际可以创徏多个插g实例Qƈ依次调用Root::installPluginQ这h们就可以在一个DLL中包含多个插件了。在dllStopPluginӞ则需要调?nbsp;Root::uninstallPluginQƈ插件DLL中创建的plugin实例释放掉?br>
 

一个典型的dllStartPlugin的实现像q样Q?br>
 

class D3D9Plugin : public Plugin

{

         
//

};

 

D3D9Plugin
* plugin;

__declspec(dllexport) 
extern “C”

void dllStrartPlugin(void)

{

         plugin 
= new D3D9Plugin();

         Root::getSingleton().installPlugin(plugin);

}

 

__declspec(dllexport) 
extern “C”

void dllStopPlugin(void)

{

Root::getSingleton().uninstallPlugin(plugin);

delete plugin;

}

 

Root::getSingleton().installPlugin(plugin)会负责调用插件的install以及initialise操作Qƈ插件的指针存放hQ以备卸载时使用?br>
 

Plugin::install以及Plugin::initialise则分别负责创建OgreMain提供扩展功能接口的实例,以及创建好的对象挂载到应用E序当中?br>
 

一个典型的Plugin的行为像q样Q?br>
 

void BspSceneManagerPlugin::install()

{

         mBspFactory 
= new BspSceneManagerFactory();

}

 

void BspSceneManagerPlugin::initialise()

{

         Root::getSingleton().addSceneManagerFactory(mBspFactory);

}

 

其中QBspSceneManagerFactory是承自OgreMain中的SceneManagerFactory的派生类?br>
class BspSceneManagerFactory : public SceneManagerFactory {…} )

 

通过场景管理器工厂d到Root对象当中Q插件动态的其功能dCOgreMain当中?br>
 

PS: SceneManagerFactory是一个用于创建SceneManager的工厂。SceneManager则是被用于场景管理的理器。具体的 SceneManager也根据算法不同而不同,Ogre自带提供了两U类型的场景理法插gQBsp以及Octree(实现了两个对应的插gQ分别是 Plugin_BSPSceneManager以及Plugin_OctreeSceneManager)?br>
 

通过上述方式QOgreMain核心引擎q不需要关心场景管理算法的具体实现Q不需要关心渲染子pȝ的具体实玎ͼ不需要关心粒子系l的具体实现Q等{。一切这些扩展性的功能都通过插g实现Qƈ在加载时动态挂载到OgreMain当中Q供OgreMain的引擎核心用?br>
 

使用插g时几个需要注意的地方Q?br>
1Q?nbsp; 调用插gDLLҎ(gu)创徏的对象需要交由插件DLL释放。(因ؓ不同的链接单元可能具有不同的内存理上下文环境,此处的new与彼处的new在语义上未必{同Q?br>
2Q?nbsp; 调用插gDLLҎ(gu)获取的插件内对象的引用或指针Q在插gDLL卸蝲之后是无效的,必须保证不再使用。(比较Ҏ(gu)引发问题的一个典型例子是从插件中传递回一个引用计数字W串Q当DLL被卸载后Q字W串内指向实际数据的指针已经无效Q但是在该对象析构时Q仍需要访问该指针Q?/span>


RichardHe 2009-07-01 13:54 发表评论
]]>
OGRE主要渲染程?/title><link>http://www.shnenglu.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.shnenglu.com/richardhe/articles/68841.html</guid><wfw:comment>http://www.shnenglu.com/richardhe/comments/68841.html</wfw:comment><comments>http://www.shnenglu.com/richardhe/articles/68841.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/richardhe/comments/commentRss/68841.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/richardhe/services/trackbacks/68841.html</trackback:ping><description><![CDATA[<font size="5">OGRE主要渲染程?/font> <p>                                    谢伟?nbsp;      feiyurainy@163.com</p> <p>                               转蝲h明出?/p> <p>    很早以前想写一些关?span>OGRE</span><span>的文章了Q一直没Z?/span> </p> <p><span>    理解一个渲染引擎,我觉得最重要的是先抓住了它的L构,它的ȝQ渲染流E,不然的话Q一个引擎几万行Q甚臛_十万行的代码Q光是打开</span><span>solution</span><span>p吓你一跳了Q?/span><span>OGRE</span><span>也有十几万行的代码量Q我一开始看它的时候也是无从下手,感觉代码太多了,不知道从哪开始看好,q个</span><span>class</span><span>看看Q那?/span><span>class</span><span>看看Q由于对整个引擎没有一个清晰的认识Q看q了也印象不深,所以,最后,q是军_先找出它的主U,了解它的渲染程Q这h能有机地把各个部分联pv来?/span></p> <p><span>    q篇短文也是?/span><span>OGRE</span><span>的主要渲染流E的一个介l,可能对一?/span><span>class</span><span>不会太多地去介绍具体的实现细节。我所用的代码都是取自?/span><span>OGRE</span><span>的最新的</span><span>CVS</span><span>版本?/span></p> <p><span>    读者最好对</span><span>OGRE</span><span>有一定的了解Q至得看懂它的</span><span>example</span><span>Q不然可能一些东西理解v来比较困难。对</span><span>D3D</span><span>Q?/span><span>OPENGL</span><span>有一定了解更好?/span></p> <p><span>    如果你看q?/span><span>D3D SDK</span><span>中带的例子,你一定知道一个比较简单的</span><span>3D</span><span>E序要运行v来,臛_都会涉及以下的几部分Q?/span></p> <p><span>    首先是数据的来源Q包括顶Ҏ(gu)据,U理数据{,q些数据可以从文件中dQ也可以在程序运行时生成?/span></p> <p><span>    接下来,我们会徏立顶点缓冲区把顶点保存v来,建立</span><span>texture</span><span>对象来表C?/span><span>texture</span><span>Q对点l成的物体设|它在世界坐标系下的坐标Q设|摄像机的位|,视点Q设|?/span><span>viewport</span><span>的位|和大小Q然后就可以在渲染@环中开始调用渲染操作了Q经q了</span><span>front buffer</span><span>?/span><span>back buffer</span><span>的交换,我们p在屏q上看到</span><span>3D</span><span>囑Ş了,伪代码如下:</span></p> <p><span>      setupVertexBuffer</span></p> <p><span>      setWorldTransform</span></p> <p><span>      setCamera</span></p> <p><span>      setProjectionTransform</span></p> <p><span>      setViewport</span></p> <p>       <span>beginFrame</span></p> <p><span>      setTexture</span></p> <p><span>      drawObject</span></p> <p><span>      endFrame</span> </p> <p><span>     以下是渲染一个物体的主要步骤Q在我看来,q就?/span><span>3D</span><span>E序的主U,同样道理Q无Z多复杂的渲染引擎Q都得实Cq的q些步骤Q其他的一些效果如阴媄Q光照等Q都是附着在这条主U上的,所以,如果你能在你所研究的渲染引擎上也清晰地看到q条ȝQ可能对你深入地研究它会大有帮助Q下面,我们׃h扑ֈ</span><span>OGRE</span><span>中的q条ȝ?/span></p> <p><span>     OGRE</span><span>的渲染@环都是v源于</span><span>Root::renderOneFrame</span><span>Q这个函数在</span><span>OGRE</span><span>自带?/span><span>example</span><span>中是不会昑ּ调用的,因ؓ</span><span>example</span><span>都调用了</span><span>Root::startRendering</span><span>Q由</span><span>startRendering</span><span>来调?/span><span>renderOneFrame</span><span>Q如果你?/span><span>OGRE</span><span>来写真正的游戏,或者编辑器Q你可能需要在的消息主循环中调?/span><span>renderOneFrame</span><span>了,֐思义Q这个函数就是对整个</span><span>OGRE</span><span>q行一帧的更新Q包括动画,渲染状态的改变Q渲?/span><span>api</span><span>的调用等Q在q个函数中,会包括了我们上述伪代码的几乎全部内容Q所以是本文的重Ҏ(gu)在?/span></p> <p><span>     q入</span><span>renderOneFrame</span><span>Q可以看到头两?/span><span>fire</span><span>函数Q这U函数在</span><span>OGRE</span><span>中经常出玎ͼ一般都?/span><span>fire…start</span><span>?/span><span>fire…end</span><span>一起出现的Q在q些函数中,可能会处理一些用戯定义的操作,?/span><span>_fireFrameStarted</span><span>׃Ҏ(gu)以的</span><span>frameListener</span><span>q行处理Q这?/span><span>fire</span><span>函数可以暂时不用理会Ql看</span><span>_updateAllRenderTargets</span><span>Q在q个函数中,会委zֽ前所用的</span><span>renderer</span><span>Ҏ(gu)有创建出来的</span><span>render target</span><span>q行</span><span>update</span><span>Q?/span><span>render target</span><span>也就是渲染的目的圎ͼ一般会有两U,一U是</span><span>render texture</span><span>Q一U是</span><span>render buffer</span><span>Q接着q入</span><span>RenderSystem::_updateAllRenderTargets</span><span>Q可以看到在</span><span>render system</span><span>中,对创建出来的</span><span>render target</span><span>是用</span><span>RenderTargetPriorityMap</span><span>来保存的Q以便按照一定的序来对</span><span>render target</span><span>q行</span><span>update</span><span>Q因为在渲染物体?/span><span>render buffer</span><span>Ӟ一般会用到之前渲染好的</span><span>render texture</span><span>Q所?/span><span>render texture</span><span>形式?/span><span>render target</span><span>需要在</span><span>render buffer</span><span>之前q行更新?/span></p> <p><span>     q入</span><span>render target</span><span>?/span><span>update</span><span>Q可以看刎ͼ它仍然把</span><span>update</span><span>操作l箋传递下去,调用所有挂在这?/span><span>render target</span><span>上的</span><span>viewport</span><span>?/span><span>update</span><span>?/span></p> <p><span>     Viewport</span><span>其实是定义?/span><span>render target</span><span>上的一块要q行更新的区域,所以一?/span><span>render target</span><span>是可以挂多个</span><span>viewport</span><span>的,以实现多人对战时分屏Q或者是Mȝ效果Q可以把</span><span>OGRE</span><span>中的</span><span>viewport</span><span>看成是保?/span><span>camera</span><span>?/span><span>rendertarget</span><span>q两者的l合Q把</span><span>viewport</span><span>中所定义?/span><span>camera</span><span>所看到的场景内Ҏ(gu)染到</span><span>viewport</span><span>所定义?/span><span>render target</span><span>的区域里?/span></p> <p><span>     Viewport</span><span>q有一个重要信息是</span><span>ZOrder</span><span>Q可以看?/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>所定义的区域互盔R叠了Q而且</span><span>ZOrder</span><span>又不一P最l的效果是</span><span>ZOrder</span><span>的</span><span>viewport</span><span>的内容会?/span><span>ZOrder</span><span>大的</span><span>viewport</span><span>的内Ҏ(gu)覆盖?/span></p> <p><span>     l箋q入</span><span>Viewport::update</span><span>Q就像前面所_它调用它所引用?/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>里就是具体的渲染程了。从函数名称q有参数也可以看出来Q这个函数的作用是利用所指定?/span><span>camera</span><span>?/span><span>viewport</span><span>Q来把场景中的内Ҏ(gu)染到</span><span>viewport</span><span>所指定?/span><span>render target</span><span>的某块区域中。根?/span><span>camera</span><span>Q我们可以定?/span><span>view matrix</span><span>Q?/span><span>projection matrix</span><span>Q还可以q行视锥剔除Q只渲染看得见的物体。注意,我们q里只看标准?/span><span>SceneManager</span><span>的方法,不看</span><span>BspSceneManager</span><span>zcȝҎ(gu)Q而且Q我们会抛开跟主U无关的内容Q如?/span><span>shadow</span><span>?/span><span>setup</span><span>Q骨骼动ȝ播放Q?/span><span>shader</span><span>参数的传递等Q因为我们只注重渲染的主程?/span></p> <p><span>     ?/span><span>SceneManager::_renderScene</span><span>中所应看的第一个重要函数是</span><span>_updateSceneGraph</span><span>Q?/span><span>OGRE</span><span>对场景的l织是通过节点?wi)来l织的,一个节点,你可以看成是I间中的某些变换的组合,如位|,~放Q旋转等Q这些变换,会作用到挂接在这些节点上的具体的物体的信息,也就是说Q节点保存了</span><span>world transform</span><span>Q对具体的物体,如一个hQ在I间中的定位Q都是通过操作节点来完成的。同时节点还保存了一个世界坐标的</span><span>AABB</span><span>Q这?/span><span>AABB</span><span>能容Ux有它所挂接的物体的大小Q主要是用于视锥裁减的,如果当前摄像机看不见某个节点?/span><span>AABB</span><span>Q那么说明摄像机看不见节Ҏ(gu)挂接的所有物体,所以在渲染时可以对q个节点视而不见?/span></p> <p><span>     _updateSceneGraph</span><span>的内部处理比较繁琐,我们只需知道Q经q了</span><span>_updateSceneGraph</span><span>Q场景节Ҏ(gu)(wi)中的每个节点都经q了更新Q包括位|,~放Q和方位Q还有节点的包围盒?/span></p> <p><span>     l箋回到</span><span>SceneManager::_renderScene</span><span>Q接下来要看的是</span><span>setViewport</span><span>Q它会调用具体的</span><span>renderer</span><span>?/span><span>setviewport</span><span>的操作,讄</span><span>viewport</span><span>中所挂接?/span><span>render target</span><span>为当前所要渲染的目标Q?/span><span>viewport</span><span>中的区域为当前所要渲染的目标中的区域?/span></p> <p><span>     接下来要到</span><span>OGRE</span><span>渲染程中的一个重要的概念Q?/span><span>Render Queue</span><span>。这个东西实在内Ҏ(gu)较多Q还是以后有Z单独提出来说吧,你可以简单把它想成是一个容器,里面的元素就?/span><span>renderable</span><span>Q每?/span><span>renderable</span><span>可以看成是每ơ调?/span><span>drawprimitive</span><span>函数所渲染的物体,可以是一个模型,也可以是模型的一部分。在</span><span>RenderQueue</span><span>中,它会按材质来分组q些</span><span>renderable</span><span>Q还会对</span><span>renderable</span><span>q行排序?/span></p> <p><span>     在每一ơ调?/span><span>SceneManager::_renderScene</span><span>Ӟ都会调用</span><span>SceneManager::prepareRenderQueue</span><span>来清?/span><span>RenderQueue</span><span>Q然后再调用</span><span>SceneManager::__findVisibleObjects</span><span>来把当前摄像机所能看见的物体都加入到</span><span>RenderQueue</span><span>中?/span></p> <p><span>     SceneManager::__findVisibleObjects</span><span>是一个递归的处理过E,它从场景的根节点开始,先检查摄像机是否能看见这个节点的包围盒(包围盒在</span><span>_updateSceneGraph</span><span>时已l计好了)Q如果看不见Q那么这个节点,q有它的子节炚w不用了。如果能看见Q再挂在这个节点上的所?/span><span>MovableObject</span><span>Q如果当前所的</span><span>MovableObject</span><span>是可见的Q就会调用它?/span><span>_updateRenderQueue</span><span>Ҏ(gu)Q一般在q个Ҏ(gu)里就可以把和q个</span><span>MovableObject</span><span>相关?/span><span>renderable</span><span>送入</span><span>RenderQueue</span><span>了?/span></p> <p><span>     q里要说?/span><span>MovableObject</span><span>Q?/span><span>MovableObject</span><span>主要是用于表C场景中L的物体,?/span><span>Entity</span><span>Q顾名思义Q能Ud的物体,不过它的“能移?#8221;q个能力是要通过</span><span>SceneNode</span><span>来实现的Q所?/span><span>MovableObject</span><span>来能昄出来Q首先得先挂接在某个场景节点上,通过场景节点来定位。你可以控制</span><span>MovableObject</span><span>的一些属性,如某?/span><span>MovableObject</span><span>是否要显C,是否要隐藏,都可以通过</span><span>MovableObject::setVisible</span><span>Ҏ(gu)来实现?/span></p> <p><span>     完该节点上?/span><span>MovableObject</span><span>之后Q就l箋调用所有子节点?/span><span>_findVisibleObjects</span><span>Ҏ(gu)Q一直递归下去。这Pp把场景中所有要渲染?/span><span>renderable</span><span>所加入?/span><span>RenderQueue</span><span>中了?/span></p> <p><span>     xQ我们就拥有了要渲染的物体的信息了,接下来就是对q些物体q行渲染了,你会发现?/span><span>D3D</span><span>?/span><span>OpenGL</span><span>的代码很cM的调用:</span></p> <p><span><span>       </span>mDestRenderSystem->clearFrameBuffer</span></p> <p><span>      mDestRenderSystem->_beginFrame<span>    </span></span></p> <p><span><span>       </span>mDestRenderSystem->_setProjectionMatrix</span></p> <p><span><span>       </span>mDestRenderSystem->_setViewMatrix </span></p> <p><span><span>       </span>_renderVisibleObjects();</span></p> <p><span>      mDestRenderSystem->_endFrame();</span></p> <p><span>     q些</span><span>api</span><span>的作用和</span><span>D3D</span><span>中的cM调用的作用都差不多,q里再说一?/span><span>_renderVisibleObjects()</span><span>Q在q个函数中,会对</span><span>RenderQueue</span><span>中的每个</span><span>renderable</span><span>q行渲染Q用的是</span><span>visitor</span><span>模式来遍历操作每?/span><span>renderable</span><span>Q最l在</span><span>SceneManager::renderSingleObject</span><span>中取出每?/span><span>renderable</span><span>所保存的顶点,索引Q世界矩늭信息Q来q行渲染。这其中q包括了查找该</span><span>renderable</span><span>最q的光源{操作,比较复杂?/span></p> <p><span>     到这里,</span><span>SceneManager::_renderScene</span><span>的流E基本走完了Q也是_</span><span>OGRE</span><span>一帧中的渲染流E差不多也结束了Q你应该也发玎ͼq个程跟你?/span><span>D3D</span><span>写一个简单程序的程基本是一L(fng)Q在q个程的基上,再去看具体的实现Q如怎么栯|纹理,怎么栯用你熟?zhn)?/span><span>D3D</span><span>?/span><span>OpenGL</span><span>?/span><span>API</span><span>来渲染物体,应该会简单得多?/span></p> <p><span>     ?/span><span>OGRE</span><span>的渲染流E的大概介绍到这里也l束了,很多l节都没涉及Q以后有Z再写吧?/span></p><img src ="http://www.shnenglu.com/richardhe/aggbug/68841.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/richardhe/" target="_blank">RichardHe</a> 2008-12-08 14:07 <a href="http://www.shnenglu.com/richardhe/articles/68841.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Ogre实现M?[ 截图 ] http://www.shnenglu.com/richardhe/articles/57983.htmlRichardHeRichardHeMon, 04 Aug 2008 09:22:00 GMThttp://www.shnenglu.com/richardhe/articles/57983.htmlhttp://www.shnenglu.com/richardhe/comments/57983.htmlhttp://www.shnenglu.com/richardhe/articles/57983.html#Feedback2http://www.shnenglu.com/richardhe/comments/commentRss/57983.htmlhttp://www.shnenglu.com/richardhe/services/trackbacks/57983.html
? 通情况下Q我们用单一的摄像机Q实现第一人称或者第三hUͼ有时我们用多个摄像机在单一的窗口中切换视角Q比如从W一人称切换到第三hU视角(游戏中屡 见不鲜)Q而画中画会同时展现W一人称和第三hUͼ或者第三hUCW三人称Q,也就是说同时存在不同的观察点Q这需要多H口多摄像机分别q行渲染?br>
用Ogre实现Md能是件比较容易的事情Q首先,搭徏一个普通的场景Q关于这斚w的工?a >www.ogre3d.org/wiki里有详细的教E,不赘qC?br>
下面q入关键部分?br>
在Ogre里摄像机Camera和视口Viewport是一一对应的关p,普通情况下包含一个摄像机对应一个视口,我们只要d摄像机和与之对应的视口就O(jin)K了!

我的H口c里是这样配|Ogre的,基本和教E示例里的一栗?br>
bool BaseApplication::setup(void)
{
    mRoot 
= new Root();
    
// 讄资源
    setupResources();
    
// 配置渲染H口
    bool carryOn = configure();
    
if (!carryOn) 
        
return false;

    
// 创徏场景理?/span>
    chooseSceneManager();
    
// 创徏摄像?/span>
    createCamera();
    
// 创徏视口
    createViewports();
    
// 讄~省 mipmap {
    TextureManager::getSingleton().setDefaultNumMipmaps(5);
    
// 创徏所有资源监听器Qؓ了加载屏q)
    createResourceListener();
    
// 加蝲资源
    loadResources();
    
// 创徏场景
    createScene();
    
// 创徏帧监听器
    createFrameListener();

    
return true;
}


其中Q?span style="color: #000000;">createCamera(); // 创徏摄像?/span>   ?createViewports(); // 创徏视口 是我们需要关心的?br>
createCamera()Q?/span>

void BaseApplication::createCamera(void)
{
 
// ȝ口摄像机
 mCamera_1 = mSceneMgr->createCamera("Cam_1");
 mCamera_1
->setPosition(Vector3(0,0,300));
 mCamera_1
->lookAt(Vector3(0,0,-300));
 mCamera_1
->setNearClipDistance(5);

 
// ML像机
 mCamera_2 = mSceneMgr->createCamera("Cam_2");
 mCamera_2
->setPosition(Vector3(100,100,300));
 mCamera_2
->lookAt(Vector3(-100,-100,-300));
 mCamera_2
->setNearClipDistance(5);
}


createViewports()Q?br>

void BaseApplication::createViewports(void)
{
    
// ȝ?/span>
    Viewport* vp_1 = mWindow->addViewport( mCamera_1 );
    vp_1
->setBackgroundColour( ColourValue(0,0,0) );
    mCamera_1
->setAspectRatio(
        Real( vp_1
->getActualWidth() ) / Real( vp_1->getActualHeight() ) );
    
// M?/span>
    Viewport* vp_2 = mWindow->addViewport( mCamera_2, 1, 0.7, 0.05, 0.25, 0.25 );
    vp_2
->setBackgroundColour( ColourValue(0,0,0) );
    vp_2
->setOverlaysEnabled(false);
    mCamera_2
->setAspectRatio(
        Real( vp_2
->getActualWidth() ) / Real(vp_2->getActualHeight() ) );
}


?/span>addViewport中我们控制画中画视口在主H口中的位置和大(注意q里??的取D_cM于脓(chung)囑֝标)

q样实C下图所C效果的一半了?br>


是不是很P如果q一步设计成Q当触发某一事g时将Mȝ口动态的弹出Q那更酷了Q有兴趣的可以试一试:P

如图所C,我另外还利用了CEGUIl画中画H口加了个边框,q且带了一个combobox用来控制更多摄像Z间的切换QCEGUI是用脚本来定义界面的Q实C比较单。有关CEGUI部分的介l,在ogre wiki上有更详l的教程?br>
#end
 

posted on 2007-05-22 10:59 hitmaen 阅读(762) 评论(2)  ~辑 收藏 引用 所属分c? Ogre

评论

# re: [ 试验 ] 用Ogre实现M?[ 截图 ] 2007-05-22 16:14 万连?/a>

鹰眼Q小地图Q?  回复  更多评论   

# re: [ 试验 ] 用Ogre实现M?[ 截图 ] 2007-05-22 19:05 hitmaen

@万连?
鹰眼是什么?不是指小地图Q玩一玩跑跑卡丁R明白我说的ML什么了  回复  更多评论  


RichardHe 2008-08-04 17:22 发表评论
]]>
Overlay中文昄http://www.shnenglu.com/richardhe/articles/57981.htmlRichardHeRichardHeMon, 04 Aug 2008 09:02:00 GMThttp://www.shnenglu.com/richardhe/articles/57981.htmlhttp://www.shnenglu.com/richardhe/comments/57981.htmlhttp://www.shnenglu.com/richardhe/articles/57981.html#Feedback0http://www.shnenglu.com/richardhe/comments/commentRss/57981.htmlhttp://www.shnenglu.com/richardhe/services/trackbacks/57981.htmlq日很多朋友咨询Overlay中文昄问题Q回{的多了想烦性再写个文了Q放在网上共享,于是有了本?span lang="EN-US">

       ?span lang="EN-US">Ogre1.2.5版本中,通过?span lang="EN-US">Ogre官方论坛的开发者讨论实COverlay的中文显C,当初的实现非常的怪异Q具体的实现可以参见Ogre官方论坛?span lang="EN-US">

随着Ogre的更斎ͼ现在Ogre已经发布?span lang="EN-US">1.4.7Q?span lang="EN-US">1.4pd版本有一个重要的改进Q就是加入了UTFStringQ这?span lang="EN-US">Ogre中文昄予以很大的帮助。ؓ了便于演C,我直接?span lang="EN-US">Ogre自带?span lang="EN-US">OverlayQ也是大家熟?zhn)?span lang="EN-US">DebugOverlayQ测试工E我选择Demo_ParticleFXQ选择其他的也没有关系。现在编译它Q运行后得到下图Q?span lang="EN-US">


囄最左下角显C的是英文DebugOverlayQ接下来我们的Q务就是把它编E中文的Q?span lang="EN-US">^_^
?span lang="EN-US">

Overlay中文化操作步骤如?span lang="EN-US">

1.      打开OgreSDK\media\packs\ OgreCore.zip?span lang="EN-US">

2.      打开C:\WINDOWS\FontsQ把simhei.ttfd?span lang="EN-US">OgreCore.zipQ(什么,没有simhei.ttfq个文gQ那p其他的中?span lang="EN-US">ttf字体吧)?span lang="EN-US">

3.      打开OgreCore.zip中的Ogre.fontdefQ里面有BlueHighwayq个字体定义块,在他的下面添加我们的SimHeiQ?span lang="EN-US">code_points里面的一大堆数字看不明白没关p,随后文章会解释?span lang="EN-US">

SimHei

{

       type             truetype

       source         simhei.ttf

       size              16

       resolution   96

       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

}

4.      打开OgreCore.zip中的OgreDebugPanel.overlayQ把BlueHighway全部替换?span lang="EN-US">SimHeiQ我们要使用中文字体了,嘿嘿?span lang="EN-US">

5.      修改完成后,保所做的修改已经保存?span lang="EN-US">OgreCore.zip?span lang="EN-US">

6.      q入Ogre解决Ҏ(gu)Q打开文gExampleFrameListener.hQ把54-59行的代码替换如下Q?span lang="EN-US">

              static String currFps = "Current FPS: ";

              static String avgFps = "Average FPS: ";

              static String bestFps = "Best FPS: ";

              static String worstFps = "Worst FPS: ";

              static String tris = "Triangle Count: ";

       static String batches = "Batch Count: ";

 

              static DisplayString currFps = L"当前帧速率: ";

              static DisplayString avgFps = L"q_帧速率: ";

              static DisplayString bestFps = L"最高速率: ";

              static DisplayString worstFps = L"最低速率: ";

              static DisplayString tris = L"三角形数?span lang="EN-US">: ";

              static DisplayString batches = L"Ҏ(gu): ";

7.      最后重新编译工E,下面是我q行的截图,是不是已l显CZ文了Q?span lang="EN-US">^_^?span lang="EN-US">


现在再来看看SimHei中的code_points是如何生成的Q这个可以参考我上次写的q篇文章http://www.cnblogs.com/gogoplayer/archive/2008/05/09/1189795.htmlQ至此,实现Overlay中文昄?/span>

转蝲h明出处:

作者:gogoplayer

E-mail : gogoplayer@163.com

QQ : 78939328

http://www.gogoplayer.com.cn

RichardHe 2008-08-04 17:02 发表评论
]]>
Ogre命o行工具包使用说明http://www.shnenglu.com/richardhe/articles/57669.htmlRichardHeRichardHeThu, 31 Jul 2008 12:12:00 GMThttp://www.shnenglu.com/richardhe/articles/57669.htmlhttp://www.shnenglu.com/richardhe/comments/57669.htmlhttp://www.shnenglu.com/richardhe/articles/57669.html#Feedback0http://www.shnenglu.com/richardhe/comments/commentRss/57669.htmlhttp://www.shnenglu.com/richardhe/services/trackbacks/57669.htmlOgre命o行工具包使用说明

本文由 自由骑士W志 译整理,版权属于OgreTeam。{载请包含本行信息?/span>

 

q个工具包包含了一些对Ogre资源文gq行操作的预处理命o行工兗?/span>

它包?/span>OgreXMLConveter, OgreMeshUpgrade, OgreMaterialUpgrade?/span>MeshMagick?/span>

(zhn)可以在q里获得?/span>WindowsV1.4.7版本的下?/span>,或者在q里获取?/span>MacOSXV1.4.0版本的下载。以上两个版本均?/span>2008q?/span>3?/span>6?/span>的版本,卌者进行翻译的版本Q若需要更多信息和更新的版本,可以讉KOgre官方?/span>

.[OgreXMLConveter]

OgreXML转换器能够将 .mesh 模型|格文g ?/span> .skeleton 骨骼文g ?/span>XML格式转换Zq制格式Q同时可以将其二q制格式转换?/span>XML格式。它同时也允怽在将XML格式转换Zq制格式时设|?/span>LOD层信息?/span>

如果你的Ogre脚本资源中原本用的是XML格式文g的话Q那么本工具则是Ogreq行时必ȝ。所以你能够?/span>OgreSource包的Tools/XMLConverter中找到它?/span>

 

使用Ҏ(gu)Q?/span>

OgreXMLConverter 操作选项 源文件\?/span> 目标文g路径

 

有用的操作选项包括Q?/font>

-i            =  控制与命令行?/span>

-l  nLODNum  = 指定?/span>LOD ( 该项仅在XML格式转换?/span>Mesh格式时有?/span> )

-d  nLODDis  = 指定LOD层间的距离增幅 ( 该项仅在XML格式转换?/span>Mesh格式时有?/span> )

-p  nLODPer  =  指定每两U?/span>LOD层之间三角面减少癑ֈ?/span> ( 该项仅在XML格式转换?/span>Mesh格式时有?/span> )

-f  nLODNum  =  指定两LOD层之间的固定点减少?/span> ( 该项仅在XML格式转换?/span>Mesh格式时有?/span> )

-e            =  关闭模版阴媄?/span>edge?/span> ( 当用模版阴影时该项才有?/span> )

-r            =  关闭Ogre推荐的顶点缓冲区格式?/span>

-t             =  为法U脓(chung)囄成切U信?/span> ( 当用法U脓(chung)图时该项才有?/span> )

-o            =  关闭冗余关键桢和q动轨迹的剔?/span>

-d3d          =  优先使用D3Dq行颜色格式的填?/span> ( ?/span>Windowsq_中默认该开?/span> )

-gl           =  优先使用GLq行颜色格式的填?/span> ( 在非Windowsq_中默认该开?/span> )

-E endian      =  endian模式Q可以选择big, little ?/span> native ( 默认?/span>native )

-q            =  轻量模式Q减输出?/span>

-log filename   =  Log文g名称。(默认?/span>OgreXMLConverter.logQ?/span>

.[OgreMeshUpgrade]

q个工具能够你的Q何老版本的 .mesh 文g更新到当前版本的 .mesh 文g?/span>

你可以在Ogre.log文g中得?/span>.mesh文g的版本信息。一般来_Ogre可以q行老版本的.mesh文gQ但是性能上会有一些差别。如果你更新?/span>Ogre的其他部分,你尽量应当将.mesh文g更新为同L(fng)版本?/span>

 

使用Ҏ(gu)Q?/span>

OgreMeshUpgrate 操作选项 源文件\?/span> 目标文g路径

 

有用的操作选项包括Q?/font>

-i            =  控制与命令行?/span>

-l  nLODNum  = 指定?/span>LOD ( 该项仅在XML格式转换?/span>Mesh格式时有?/span> )

-d  nLODDis  = 指定LOD层间的距离增幅 ( 该项仅在XML格式转换?/span>Mesh格式时有?/span> )

-p  nLODPer  =  指定每两U?/span>LOD层之间三角面减少癑ֈ?/span> ( 该项仅在XML格式转换?/span>Mesh格式时有?/span> )

-f  nLODNum  =  指定两LOD层之间的固定点减少?/span> ( 该项仅在XML格式转换?/span>Mesh格式时有?/span> )

-e            =  关闭模版阴媄?/span>edge?/span>

-r            =  关闭Ogre推荐的顶点缓冲区格式?/span>

-t             =  为法U脓(chung)囄成切U信?/span>

-d3d          =  转换?/span>D3D颜色格式

-gl           =  转换?/span>GL颜色格式

-srcd3d       =  老版本的mesh文g?/span>D3D颜色格式

-srcgl        =  老版本的mesh文g?/span>GL颜色格式

-E endian      =  endian模式Q可以选择big, little ?/span> native ( 默认?/span>native )

 

注意Q?/span>

q个工具现在允许你自定义重组你的mesh|格文g的顶Ҏ(gu)式?/span>

如果你想更新0.15.0之前的Q意一个版本的meshQ那么在该程序运行时会问你是否希望进行顶Ҏ(gu)式的重组Q你输入’y’可以了。在0.15.0版本之后?/span>mesh在更新时会允怽对该mesh做更多的操作Q例如,你可以对每个独立模型节点的顶Ҏ(gu)定不同的点l构Q你既可以自定义点l构Q也可以使用’automatic’自动模式?/span>

.[OgreMaterialUpgrade]

q个工具能够你的Q何老版本的 .material 材质文g更新到当前版本的 .material 材质文g?/span>

值得注意的是q个自动更新是不会加入一些新的脚本语法功能的Q这么说你可能不好理解。(例子Q?/span> “scene_blend add”q句可能会被更新?/span>”scene_blend one one”Q因?/span>”add”的底层实际上是”scene_blend one one”Q自动更C一些高U语法更Cؓ比较直接底层的语法)

另外Q这个工具仅?/span>0.13.0版本以下的材质脚本更新有效,?/span>0.13.0版本以后的材质脚本是没有必要q行更新的?/span>

 

使用Ҏ(gu)Q?/span>

OgreMaterialUpgrade 源文件\?/span> 目标文g路径

 .[MeshMagick]

Copyright 2007 by Daniel Wickert

q个工具是对mesh文g?/span>skeleton文gq行一些处理的工具?/span>

大致包括以下功能Q?/font>

Info         = 输出mesh的信息?/span>

Meshmerge   = 多?/span>mesh合ƈZ?/span>mesh文g

rename       = 重命?/span>mesh?/span>skeleton的不同元?/span>

transform     = 旋{Q羃放一?/span>mesh

 

使用方式Q?/span>

MeshMagick –help=工具?/span> 可以获得更多相关信息?/span>

 

.[译者笃志补充说?/span>]

1Q除MeshMagick该工具外Q其他三U工P使用方式都可以是Q将源资源文件拖拽到工具?/span>exe图标上。因为更新程序会源文g覆盖Q所以推荐做下备份后再更新?/span>

2Q?zhn)可以写批处理文g对其q行使用。格式即Z面的使用方式?/span>

举例Q新Z个文本文?/span>test.txt

~辑内容?/span> OgreMeshUpgrate –d3d –l 4 –d 500 –p 30 E:\Ogre\Media\TestSrc.xml F:\Temp\TestDest.mesh

修改文本后缀名ؓtest.bat

该批处理文件与OgreMeshUpgrate.exe攄同一目录下,q行

则会自动?/span>E:\Ogre\Media\TestSrc.xml文g转换?/span>F:\Temp\TestDest.mesh文gQ同时开启了4?/span>LodQ?/span>Lod间距?/span>500象素Q每一U间面数差距?/span>30%

3Q?/span>OgreMeshUpgrate工具推荐使用automatic自动模式点格式Q效率会比较高,q且省去不少ȝ?/span>

4Q?/span>MeshMagick工具不推荐用。本w功能有限,而且长期无hl护Q对新的mesh支持不好?/span>



RichardHe 2008-07-31 20:12 发表评论
]]>
Ogre中的撞??http://www.shnenglu.com/richardhe/articles/56945.htmlRichardHeRichardHeWed, 23 Jul 2008 07:28:00 GMThttp://www.shnenglu.com/richardhe/articles/56945.htmlhttp://www.shnenglu.com/richardhe/comments/56945.htmlhttp://www.shnenglu.com/richardhe/articles/56945.html#Feedback1http://www.shnenglu.com/richardhe/comments/commentRss/56945.htmlhttp://www.shnenglu.com/richardhe/services/trackbacks/56945.html

原创 韩D
http://www.hjpdiy.com

Ogre采用?wi)桩理场景中的各?元素"(摄像机、灯光、物体等)Q所有的东西都挂??上,不在"?上的东西不会被渲染?br> Ogre::SceneManager是"?的管理者,Ogre::SceneNode是从SceneManager中创建的Q当然BSP?*?wi)的理也和q两个类有关Q这暂时不讨论)?/p>

AABB(轴对齐包围盒)

q个东西是碰撞检的基础Q怎么L起JJYY呢)Q和它类似的q有OBB(有向包围?Q由于OBB创徏复杂Q所以Ogre采用了AABB?/p>

最单的撞:

?br> qOgre::SceneNode::_getWorldAABB()可以取得q个叶子节点的AABB(Ogre::AxisAlignedBox)Q?br> Ogre::AxisAlignedBox装了对AABB的支持,该类的成员函数Ogre::AxisAlignedBox::intersects
()可以判断一个AABB?球体、点、面以及其他?的相交情况(撞情况Q?/p>

    m_SphereNode?wi)的叶子Q挂了一??
    m_CubeNode?wi)的叶子Q挂了一?正方?

    AxisAlignedBox spbox=m_SphereNode->_getWorldAABB();
AxisAlignedBox cbbox=m_CubeNode->_getWorldAABB();
if(spbox.intersects(cbbox))
{
     //怺

}

区域查询Q?/p>

单的讲就是,查询某一区域中有什么东西,分ؓAABB、球体、面查询?/p>

   //创徏一个球体查询,q里?00是m_SphereNode挂着的那个球体的半径
   SphereSceneQuery * pQuery=m_SceneMgr->createSphereQuery(Sphere(m_SphereNode->getPosition(),100));
   //执行q个查询
   SceneQueryResult QResult=pQuery->execute();
   //遍历查询列表扑և范围内的物体
   for (std::list<MovableObject*>::iterator iter = QResult.movables.begin(); iter != QResult.movables.end();++iter)
   {
    MovableObject* pObject=static_cast<MovableObject*>(*iter);
    if(pObject)
    {
     if(pObject->getMovableType()=="Entity")
     {
      Entity* ent = static_cast<Entity*>(pObject);
      //q里化了操作Q由于只有一?球体"和一?正方?Q?br>       //所以只判断了球体和正方体的怺

      if(ent->getName()=="cube")
      {
       //改变位置防止物体重叠
       vtl=-vtl;
       m_SphereNode->translate(vtl);
       break;
      }
     }
    }
   }

怺查询

遍历所有的对象Q找C对一对的怺物体Q废话呀Q相交当然至两个物体)?/p>

    //创徏怺?br>     IntersectionSceneQuery* pISQuery=m_SceneMgr->createIntersectionQuery();
    //执行查询
    IntersectionSceneQueryResult QResult=pISQuery->execute();
    //遍历查询列表扑և两个怺的物?br>     for (SceneQueryMovableIntersectionList::iterator iter = QResult.movables2movables.begin();
     iter != QResult.movables2movables.end();++iter)
    {
    
     SceneQueryMovableObjectPair pObject=static_cast<SceneQueryMovableObjectPair>(*iter);
     //if(pObject)
     {
      String strFirst=pObject.first->getName();
      String strSecond=pObject.second->getName();
      //下面加入你自q两个物体怺判断代码Q或者简单的用AABB的判断方法,
     }
    }



RichardHe 2008-07-23 15:28 发表评论
]]>
Ogre ?四元数quaternionhttp://www.shnenglu.com/richardhe/articles/56944.htmlRichardHeRichardHeWed, 23 Jul 2008 07:26:00 GMThttp://www.shnenglu.com/richardhe/articles/56944.htmlhttp://www.shnenglu.com/richardhe/comments/56944.htmlhttp://www.shnenglu.com/richardhe/articles/56944.html#Feedback0http://www.shnenglu.com/richardhe/comments/commentRss/56944.htmlhttp://www.shnenglu.com/richardhe/services/trackbacks/56944.htmlquaternion?/span>一个标量和一?/span>3D向量的组合。q={ w,x,y,z},Ogre中一个默认的quaternion ={1,0,0,0} ,一般用于空间一点的旋{,假设I间一点叫p,要旋{角度?span>α,旋{轴是(x,y,z),那么:

p={0,x0,y0,z0}

q= {cos(α/ 2) , sina(α/ 2) Nx, sin(α/ 2)Ny, sin(α/ 2)Nz } (N为单位向?

pl果 =q*p*q-1

在数学上Q?span>quaternion表示复数w+xi+yj+zkQ其?/span>i,j,k都是虚数单位,而复C?span>(叉乘)的几何意义实际上是对复数进行旋转。这也是OGREZ么要用quaternion的原?比Matrix更快h节省I间),Ҏ(gu)单的二维复数p= x + yi来说Q和另一?/span>q = ( conαQ?/span>sinα)怹Q则表示?/span>p沉K时针方向旋?#945;Q?/span>p’ = pq ,q是2D旋{.

如果要表C?D旋{,需?D复数?于是有?四元?,q=w+ix+jy+kz (i,j,k都是虚数)

其中j,j,k关系如下:

   i2 = j2 = k2 = -1
   i * j = k = -j * i
   j * k = i = -k * j
   k * i = j = -i * k


四元数加?
q1 + q2 = (w1+w2) + (x1+x2) i + (y1+y2) j + (z1+z2) k
四元C?
q1 * q2 =
(w1*w2 - x1*x2 - y1*y2 - z1*z2) +
(w1*x2 + x1*w2 + y1*z2 - z1*y2) i +
(w1*y2 - x1*z2 + y1*w2 + z1*x1) j +
(w1*z2 + x1*y2 - y1*x2 + z1*w2
)    k

OGRE源代码里q样定义乘法:

Quaternion Quaternion::operator* (const Quaternion& rkQ) const
    {
        // cases p*q != q*p.

        return Quaternion
        (
            w * rkQ.w - x * rkQ.x - y * rkQ.y - z * rkQ.z,
            w * rkQ.x + x * rkQ.w + y * rkQ.z - z * rkQ.y,
            w * rkQ.y + y * rkQ.w + z * rkQ.x - x * rkQ.z,
            w * rkQ.z + z * rkQ.w + x * rkQ.y - y * rkQ.x
        );
    }



RichardHe 2008-07-23 15:26 发表评论
]]>
本地化支?OGRE&CEGUI中文输入 http://www.shnenglu.com/richardhe/articles/56104.htmlRichardHeRichardHeMon, 14 Jul 2008 06:33:00 GMThttp://www.shnenglu.com/richardhe/articles/56104.htmlhttp://www.shnenglu.com/richardhe/comments/56104.htmlhttp://www.shnenglu.com/richardhe/articles/56104.html#Feedback0http://www.shnenglu.com/richardhe/comments/commentRss/56104.htmlhttp://www.shnenglu.com/richardhe/services/trackbacks/56104.html本地化支?OGRE&CEGUI中文输入:源代?/h1>

From OGRE 3D 中文

Jump to: navigation, search

目录

[隐藏]

说明

本代码ؓWin32q_上OGRE 3D囑Ş引擎各版本中文输入所使用。代码中可能存在不完善的地方Q如有问题可以到论坛交流?

[

源代?

下蝲q接Qfor OGRE 3D 1.4.0RC1 Q?

下蝲q接Qfor OGRE 3D 1.2.5Q?

使用Ҏ(gu)

  • 请先下蝲Windows版本OGRE源代码,以及相应的依赖文Ӟ然后把他们接压在同一目录下?
  • 然后把从q个|页下蝲的源代码相应版本的源代码解压到OgreNew目录下覆盖相应文件?
  • 打开工程文gOgre_vc8.slnQ如果之前都q行利的话Q你可以看到一个叫做Demo_ChineseInput的项目。对q个目启动生成Q之后是漫长的等待时间。生成完毕,你会看到一个简单的带有中文输入的界面演C?

目录内容

  • OGRE 3D 1.4.0RC1
OgreMain\ 对引擎的修改Q开出对处理win32消息的接口,以及实现
Samples\
ChineseInput\中文输入demo目
Common\
CEGUIChineseInput\CEGUI输入H口lg
CEGUIChineseInputWR\CEGUI输入H口渲染lg
CEGUIChineseInputDependencies\CEGUI输入依赖目
Media\
gui\中文输入demo依赖资源文g
Ogre_vc8.sln 新的工程文g


  • OGRE 3D 1.2.5
Dependencies\
include\
CEGUI\CEGUI0.5.0包含文g
ois\OIS包含文g
lib\相应库文ӞCEGUI&OISQ?/em>
OgreMain\
include\对引擎的修改Q开出对处理win32消息的接?/em>
RenderSystems\
Direct3D9\对引擎的修改Q开出对处理win32消息的D3D的实?/em>
GL\对引擎的修改Q开出对处理win32消息的OpenGL的实?/em>
Samples\
ChineseInput\中文输入demo目
Common\
bin\q行旉要的支持库以及配制文?/em>
CEGUIChineseInput\CEGUI输入H口lg
CEGUIChineseInputWR\CEGUI输入H口渲染lg
CEGUIChineseInputDependencies\CEGUI输入依赖目
CEGUIRenderer\OGRE对CEGUI0.5版本支持的修?/em>
Media\
datafiles\中文输入demo依赖资源文g
Ogre_vc8.sln 新的工程文g


RichardHe 2008-07-14 14:33 发表评论
]]>OGRE昄中文http://www.shnenglu.com/richardhe/articles/56101.htmlRichardHeRichardHeMon, 14 Jul 2008 06:28:00 GMThttp://www.shnenglu.com/richardhe/articles/56101.htmlhttp://www.shnenglu.com/richardhe/comments/56101.htmlhttp://www.shnenglu.com/richardhe/articles/56101.html#Feedback0http://www.shnenglu.com/richardhe/comments/commentRss/56101.htmlhttp://www.shnenglu.com/richardhe/services/trackbacks/56101.html
    二、有字体以后Q就要徏立一个simfong.font的文Ӟq个文g是字体的xml配置文g。怎么创徏q个文g呢?用记事本建立然后拯如下内容到记事本中:

<?xml version="1.0" ?><Font Name="simfang" Filename="simfang.ttf" Type="FreeType" Size="10" NativeHorzRes="800" NativeVertRes="600" AutoScaled="true" />


然后记事本重命名ؓsimfongQ然后将后缀名改为fontQ最后把他放在Media目录下的gui目录里面QX:\OgreSDK\media\guiQ,你也会发现这里原来就有几个font文g?br>
    三、用C本方式打开OGRE下的TaharezLookSkin.scheme文gQ版本不同,可能命名不同Q但是后~名和里面的内Ҏ(gu)大同异的,它的路径貌似X:\OgreSDK\media\guiQ。然后在内容为:

<Font Name="BlueHighway-8" Filename="bluehighway-8.font" />


的后面,插入如下内容Q?br>
<Font Name="simfang" Filename="simfong.font" />


q样完成了昄中文的必要条件了?br>
然后是修改代码了。我们用OGRE官方|里面的WiKi基础教程的例子七做个l习Q你也可以到中国的OGRE|?我是q样的称呼它Q去看看学习q个l习?br>
这个练习中的代码部分改写如下:
…………
  
//mSystem->setDefaultFont((CEGUI::utf8*)"BlueHighway-12"); 
  mSystem->setDefaultFont((CEGUI::utf8*)"simfang");//SimHei-12
…………
  
//quit->setText((CEGUI::utf8*)"Quit");
  quit->setText((CEGUI::utf8*)Ogre::UTFString(L"中文退?/span>").asUTF8_c_str());
…………



~译q行。就O(jin)K了?/p>


看到教程6, 顺便试了试中文昄, 字体讄我倒是惛_? 只是没想到字W集转换q么恶心:

 

  quit->setText((CEGUI::utf8*)Ogre::UTFString(L"中文退?/span>").asUTF8_c_str());

关于layout文g:

<?xml version="1.0" ?>
<GUILayout>
    
<Window Type="DefaultWindow" Name="Tutorial Gui">
        
<Window Type="TaharezLook/Button" Name="Quit">
            
<Property Name="UnifiedPosition" Value="{{0.35,0},{0.45,0}}" />
            
<Property Name="UnifiedSize" Value="{{0.3,0},{0.1,0}}" />
            
<Property Name="Text" Value="退? />
        
</Window>
    
</Window>
</GUILayout>


一开始我只是单的把配|文件中?Quit"改了"退?,l果q行报错了, LOG文g昄?

Exception: ExpatParser::parseXMLFile - XML Parsing error 'not well-formed (invalid token)' at line 7


查了? 原来文g格式也要Ҏ(gu)UTF-8格式?呵呵



RichardHe 2008-07-14 14:28 发表评论
]]>
让OGRE支持中文http://www.shnenglu.com/richardhe/articles/56100.htmlRichardHeRichardHeMon, 14 Jul 2008 06:27:00 GMThttp://www.shnenglu.com/richardhe/articles/56100.htmlhttp://www.shnenglu.com/richardhe/comments/56100.htmlhttp://www.shnenglu.com/richardhe/articles/56100.html#Feedback0http://www.shnenglu.com/richardhe/comments/commentRss/56100.htmlhttp://www.shnenglu.com/richardhe/services/trackbacks/56100.html0Q前aQ?br> 本h非计机专业Q凭着爱好和一腔热血混入游戏开发大军候补队Q^面尚未钻透。ؓ赶时髦,企图叛变?D阵营Q慌׃中捡?#8220;OGRE”。学到如 今,亦可让正方体飞机{不明物体在三次元空间胡乱打转。但觉得本引擎不支持中文昄而感C爽,便四处寻求高人指教,但大部分高h指点_“自己写引擎算 了?#8221;衡量了一下自׃量,觉得“自己?#8221;qg事十q内恐尚隑ց到。再后来扑ֈ3DCastle论坛Q经q?#8220;bug?#8221;以及“客☆龙?#8221; 两位前辈的指点,也通过高手“renwind”遗留下来的教E,误打误撞竟然自己改出了中文支持,兴奋之余便想写点东西留点U念?br>
1Q准备工?br> “bug?#8221;已经通过WINAPI实现了OGRE在Direct7.0下的中文支持Q也有高手说q样效率不高Q更因ؓ本h基本上是不怎么熟?zhn)? WINAPI的,所以就攑ּ了这U方法。企囄接通过贴图来实C文显C,毕竟OGRE本n文字输出也是用的q种办法Q更好的是OGRE引擎除了普通的 “ttf”字体外还支持位图字体Q其?#8220;ttf”在引擎中也被Ogre::Font::createTextureFromFont()转换成位图了Q, 基本上就是做一个很大很大的囄Q然后上面画满汉字,直接读进d可以了,问题也就变成了——如何找q个大图片?br> q好GBA游戏的开发者们已经扑ֈ了很好的文字来源和取得方法,通过金山?6*16炚w字库得到接近9000个字模,然后通过E序dq写?048*2048的单色位图上Q{换成“png”格式囄?21k?br>
2Q基本知?br> 修改引擎之前Q我们先要知道OGRE是如何显C字体的。OGRE本n面向对象的设计和自带文都做得非常规范漂亮,很容易就能找到关于显C文字的cM及相兛_数。在q里主要看一下关于位囑֭体是如何昄在画面上?br>
(1)字体的读取?br> 和这功能相关的有两个类Q一个是Ogre::FontManagerc,负责分析字体信息Q?.fontdefQ文件。然后用builder模式? Z个Ogre::FontcR在FontcM最重要的数据莫q于mTexCoords_u1、mTexCoords_u2? mTexCoords_v1、mTexCoords_v2q四个数l,他们分别用来储存不同文字对应在图片上的纹理坐标? 不过数组大小明显不够储存9000个汉字的Q一会儿要改的?br>
(2)字体的显C?br> 好像字体昄中用得较多的是Ogre::TextAreaGuiElementc,不过好像q有其他的,我们在这里只看这个吧Q估计其他的也大同小异。看了看好像唯一和显C字体有关的函数是void TextAreaGuiElement::updateGeometry()了,基本上就是根据要写到屏幕上的字串Q在Ogre::FontcM得到相应的脓(chung)囑֝标和贴图Q然后画上去Q道理也不是很难?br>
3Q动手术
目标锁定到Ogre::FontQOgre::FontManagerQOgre::TextAreaGuiElement三个cMQ把所有文件备份一遍手术开始!

(1) Ogre::FontcR?br> 首先是储存文字脓(chung)囑֝标的数组的大不够,原来定义的是——宽字符?(1024 - 32)、ASCII(256 - 32)。这点点大小怎么够我q?000字大军进入,索性都Ҏ(gu)(9030 - 32)。还有就是set和get文字贴图的id都是charcd数据Q?56个id也不够分配给汉字Q看来要都改成unsigned long形(其实大部分机器上int也是32位,不过long是固?2位的cdQ感觉统用点Q?br>
(2) Ogre::FontManagercR?br> 里面从脚本文件中解析贴图坐标的方法是Ҏ(gu)单字W的方式Qؓ支持汉字Q改成同时可以分析int的。一个汉字对应数字是他的Z?161Q前160个留l了半角字)?br>
(3) Ogre::TextAreaGuiElementcR?br> q个是相Ҏ(gu)较麻烦的Q他要从字串中分辨出到半角字和中文。在q里增加一个std::vector<unsigned long> captionQ用来储存分辨的l果。增加以下几行:

   
std::vector<unsigned long> caption;
   
unsigned char nTemp;
   
String::iterator it=mCaption.begin();
   
for(;it!=mCaption.end();++it)
   
{
   
    if(unsigned char(*it)<=160)//如果是半?br>         {
   
        caption.push_back((unsigned char)*it);
   
    }
   
    else//处理全角字符
   
    {
   
        nTemp=(unsigned char)(*it);
   
        ++it;
   
        if(it==mCaption.end())
   
            break;
   
        //下面是得到区位码+161的公式?br>             caption.push_back((94*(nTemp-0xa0-1)+((unsigned char)(*it)-0xa0-1))+161);
   
    }
   
}

然后后面所有关于mCaption的地斚w用caption代替ok了?br>
4Q结果?br> 在OpenGL和DX9.0中成功的支持了中文,但是DX7.0中竟然出Cq行错误Q具体问题还不清楚,q望各位高手指教?br> 因ؓ字体本n原因Q文字很扁^的不好看Q烦性又改了改Ogre::FontQOgre::FontManager两个c,实现脚本中支持修Ҏ(gu)字纵横比例的pL的proportionQ当q个D|ؓ0.8的时候比较好看了?br>

    相关文g
    chinese.fontdef//字体信息文g 攑֜资源文g加中
    font.png//字体囄 攑֜资源文g加中

    OgreFont.cpp
    OgreFont.h
    OgreFontManager.cpp
    OgreTextAreaGuiElement.cpp
    //上面文g覆盖同名文g 可?先备?br>

q个是在ogre-win32-v0-13-1基础上改的,请到ogre-win32-v0-13-1.zip下蝲

中文字体名字叫 Chinese,以后能做中文游戏了!

免费打工仔QQ:1850070


RichardHe 2008-07-14 14:27 发表评论
]]>W三人称摄象机系l例?/title><link>http://www.shnenglu.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.shnenglu.com/richardhe/articles/55723.html</guid><wfw:comment>http://www.shnenglu.com/richardhe/comments/55723.html</wfw:comment><comments>http://www.shnenglu.com/richardhe/articles/55723.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/richardhe/comments/commentRss/55723.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/richardhe/services/trackbacks/55723.html</trackback:ping><description><![CDATA[     摘要: W三人称摄象机系l例?TranslatorQ自由骑士笃志(王宏张) DataQ?008-5-14 l        前言 Ogre是一ƾ优U?D囑Ş渲染引擎Q在国内Q很多前辈从04q甚x早就对它有了深入的了解,q留了许多译文和心得Q极大的便利了我的学习。虽然我h比较晚,但仍希望自己学习间的q些记录和翻译能够帮助到...  <a href='http://www.shnenglu.com/richardhe/articles/55723.html'>阅读全文</a><img src ="http://www.shnenglu.com/richardhe/aggbug/55723.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/richardhe/" target="_blank">RichardHe</a> 2008-07-09 15:42 <a href="http://www.shnenglu.com/richardhe/articles/55723.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ogre命o行工具包使用说明http://www.shnenglu.com/richardhe/articles/55724.htmlRichardHeRichardHeWed, 09 Jul 2008 07:42:00 GMThttp://www.shnenglu.com/richardhe/articles/55724.htmlhttp://www.shnenglu.com/richardhe/comments/55724.htmlhttp://www.shnenglu.com/richardhe/articles/55724.html#Feedback0http://www.shnenglu.com/richardhe/comments/commentRss/55724.htmlhttp://www.shnenglu.com/richardhe/services/trackbacks/55724.htmlOgre命o行工具包使用说明

本文由 自由骑士W志 译整理,版权属于OgreTeam。{载请包含本行信息?/span>

 

q个工具包包含了一些对Ogre资源文gq行操作的预处理命o行工兗?/span>

它包?/span>OgreXMLConveter, OgreMeshUpgrade, OgreMaterialUpgrade?/span>MeshMagick?/span>

(zhn)可以在q里获得?/span>WindowsV1.4.7版本的下?/span>,或者在q里获取?/span>MacOSXV1.4.0版本的下载。以上两个版本均?/span>2008q?/span>3?/span>6?/span>的版本,卌者进行翻译的版本Q若需要更多信息和更新的版本,可以讉KOgre官方?/span>

.[OgreXMLConveter]

OgreXML转换器能够将 .mesh 模型|格文g ?/span> .skeleton 骨骼文g ?/span>XML格式转换Zq制格式Q同时可以将其二q制格式转换?/span>XML格式。它同时也允怽在将XML格式转换Zq制格式时设|?/span>LOD层信息?/span>

如果你的Ogre脚本资源中原本用的是XML格式文g的话Q那么本工具则是Ogreq行时必ȝ。所以你能够?/span>OgreSource包的Tools/XMLConverter中找到它?/span>

 

使用Ҏ(gu)Q?/span>

OgreXMLConverter 操作选项 源文件\?/span> 目标文g路径

 

有用的操作选项包括Q?/font>

-i            =  控制与命令行?/span>

-l  nLODNum  = 指定?/span>LOD ( 该项仅在XML格式转换?/span>Mesh格式时有?/span> )

-d  nLODDis  = 指定LOD层间的距离增幅 ( 该项仅在XML格式转换?/span>Mesh格式时有?/span> )

-p  nLODPer  =  指定每两U?/span>LOD层之间三角面减少癑ֈ?/span> ( 该项仅在XML格式转换?/span>Mesh格式时有?/span> )

-f  nLODNum  =  指定两LOD层之间的固定点减少?/span> ( 该项仅在XML格式转换?/span>Mesh格式时有?/span> )

-e            =  关闭模版阴媄?/span>edge?/span> ( 当用模版阴影时该项才有?/span> )

-r            =  关闭Ogre推荐的顶点缓冲区格式?/span>

-t             =  为法U脓(chung)囄成切U信?/span> ( 当用法U脓(chung)图时该项才有?/span> )

-o            =  关闭冗余关键和q动轨迹的剔?/span>

-d3d          =  优先使用D3Dq行颜色格式的填?/span> ( ?/span>Windowsq_中默认该开?/span> )

-gl           =  优先使用GLq行颜色格式的填?/span> ( 在非Windowsq_中默认该开?/span> )

-E endian      =  endian模式Q可以选择big, little ?/span> native ( 默认?/span>native )

-q            =  轻量模式Q减输出?/span>

-log filename   =  Log文g名称。(默认?/span>OgreXMLConverter.logQ?/span>

.[OgreMeshUpgrade]

q个工具能够你的Q何老版本的 .mesh 文g更新到当前版本的 .mesh 文g?/span>

你可以在Ogre.log文g中得?/span>.mesh文g的版本信息。一般来_Ogre可以q行老版本的.mesh文gQ但是性能上会有一些差别。如果你更新?/span>Ogre的其他部分,你尽量应当将.mesh文g更新为同L(fng)版本?/span>

 

使用Ҏ(gu)Q?/span>

OgreMeshUpgrate 操作选项 源文件\?/span> 目标文g路径

 

有用的操作选项包括Q?/font>

-i            =  控制与命令行?/span>

-l  nLODNum  = 指定?/span>LOD ( 该项仅在XML格式转换?/span>Mesh格式时有?/span> )

-d  nLODDis  = 指定LOD层间的距离增幅 ( 该项仅在XML格式转换?/span>Mesh格式时有?/span> )

-p  nLODPer  =  指定每两U?/span>LOD层之间三角面减少癑ֈ?/span> ( 该项仅在XML格式转换?/span>Mesh格式时有?/span> )

-f  nLODNum  =  指定两LOD层之间的固定点减少?/span> ( 该项仅在XML格式转换?/span>Mesh格式时有?/span> )

-e            =  关闭模版阴媄?/span>edge?/span>

-r            =  关闭Ogre推荐的顶点缓冲区格式?/span>

-t             =  为法U脓(chung)囄成切U信?/span>

-d3d          =  转换?/span>D3D颜色格式

-gl           =  转换?/span>GL颜色格式

-srcd3d       =  老版本的mesh文g?/span>D3D颜色格式

-srcgl        =  老版本的mesh文g?/span>GL颜色格式

-E endian      =  endian模式Q可以选择big, little ?/span> native ( 默认?/span>native )

 

注意Q?/span>

q个工具现在允许你自定义重组你的mesh|格文g的顶Ҏ(gu)式?/span>

如果你想更新0.15.0之前的Q意一个版本的meshQ那么在该程序运行时会问你是否希望进行顶Ҏ(gu)式的重组Q你输入’y’可以了。在0.15.0版本之后?/span>mesh在更新时会允怽对该mesh做更多的操作Q例如,你可以对每个独立模型节点的顶Ҏ(gu)定不同的点l构Q你既可以自定义点l构Q也可以使用’automatic’自动模式?/span>

.[OgreMaterialUpgrade]

q个工具能够你的Q何老版本的 .material 材质文g更新到当前版本的 .material 材质文g?/span>

值得注意的是q个自动更新是不会加入一些新的脚本语法功能的Q这么说你可能不好理解。(例子Q?/span> “scene_blend add”q句可能会被更新?/span>”scene_blend one one”Q因?/span>”add”的底层实际上是”scene_blend one one”Q自动更C一些高U语法更Cؓ比较直接底层的语法)

另外Q这个工具仅?/span>0.13.0版本以下的材质脚本更新有效,?/span>0.13.0版本以后的材质脚本是没有必要q行更新的?/span>

 

使用Ҏ(gu)Q?/span>

OgreMaterialUpgrade 源文件\?/span> 目标文g路径

 .[MeshMagick]

Copyright 2007 by Daniel Wickert

q个工具是对mesh文g?/span>skeleton文gq行一些处理的工具?/span>

大致包括以下功能Q?/font>

Info         = 输出mesh的信息?/span>

Meshmerge   = 多?/span>mesh合ƈZ?/span>mesh文g

rename       = 重命?/span>mesh?/span>skeleton的不同元?/span>

transform     = 旋{Q羃放一?/span>mesh

 

使用方式Q?/span>

MeshMagick –help=工具?/span> 可以获得更多相关信息?/span>

 

.[译者笃志补充说?/span>]

1Q除MeshMagick该工具外Q其他三U工P使用方式都可以是Q将源资源文件拖拽到工具?/span>exe图标上。因为更新程序会源文g覆盖Q所以推荐做下备份后再更新?/span>

2Q?zhn)可以写批处理文g对其q行使用。格式即Z面的使用方式?/span>

举例Q新Z个文本文?/span>test.txt

~辑内容?/span> OgreMeshUpgrate –d3d –l 4 –d 500 –p 30 E:\Ogre\Media\TestSrc.xml F:\Temp\TestDest.mesh

修改文本后缀名ؓtest.bat

该批处理文件与OgreMeshUpgrate.exe攄同一目录下,q行

则会自动?/span>E:\Ogre\Media\TestSrc.xml文g转换?/span>F:\Temp\TestDest.mesh文gQ同时开启了4?/span>LodQ?/span>Lod间距?/span>500象素Q每一U间面数差距?/span>30%

3Q?/span>OgreMeshUpgrate工具推荐使用automatic自动模式点格式Q效率会比较高,q且省去不少ȝ?/span>

4Q?/span>MeshMagick工具不推荐用。本w功能有限,而且长期无hl护Q对新的mesh支持不好?/span>



RichardHe 2008-07-09 15:42 发表评论
]]>
Ogre学习记录http://www.shnenglu.com/richardhe/articles/55722.htmlRichardHeRichardHeWed, 09 Jul 2008 07:36:00 GMThttp://www.shnenglu.com/richardhe/articles/55722.htmlhttp://www.shnenglu.com/richardhe/comments/55722.htmlhttp://www.shnenglu.com/richardhe/articles/55722.html#Feedback2http://www.shnenglu.com/richardhe/comments/commentRss/55722.htmlhttp://www.shnenglu.com/richardhe/services/trackbacks/55722.html阅读全文

RichardHe 2008-07-09 15:36 发表评论
]]>
游戏开发中常用的设计模?/title><link>http://www.shnenglu.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.shnenglu.com/richardhe/articles/55721.html</guid><wfw:comment>http://www.shnenglu.com/richardhe/comments/55721.html</wfw:comment><comments>http://www.shnenglu.com/richardhe/articles/55721.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/richardhe/comments/commentRss/55721.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/richardhe/services/trackbacks/55721.html</trackback:ping><description><![CDATA[     摘要: http://blog.csdn.net/duzhi5368/archive/2008/04/22/2314232.aspx 使用设计模式来提高程序库的重复利用性是大型E序目开发必ȝ。但是在“四h?#8221;的设计模式概qC提到?3U标准设计模式,不但难以CQ而且有些设计模式更多的适用于应用程序开发,Ҏ(gu)戏项目引擎设计ƈ没有很多的利用h(hun)倹{根据经验,_挑l选后Q笃志在...  <a href='http://www.shnenglu.com/richardhe/articles/55721.html'>阅读全文</a><img src ="http://www.shnenglu.com/richardhe/aggbug/55721.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/richardhe/" target="_blank">RichardHe</a> 2008-07-09 15:34 <a href="http://www.shnenglu.com/richardhe/articles/55721.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OGRE+Physx赛R游戏开发心?/title><link>http://www.shnenglu.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.shnenglu.com/richardhe/articles/55720.html</guid><wfw:comment>http://www.shnenglu.com/richardhe/comments/55720.html</wfw:comment><comments>http://www.shnenglu.com/richardhe/articles/55720.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/richardhe/comments/commentRss/55720.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/richardhe/services/trackbacks/55720.html</trackback:ping><description><![CDATA[<p>: <a >http://blog.csdn.net/tonywjd/archive/2006/08/11/1052346.aspx</a></p> <p>游戏主要用到了几个引擎,物理引擎QPhysicsX SDK <st1:chsdate isrocdate="False" islunardate="False" day="30" month="12" year="1899">2.3.2</st1:chsdate>Q即NovedeX的新版本Q,囑Ş渲染引擎QOGRE 1.2.0Q包括h机界面的CEGUI部分Q,声音引擎QDirect SoundQ,|络引擎QRakNetQ可惜由于时间等原因Q加入失败,大大降低游戏可玩性)Q徏模用Maya?dsMax?/p> <p><strong>模型的导?/strong><strong></strong></p> <p>OGRE有自q3D模型格式Q?mesh格式Q。导出可以直接出OGRE官方|站下蝲导出插g。不q导出插件有好些Bug。对于徏模方式的不同导出也不同,Maya的导出插件不能导出非闭的曲面,?dsMax可以Q所以可以通过它导?mesh?/p> <p>另外Q在物理引擎中要表现_的碰撞,最好能得到模型的网格结构,x型的炚w信息Q而不是用单的规则形式来包裏V我们的游戏中地囄的是前者,而R辆道L(fng)用的是后者?/p> <p>但PhysicsXq不支持.mesh。所以我们是通过导出插g导出?mesh.xml格式文g中读取点面信息(仅此Q,再写到自定义的二q制文g格式中,为物理引擎用?/p> <p><strong>OGRE</strong><strong>?/strong><strong>PhysicsX</strong><strong>之间的耦合</strong><strong></strong></p> <p>PhysicsX和OGRE场景理比较cMQ都有对应的cR一个可以移动的物体Q在OGRE中可以用SceneNode实现Qƈ加入到场景管? 中,在PhysicsX中则可以用NxActor对应。NxActor中PhysicsX中的一个物理单位,它可以把一个物体用单的几个规则几何形状? 裹v来,所以的重力、碰撞等物理作用都作用在NxActor中,q生相应的物理反应。得到相应的物理数据之后Q再通过讄SceneNode相应属性, 可以实现逼真的物理效果?/p> <p>事实上,地图场景也是作ؓ普通的3D物体来实现?/p> <p>而OGRE与PhysicsX之间的映ƈ不是对于每一个物体进行映封装实现。而是把这两部分封装成独立的两个模块,但这两部分中所有的物体都是 一一对应的。在ȝ序中Q再把从PhysicsX部分计算出的l果Q传递给OGRE部分Q进行绘制。这样也为网l的加入提供了好的嵌入点。因为只要服务端 q行全部物理q算Q再把运的l果发给客户端OGREq行渲染?/p> <p>OGRE中的frameStated(const FrameEvent &evt)作ؓE序的主U程Q在其中调用</p> <p>m_NxScene->simulate(evt.timeSinceLastFrame); // m_NxScene, instance of (NxScene*)</p> <p>m_NxScene->flushStream();</p> <p>m_NxScene->fetchResults(NX_RIGID_BODY_FINISHED);</p> <p>再把q算的物理结果给OGREl制?/p> <p>q样OGRE与PhysicsXl合在一P而两者的内部实现是互不媄响的Q可以独立编E,只要处理好两者物体的一一对应关系?/p> <p><strong>地图场景的实?/strong></p> <p>对于OGRE来说有专门的室外地图场景理。但是由于其高度囑־隑֯入到PhysicsX中,除非通过建模时得到点面信息,但在具体操作中很隑ց? 高度图与|格炚w信息的一致。我们还试过在程序初始化旉过OGRE的Ray取得地图上M*N个点的坐标,l成2*M*N个三角Ş面片Q用到物理引擎 中,q似的实现物理地图。但q种实现所有的三角形在XZq面上的投媄都是一L(fng)Q面片太可能不_Q太多又会增加不必要的开销Qȝ来说不够理想?/p> <p>PhysicsX中也有专门用于处理地囑֜景的NxActorQ可以在创徏NxActor前通过</p> <p>terrainDesc.heightFieldVerticalAxis = NX_Y;       // terrainDesc is a NxTriangleMeshDes</p> <p>                                                 // Default: NX_NOT_HEIGHTFIELD</p> <p>terrainDesc.heightFieldVerticalExtent    = <st1:chmetcnv tcsc="0" numbertype="1" negative="True" hasspace="False" sourcevalue="1000" unitname="F">-1000.0f</st1:chmetcnv>;</p> <p>q行讄。这样可以大大的提高效率。这本来应该是一个理想的做法。但׃我们建模时模型导出有些误差的原因Q会出现某些面片为垂_物理撞的效? 在这些地方过于激烈,表现在屏q上是车会H然被撞得飞h很高。我们试了很久都没找到合适的模型导出Ҏ(gu)避免q一现象。所以只有所地图场景也作Z个普 通的NxActorq行处理Q这P虽然克服不了建模导出时的q个问题Q但也不易被玩家发觉?/p> <p>q样Q地囑֜景就有了实现的方法了Q在OGRE中作为普通的.mesh对待Q创建SceneNode和EntityQ在PhysicsX中,作ؓ普通的NxActor对待Q只是用NxCookingq行处理Q具体没ȝIӞ可能是ؓ了提高性能?/p> <p><strong>车辆的实?/strong><strong></strong></p> <p>车辆的实现是本游戏的重点?/p> <p>当然也分OGRE和PhysicsX两部分实现?/p> <p>OGRE部分q包括视角即QCameraQ,而其他诸如a量,道具之类的与车辆本n无关的这里不做描q。一辆R的主要结构如下:</p> <p><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/tonywjd/image002.gif" alt="车辆l构?></p> <p>对于一辆R的徏模,q里q是比较_糙Q只是分R轮和车体Q把车轮分离出来主要是实现轮子的转向效果?/p> <p>׃本游戏的初衷是实现多人对战的|络游戏Q只是到最后没能实现网l,改ؓ单机。但所以的装都是为多人网l游戏准备的?/p> <p>所有R会由一个类q行l一理Q而这个类用了Singleton设计模式。在其上有另一个封装OGRE场景和R辆的ȝ?/p> <p>PhysicsX部分QR体由十几单的面片q行包裹Q而R轮是关键?/p> <p>车辆通过构造轮子的层次l构实现QRpR体和四个车轮l成Q实现运动主要由车轮控制?/p> <p>所有R辆可控的q动Q比如碰撞ؓ不可控)都由车轮带动。这也符合实现的物理?/p> <p>车轮的实C要是通过NxWheelShape实现。下面是部分对NxWheelShape的分析?/p> <p>NxWheelShape属性:</p> <p>radiusQRange: (0,inf) 车轮半径</p> <p>suspensionTravelQRange: [0,inf)Qsuspension的作用距?/p> <p>virtual void setLongitudalTireForceFunction (NxTireFunctionDesc tireFunc)=0</p> <p>讑֮动力Ҏ(gu)向的加速度{的影响</p> <p>virtual void setLateralTireForceFunction (NxTireFunctionDesc tireFunc)</p> <p>讑֮动力对侧向的加速度{的影响Q可以实C滑之cȝ</p> <p>axleSpeedQRange: (-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Ӟ直接讑֮速度Q这U模式不再受motorTorque和brakeTorque{媄?/p> <p>brakeTorqueQRange: [0,inf)</p> <p>刹R力矩</p> <p>inverseWheelMassQ设定动力对加速度{的影响Q越大作用生的效果强</p> <p>motorTorqueQRange: (-inf,inf)</p> <p>动力矩,使R前进</p> <p>steerAngleQRange: (-PI,PI) 车轮的偏向角Q以弧度表示</p> <p>virtual void NxWheeleShape::setSuspension(NxSpringDesc spring) [pure virtual]</p> <p>与其他物体的联接有关</p> <p>上面q部分是以前写的ȝQ虽然不完整Q现在也不想再细下去了,到此?/p> <p>不过有一点要提的是,虽然车轮的摩擦力Q弹性系C么的 QrestitutionQstaticFrictionQdynamicFrictionQ可以设|,像其他基本形状一P但似乎没什么作用,p? ?一般,我试了很久,都是q样Q不知什么原因。这栯使R表现Z定的d效果Q可以通过把刹车力设ؓ一定值实现。实C可控地去影响轮子q动速度的只 有动力和刹R力(setMotorTorqueQsetBrakeTorqueQ,而媄响R轮角度的是(setSteerAngleQ,另外当然也可以直 接设|轮子的前进速度和{动的角速度QNxWheelShape提供了这U接口。不qؓ了逼真性,最好不要调用这两个接口Q因己实现物理效果可能有一 堆公式{化,而只有在车辆初始化或使用什么道L(fng)时候调用?/p> <p>要实C滑之cȝ效果Q只要调用setLateralTireForceFunction卛_?/p> <p>另外Q用现成的NxWheelShapeq是有缺点的Q就是很难调手感Q可能也较难实现复杂的效果。我调了很久Q最后只能将׃?/p> <p>PhysicsX不需视角处理?/p> <p>PhysicsXcM间的l构与OGRE部分基本上一模一栗?/p> <p><strong>赛道圈数的判断实?/strong><strong></strong></p> <p>不知道像极品飞R之类的游戏赛道圈数是怎么实现的,应该与我们的不同Q因为它可以每时每刻的判断R辆是不是在往回走。我们想q可能的Ҏ(gu)Q比如赛道内某一点,判断其到车位|的矢量和速度矢量的夹角。没试过?/p> <p>我们用的是另一U只能判断当前圈数的办法Q对实现q点来说很准,无论倒开QR体一半穿qv跑线再返回什么的都能准确判断。这利用了PhysicsX的Trigger?/p> <p>在赛道v跑线位置攄两个盔R很近的很薄但很高且与赯U等长的长方体NxActor。该NxActor的Ş状属性ؓQ?/p> <p>BoxDesc.shapeFlags |= NX_TRIGGER_ENABLE;      // NxBoxShapeDesc BoxDesc;</p> <p>q样MNxActor到了这个物理都会触发一个onTriggerq程。这里只要定义一个类的对象(如mItemTriggerQؓ接受触发事gQ而这个类l承NxUserTriggerReportQƈ实现</p> <p>virtual void onTrigger(NxShape& triggerShape, NxShape& otherShape, NxTriggerFlag status)Ҏ(gu)。再</p> <p>mScene->setUserTriggerReport(mItemTrigger); // NxScene* mScene;</p> <p>可能实现?/p> <p>每次触发都会调用一ơonTriggerQ在onTrigger中可以判断是刚进入该物体q是d。实际上对于车在两个长方体NxActor中的? |,d有七U状态(从哪一头进入到该位|,虽然l果位置一P但算Z同状态,q样可排除R辆一半进赯U又q回引v的计数错误)。具体状态如下图Q?/p> <p><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/tonywjd/image003.gif"></p> <p>q样状态间的{换即为:</p> <p><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/tonywjd/image004.gif" alt="状态{换图"></p> <p>׃只能到是哪个NxActorQ而R辆对应的c(q里NxVehicleQ是自己装的,里面包含一个NxActorQ所以得到哪? NxVehicle可以充分利用NxActor中的一个public成员void* userData的作用,让它指向它所在的NxVehicle对象QthisQ即可?/p> <p><strong>CEGUI</strong><strong>的实?/strong><strong></strong></p> <p>引用Lzx一D:</p> <p>“利用OGRE引擎和CEGUIq行了基本的场景和GUI布局q行了编写?/p> <p>CEGUId2DGUI布局的配|文Ӟq个文g是用xml来编写的。这样可以将E序~写和UI的设计相对分开Q得程序设计和UI工设计可以更好的分开。读取后?D场景中进行绘制?#8221;</p> <p>q个实际与游戏过E部分是独立的。由于时间紧q,我们q没q行很好的封装实玎ͼ只在一呛_写在c(class CuteCarFrameListener : public ExampleFrameListener, public MouseMotionListener, public MouseListenerQ中?/p> <p>q部分具体不是我做的Q也没去l究。而且是在|络加入p|后做的,所以ƈ没考虑|络斚w的接口,q里便不详述了?/p> <p>另外Q小地图和R速表的实C是这部分内容?/p> <p>地囑֮现先贴一张赛道图Q在从物理引擎得到R辆的位置Q算出在地图上的相当位置Q百分比Q,映射昄到小地图上即可?/p> <p>车速表则更单,d速度Q画个图可?/p> <p><strong>玩家视角</strong><strong>Camera</strong><strong>的实?/strong><strong></strong></p> <p>在R辆实C已有描述Q这里只是一U实现方案?/p> <p>只创Z个Camera对象Q注意它不能被多个SceneNode来attachQ所以{换视角时Q要先detatch。这个当时探索了好些旉Q不q都是Ogre基本知识Q做hq是单的Q不说Ş?/p> <p>提一下,在实际R辆行CQh的视U跟随通常会比车辆转弯的动作稍晚一点点Q这里就加了一个缓Ԍ也就是每ơ看到的东西都是30帧之前的场景Q以实现更好的效果。这个通过一个链表(数组Q就很容易实现?/p> <p>另外车辆左右摆动Ӟ人的视角是不会跟着左右摆的Q虽然现实中可能会一些,但在游戏中会lhq于晃动的感觉,q里把左右摆动L了,也就是Camera向上向量始终与y轴^Ӟq通过一些数学运便可,说实话,我是凑出来了Q花好长旉?/p> <p><strong>声音的实?/strong><strong></strong></p> <p>也不是我做的Q同学Lzx做的Q引用一D:</p> <p>“音频模块支持3D和非3D的播放模式。考虑到播放时多次读音频文件会提高音频模块的CPU占用率而媄响游戏进行,所以针对一个音频文Ӟ每次把音频文件全部读取到~存中而不是多ơ读取,每次d一部分。这是个用内存换CPU效率的选择?#8221;</p> <p>声音的加入,对原先的E序基本无媄响。因Z用的DirectSound和上面这些基本算独立QLzx装得也相当不错。声x放时自动会开U程Q对游戏其它模块无Q何媄响?/p> <p><strong>有关|络引擎加入p|</strong><strong></strong></p> <p>原计划网l引擎采用RakNetQ也装了一些东西,也提供了不错的接口。但׃当初游戏的整体设计不充分Q游戏框架设计成一个Ogre作ؓȝ E,而网l部分需要单独开辟一个线E来q行数据传输和处理,如果q在一个线E里面,会ɾU程dQ数据传送相当缓慢,甚至不成功,D游戏的无法l? ׃旉的关p,框架更新旉不Q只好放弃这块,做成单机版?/p> <p>׃|络引擎需要额外的U程和缓Ԍ而OGREq不提供q种功能。最好的办法是创Z个主U程Q而把OGRE中@环作Z个子U程来处理。但q样做,原先我们装的系l是不能够支持,大量改变代码Q时间已不够Q所以无奈只好放弃?/p> <p>在网l上q_֊太少Q一开始不够重视也是个原因啊。而事实上我们对于|络上的~程毫无l验?/p> <p><strong>贴些游戏截图Q美工还?/strong><strong>PP</strong></p> <p><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/tonywjd/image005.png" alt="d界面" 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="l束" 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>调试qOGRE提供的Log好了Q不能一步步q行调试。还有一个好办法是生成.map文gQ再Ҏ(gu)windows中出错提C框中通常提示q行? 哪个虚拟地址出错Q在.map文g中找Z码的具体出错行。这实际上对于已l给玩家使用的程序根据玩家获得的出错信息找Bug很有帮助</p><img src ="http://www.shnenglu.com/richardhe/aggbug/55720.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/richardhe/" target="_blank">RichardHe</a> 2008-07-09 15:30 <a href="http://www.shnenglu.com/richardhe/articles/55720.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NxOgre~译备忘http://www.shnenglu.com/richardhe/articles/55701.htmlRichardHeRichardHeWed, 09 Jul 2008 03:51:00 GMThttp://www.shnenglu.com/richardhe/articles/55701.htmlhttp://www.shnenglu.com/richardhe/comments/55701.htmlhttp://www.shnenglu.com/richardhe/articles/55701.html#Feedback0http://www.shnenglu.com/richardhe/comments/commentRss/55701.htmlhttp://www.shnenglu.com/richardhe/services/trackbacks/55701.htmlNxOgre~译备忘

windows2000QVS2005~译NxOgre

环境Q?span lang="EN-US">windows2000Qvs2005Qc++Qteam suiteQ,.net1.0

 

主要内容

1. vs2005 sp1

2. ogre1.40:

3 PhsyX2.62

4. NxOgre

5 ~译NxOgre tutorials

 

 

1. vs2005 sp1

 

    1.1 查看自己的vs2005是否已经安装了sp1?o:p>

        a) 在IDE里选择“帮助->关于Visual Studio 2005”菜单,查看一下,认SP1列ؓ其中一个安装的产品Q?o:p>

        b) 在IDE里选择“文g->新项?#8221;菜单,查看一下,认VS 2005 Web应用目模型选项(是内|于SP1中的)被安装了Q而且是v作用的:

        Q引?a target="_blank">http://www.shengfang.org/blog/in ... a2aaf8dc91169701875Q?o:p>

 

    1.2 sp1的下?o:p>

        Q引?a target="_blank">http://hi.baidu.com/yongfa365/bl ... e5b57fcb80c484.htmlQ?o:p>

        VS2005 SP1英文正式版下载地址 431M http://download.microsoft.com/do ... B926601-X86-ENU.exe

        VS2005 SP1中文正式版下载地址 440M

http://download.microsoft.com/do ... B926604-X86-CHS.exe

 

    1.3 sp1的安装注意事?o:p>

        1.安装旉会非帔RQ如果机器配|不是很高的话需?个小Ӟ一般的话也需?个小时左x以请耐心{待?o:p>

        2.安装前检查你的c盘是否有大于3G的空余空_因ؓ安装的时候会释放很多临时文g在c盘,如果不能保证大于3g的话可能会发生异帔R误,不过我在安装的时候没有占?Gq么恐怖,不过也v码占用了1G多的I间?o:p>

          Qsp1下蝲到的那个盘分区Q最好空间也要大一些)

        3.如果你以前安装过web application projectQ在安装vs2005 sp1以前请先把他卸蝲Q不然不能成功安装vs2005 sp1

        4.vs2005sp1的补丁包是把你机器上所有单独装qvs2005的版本的补丁都打?如果机器上装了Visual Web Developer Express和Visual Studio team sutie,那么他就要运行安装补丁两?

    Q引?a target="_blank">http://www.cnblogs.com/ltp/archive/2007/02/25/656562.htmlQ?o:p>

 

    1.4 安装sp1

        ?a target="_blank">http://www.cnblogs.com/ltp/archive/2007/02/25/656562.html【文1】中有vs2005 sp1安装的一般方法?o:p>

        可是Q?.我的机器是windows2000Q找不到“软g限制{略”?.执行【文1】中?bat文g时出错-Q无法将相应的键值导入注册表?o:p>

        解决Ҏ(gu)是手动导入注册表键|

             * "开?Q?#8220;q行”Q》键入regeditQ回车)?o:p>

             * 扑ֈHKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\Installer

             * 在其下面建立一:名称QMaxPatchCacheSizeQ类型:REG_DWORDQ数据|0

 

    现在执行批处理文件来安装

    假设下蝲的sp1存放在目录dir下,

        1Q?在dir目录下徏立a.bat文g?o:p>

        2Q?用记事本打开a.batQ把下列的代码复制进去,保存Q关闭?o:p>

                regedit export HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\Installer installer.reg

                regedit add HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\Installer /v MaxPatchCacheSize /t REG_DWORD /d 0 /f

                net stop msiserver

                start /wait VS80sp1-KB926604-X86-CHS.exe

                //Q本行是注释Q不要拷贝)VS80sp1-KB926604-X86-CHS.exe是下载的中文sp1文g的名U。如果下载英文的sp1Q需作相应的替换

                regedit delete HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\Installer /v MaxPatchCacheSize /f

                regedit import installer.reg

                net stop msiserver

                del /q installer.reg 2>nul

        3Q?双击执行a.bat。虽然在我的window2000上仍旧会有几个错误。但可以无视之?sp1开始安装了?o:p>

 

    cpu1.7GQ内?56M。安装时间近3时Qc盘占?G?o:p>

 

 

安装NxOgre基本是按照官方的安装步骤Q?a target="_blank">http://nxogre.org/Installing

 

2. ogre1.40:

    在这里下载以下两个包http://www.ogre3d.org/index.php? ... =412&Itemid=132

    ogre-win32-v1-4-0.zipQ解压羃到H:\ProgramFiles\Ogre\ogrenewQ?o:p>

    OgreDependencies_VC8SP1_Eihort_20070323.zipQ解压羃到H:\ProgramFiles\Ogre\ogrenew下)

    ~译ogre.sln利通过

 

    注意Q要有够的盘I间来编译ogre的源代码Q我选择批编译-》全部。编译完成后Qogrenew目录竟然?.59GQ!Q?.obj *.ncb *.sbr *.idb *.pdb *.dep文g占了3.47GQ?o:p>

 

 

3 PhsyX2.62

    可以参照官方的步?a target="_blank">http://nxogre.org/Installing

 

 

4. NxOgre

    4.1 下蝲NxOgre

        NxOgre.0.4.RC3.zipQ可以在官方http://nxogre.org下蝲Q?o:p>

        NxOgre.0.4.RC3.tutorials.zipQ可以在官方http://nxogre.org下蝲Q?o:p>

        NxOgrePatch-ForEihort-VS8SP1.zipQdownload from http://www.ogre3d.org/phpBB2addons/viewtopic.php?t=3505Q?o:p>

 

    4.2 解压~?o:p>

        三个包全部解压羃到H:\ProgramFiles\Ogre\NxOgre

 

    4.3 讄环境变量

        NXOGRE_DIR=H:\ProgramFiles\Ogre\NxOgre

        OGRE_HOME=H:\ProgramFiles\Ogre\ogrenew\OgreMain;H:\ProgramFiles\Ogre\ogrenew

        (OGRE_HOME的D|的可能有问题。因为编译NxOgre tutorials时提C找不到ogre.h)

        PHYSX_DIR=H:\Program Files\AGEIA Technologies\AGEIA PhysX SDK\v2.6.2

 

    4.4 ~译NxOgre

        打开H:\ProgramFiles\Ogre\NxOgre\NxOgre.VC8.sln

        可能是前面的OGRE_HOME讄的不对,所以需要加入ogre的目录才能编译通过

        在属性->c/c++Q?gt;inlude目录?#8220;最前面”加入“H:\ProgramFiles\Ogre\ogrenew\OgreMain\include”~译ok

        在属?>链接Q?gt;库目?#8220;最?#8221;加入"H:\ProgramFiles\Ogre\ogrenew\lib"

 

5 ~译NxOgre tutorials

    5.1

        打开H:\ProgramFiles\Ogre\NxOgre\tutorials\NxOgreTutorials.sln

        可能是前面的OGRE_HOME讄的不对,所以需要加入ogre的目录才能编译通过

        在属性->c/c++Q?gt;inlude目录里后面附?o:p>

        H:\ProgramFiles\Ogre\ogrenew\OgreMain\include;

        H:\ProgramFiles\Ogre\ogrenew\Dependencies\include

        在属?>链接Q?gt;库目?#8220;最?#8221;附加

        H:\ProgramFiles\Ogre\ogrenew\lib;

        H:\ProgramFiles\Ogre\ogrenew\Dependencies\lib\Release

 

    5.2 修改源文?o:p>

        引自http://www.ogre3d.org/phpBB2addons/viewtopic.php?t=3508

        ?01.cpp文g和其目Z。其他同?o:p>

            1.如果提示“error C2039: 'relX' : is not a member of 'OIS::MouseState' ”

            需要用ms.X.rel替换ms.relX

            

            如果提示“error C2039: 'relY' : is not a member of 'OIS::MouseState' ”

            需要用ms.X.rel替换ms.relY

            

            如果提示“error C2039: 'relZ' : is not a member of 'OIS::MouseState' ”

            需要用ms.Z.rel替换ms.relZ

                        

            2.如果提示MSVCRT.lib(crtexe.obj) : error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup

            Release/nxTutorial101.exe : fatal error LNK1120: 1 unresolved externals

            一个可行的解决Ҏ(gu)Q?o:p>

                a.先将tutorialApplicationEihort.h中的q段代码注释?o:p>

                        #ifdef _CONSOLE

                            #define TUTORIAL_VOIDMAIN \

                            int main(int argc, char *argv[]) {\

                                ...

                            }

                        #else

                            #define TUTORIAL_VOIDMAIN \

                            INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT ) {\

                                 ...

                            }

                        #endif

                b.a中所说的main函数或winmain函数拯?01.cpp末尾?o:p>

 

            3.可能q需要注释掉main或WinMain函数中的SET_TERM_HANDLER;

            4.注释?01.cpp末尾的TUTORIAL_VOIDMAIN

 

其他问题可以?span lang="EN-US">NxOgre论坛咨询Q?o:p>

http://www.ogre3d.org/phpBB2addo ... 5649a7b87f21b4a057b

RichardHe 2008-07-09 11:51 发表评论
]]>
ٸƷþ| þ޹ӰԺվ| ҰAVþһ| þĻƷһ | Ļձ޾þþ| ŷ˾þþƷ| 鶹wwwþùƷ| Ʒ׾þAAAƬ69| þþþùƷ| 91þۺ| þseƷһӰԺ| wwþþþþþþþ| þeֻйľƷ99| ˾þþƷ| ۺϾþۺϼþ| 鶹wwwþ| Ʒþþ99| þۺɫ| 99þ99þþƷƬ | ɫ͵͵͵þ˴ý| ƷŮ߳׾þþ | ݺɫþþۺ| ŷҹAŴƬþ | þþþƵ| þþþþѹۿ| þݺҹҹ2020һ| ĻþþƷ1 | ˾þô߽av| þݺҹҹվ | AVþþþò| þݺҹҹվ| Ʒһþ| þ99Ʒŷ| þۺɫ| þþþavר| ƷëƬþþþþþ | ƷȾþav| ŷɫۺϾþþþþ| ˺ݺۺϾþ88| ޾Ʒ99þ| ŷսþþþþþ|