??xml version="1.0" encoding="utf-8" standalone="yes"?> 转:(x)http://www.shnenglu.com/lovedday/archive/2008/07/01/22890.html 向量的点U:(x) 上面的cosα可简写成Q?nbsp;cosα = u . v / (|u||v|) OGRE源码成功~译?/span>081227 Made by welflau 1 下蝲最新的OGRE源码?/span> 2 直接解压?/span>D盘根目录?br> 3 打开sln 我装是的VS2005 打开?/span> 4 ~译生成OgreMain 5 ?x)出错,q没?/span>Dependencies 因ؓ(f)链接器中昄?jin)?strong>附加?/strong> 6 下蝲ogre-dependencies 注意要下载最新版 下蝲地址Q?/strong> http://sourceforge.net/project/showfiles.php?group_id=2997 下一个页面选择 7 解压?/span>D:\ogre-l.6.0\ogre 解压完后Q再重新~译生成 OgreMain~译得要一D|?/span> 而且~译?/span>Obj文g?/span> 【注意】还有一?/span>Samples文g夹也要覆盖到Ogre目录?/span> 里面是执行时所需?/span>dll文g l于~译完后Q不q还是有错,文?/span> 我去 Dependencies\include\zzip 目录下看的确没这个文?/span> 我又下了(jin)Dependencies其他版本OgreDependencies_VC8SP1_Eihort_20070323 发现有该文g 下蝲U框所C那个包Q?/span>OgreDependencies_VC8SP1_Eihort_20071227.zip 解压?/span>OGRE目录D:\ogre-l.6.0\ogre下到重新覆盖一?/span> 再编译生?/span> l于成功生成 生成?/span>lib?/span>dll如下?/span> 其中OgreMain生成的目标文件有 【游戏开发】【原创教E连载】WelfGame【第7讌Ӏ?08120803按钮颜色可控) 【游戏开发】【原创教E连载】WelfGame【第6讌Ӏ?08120702加入皮肤对话? 【游戏开发】【原创教E连载】WelfGame【第5讌Ӏ?WelfGame(08120302三维操作) 【游戏开发】【原创教E连载】WelfGame【第4讌Ӏ?08120301导入三维数据文g .xQ?/font> 【游戏开发】WelfGame【第3讌Ӏ?08120203囑փ透明?qing)颜?
假设向量u(ux, uy)?strong>v(vx, vy)Q?strong>u?strong>v之间的夹角ؓ(f)αQ从三角形的边角关系{式出发Q可作出如下单推|(x)
|u - v||u - v| = |u||u| + |v||v| - 2|u||v|cosα
===>
Q?strong>ux - vxQ?sup>2 + (uy - vy)2 = ux2 + uy2 +vx2+vy2- 2|u||v|cosα
===>
-2uxvx - 2uyvy = -2|u||v|cosα
===>
cosα = (uxvx + uyvy) / (|u||v|)
q样Q就可以Ҏ(gu)向量u?strong>v的坐标D出它们之间的夹角?br>
定义u?strong>v的点U运:(x) u . v = (uxvx + uyvy)Q?/p>
?strong>u . v = 0Ӟ?strong>uxvx + uyvy = 0Q,向量u?strong>v垂直Q当u . v > 0Ӟu?strong>v之间的夹角ؓ(f)锐角Q当u . v < 0Ӟu?strong>v之间的夹角ؓ(f)钝角?br>
可以运从2l推q到3l?/p>
向量的叉U:(x)
假设存在向量u(ux, uy, uz), v(vx, vy, vz), 求同时垂直于向量u, v的向?strong>w(wx, wy, wz).
因ؓ(f)w?strong>u垂直Q同?strong>w?strong>v垂直Q所?strong>w . u = 0, w . v = 0; ?br>
uxwx + uywy + uzwz = 0;
vxwx + vywy + vzwz = 0;
分别削去方程l的wy?strong>wx变量的系敎ͼ得到如下两个{h(hun)方程式:(x)
(uxvy - uyvx)wx = (uyvz - uzvy)wz
(uxvy - uyvx)wy = (uzvx - uxvz)wz
于是向量w的一般解形式为:(x)
w = (wx, wy, wz) = ((uyvz - uzvy)wz / (uxvy - uyvx), (uzvx - uxvz)wz / (uxvy - uyvx), wz)
= (wz / (uxvy - uyvx) * (uyvz - uzvy, uzvx - uxvz, uxvy - uyvx))
因ؓ(f)Q?br>
ux(uyvz - uzvy) + uy(uzvx - uxvz) + uz(uxvy - uyvx)
= uxuyvz - uxuzvy + uyuzvx - uyuxvz + uzuxvy - uzuyvx
= (uxuyvz - uyuxvz) + (uyuzvx - uzuyvx) + (uzuxvy - uxuzvy)
= 0 + 0 + 0 = 0
vx(uyvz - uzvy) + vy(uzvx - uxvz) + vz(uxvy - uyvx)
= vxuyvz - vxuzvy + vyuzvx - vyuxvz + vzuxvy - vzuyvx
= (vxuyvz - vzuyvx) + (vyuzvx - vxuzvy) + (vzuxvy - vyuxvz)
= 0 + 0 + 0 = 0
由此可知Q向?uyvz - uzvy, uzvx - uxvz, uxvy - uyvx)是同时垂直于向量u?strong>v的?br>
为此Q定义向?strong>u = (ux, uy, uz)和向?v = (vx, vy, vz)的叉U运ؓ(f)Q?strong>u x v = (uyvz - uzvy, uzvx - uxvz, uxvy - uyvx)
上面计算的结果可单概括ؓ(f)Q向?strong>u x v垂直于向?strong>u?strong>v?/p>
Ҏ(gu)叉积的定义,沿x坐标轴的向量i = (1, 0, 0)和沿y坐标轴的向量j = (0, 1, 0)的叉Uؓ(f)Q?br>
i x j = (1, 0, 0) x (0, 1, 0) = (0 * 0 - 0 * 1, 0 * 0 - 1 * 0, 1 * 1 - 0 * 0) = (0, 0, 1) = k
同理可计?strong>j x k:
j x k = (0, 1, 0) x (0, 0, 1) = (1 * 1 - 0 * 0, 0 * 0 - 0 * 1, 0 * 0 - 0 * 0) = (1, 0, 0) = i
以及(qing)k x i:
k x i = (0, 0, 1) x (1, 0, 0) = (0 * 0 - 1 * 0, 1 * 1 - 0 * 0, 0 * 0 - 0 * 0) = (0, 1, 0) = j
由叉U的定义Q可知:(x)
v x u = (vyuz - vzuy, vzux - vxuz, vxuy - vyux) = - (u x v)
]]>【原创】【OGRE人门教程】OGRE源码成功~译?81227
Posted on 2008-12-28 17:54 刘文?/a> 阅读(1814) 评论(7) ~辑 收藏 引用
原帖Q?a href="http://www.shnenglu.com/welflau/archive/2009/02/24/70570.html">http://www.shnenglu.com/welflau/archive/2009/02/24/70570.html
8 可能是版本不对再?/span>OGRE官方|站
http://www.ogre3d.org/index.php?option=com_content&task=view&id=412&Itemid=132
]]>
使用 cegui 来制作界?, 不论在何U^C , 有基本的三大步骤要做 :
1, 创徏一?CEGUI::Render 实例
2, 创徏 CEGUI::System 对象
3, 调用各种Ҏ(gu)来渲染用L(fng)?
W一?, 在我使用?ogre 环境下用以下代码来创徏 CEGUI::Render 实例
Ogre3D
CEGUI::OgreCEGUIRenderer* myRenderer =
new CEGUI::OgreCEGUIRenderer(myRenderWindow);
W二步相当简?, 可?
new CEGUI::System(myRenderer);
W三步,基本上来Ԍ大部分^CQ如 direct3D, OpenGL, 我们在渲染@环的N调用
CEGUI::System::renderGUI 来开始界面的渲染。如果我们?ogre3d 引擎Q这一步不需?
我们昄的执行。因?ogre 引擎已经考虑?jin)?
除了(jin)q三大步之外Q我们还有一些工作要做,首先Q我们需要加载数据文Ӟq且完成初始化工作?
CEGUI 使用?jin)许多类型的文g?CEGUI 使用一个称?ResourceProvider 的帮助对象,用它来做为核?CEGUI 库与外部文g加蝲pȝ的接口。通过实现一个特定的 ResourceProvider 对象Q?cegui 的渲染模块就可以与外部系l的资源理器、文件加载子pȝ无缝地集成?CEGUI 需要的数据文g便可以通过外部pȝ提供的功能来q行加蝲?CEGUI 中的大部分文件是?XML 的文件格式来保存的。缺省情况下Q?CEGUI 在内部?Xerces-C++ 库来分析 XML 文gQ?schema 来对 xml q行校验Q?schema 文g以标准的 .xsd 扩展名来保存 . 许多文g本质上都?XML 格式的文Ӟ但是Ҏ(gu)其意义不同,分别使用?jin)不同的文g扩展名?
.Imageset 文g可将一q图像看做若q小囑փ的集合。换名话_(d)是一q图像的某个区域看做一q独立的囄来用?
.Font 定义?jin)?CEGUI 中所使用的字体类型?
.scheme 可以许多数据组合在一起用,它也是装载与注册 widget 最方便的方法。在一?.scheme 文g中可以包括下列几U数据:(x)
Imagest,font, window Set, window Alias
window set 指定?jin)装载模块?.dll {)(j)的名Uͼ和一l可以注册到pȝ中的 widget.
window alias 提供?jin)别名的功能Q实现已l注册的 window/widget 的Ş式上的隐藏?
.Layout 包含?jin)窗口布局?xml 表示。每个嵌套的 'window' 元素定义?jin)被创徏?window 或是 widget."Property" 元素定义?jin)窗口的讄与属性倹{?
.config 是可供选择的配|文Ӟ他可指定一些缺省的属性?
我们使用 CEGUI 来制作图形界面,臛_要用以下三U文Ӟ(x)
.imageset, .Font . Scheme;
当然Q我们知道在一?Scheme 中是可以包括 imageset ?Font 的?
CEGUI::SchemeManager::getSingleton().loadScheme(“../datafiles/schemes/TaharezLook.scheme”);
// load in a font. The first font loaded automatically becomes the default font.
CEGUI::FontManager::getSingleton().createFont(“../datafiles/fonts/Commonwealth-10.font”);
对于 ogre 的用者来Ԍ应该?resources.cfg 这些资源所在的目录加进厅R?
我们可用下面的语句来指定 cegui 所需要的~省?font ?cursor 资源?
?cegui 的概念里Q每?widget 都是一?window, 从编E的角度来讲Q每?widget c都是从同一个相同的 window 基类l承而来?. 因此Q?widget ?window 有着基本相同的行为?
H体的许多属性与讄在窗口层?wi)上是可以遗传的。高一U窗口的属性与行ؓ(f)?x)?jing)响到下一U窗口的属性与行ؓ(f)。例如附着在某?window 上的 window ?widget ?x)被?window 影响。当父窗口被 destroy Ӟ它所附属的所有的子窗口与 widget 也都被 destroy.
创徏 CEGUI H口Q我们可以用两UŞ式,一?C Q+代码Q二是编?XML layout 文g?
注意Q在 CEGUI 中,所有的 window 都是?WindowManager singleton object 来统一创徏的。我们首先得到这个对象:(x)
using namespace CEGUI;
WindowManager& wmgr = WindowManager::getSingleton();
一般来Ԍ我们L创徏一?DefaultWindow 来做为我们将使用的窗口的 Root, 在这U方式下Q我们会(x)有比较好的灵zL?
Window* myRoot = wmgr.createWindow(“DefaultWindow”, “root”);
System::getSingleton().setGUISheet(myRoot);
createwindows() 函数所使用的第一个参敎ͼ指明?jin)将要创建的H口cdQ它一般是在我们用的 .scheme 文g中所注册q的Q当然还有一些系l定义的QL有效的窗口类型如上面所提到?DefaultWindow.DefualtWindow 是不可见的,它只是做为所有窗口的 root 来用?
一般我们L要创Z?Framewindow, 它可以包括其他窗口与 widget Q本w也是可视的?
FrameWindow* fWnd = (FrameWindow*)wmgr.createWindow(“TaharezLook/FrameWindow”, “testWindow”);
之后Q我们将创徏的窗口挂?root 上,形成一个层ơ关pR?
myRoot->addChildWindow(fWnd);
~辑 xml layout 文gQ可使用专门提供的制作工兗具体的使用Ҏ(gu)可以参阅相关文档Q这里说一下如何用制作好?xml layout 文g?
using namespace CEGUI;
Window* myRoot = WindowManager::getSingleton().loadWindowLayout(“test.layout”);
System::getSingleton().setGUISheet(myRoot);
首先Q将 layout 文g装蝲q来Q再指定根结炏V?
CEGUI 本n侦测用户输入Q这些不?CEGUI 的责任,而是E序的员的责仅R当有用户外部输入时Q我
们可以选择这些消息告?CEGUI Q这?CEGUI 才会(x)响应?
?ceguir::System cM定义?jin)一l函敎ͼ它作为我们进行消息传递的接口?
bool injectMouseMove(float delta_x, float delta_y);
bool injectMousePosition(float x_pos, float y_pos);
bool injectMouseLeaves(void);
bool injectMouseButtonDown(MouseButton button);
bool injectMouseButtonUp(MouseButton button);
bool injectKeyDown(uint key_code);
bool injectKeyUp(uint key_code);
bool injectChar(utf32 code_point);
bool injectMouseWheelChange(float delta);
bool injectTimePulse(float timeElapsed);
q些函数的返回D明了(jin) CEGUI 是否已经传入的消息 consume 掉了(jin)?
CEGUI 使用回调机制来进行消息处理。可以ؓ(f)某个H体的特定事件注册一个函敎ͼ当窗体事件发生时Q?CEGUI ?x)自动调用所注册的函数?
bool TutorialApplication::handlePopMenu(constCEGUI::EventArgs& e)
?
// 。。。。。进行事件响?
?
void setupEventHandlers(void)
{
CEGUI::WindowManager& wmgr = CEGUI::WindowManager::getSingleton();
wmgr .getWindow((CEGUI::utf8*)"MyButton")->subscribeEvent(
CEGUI ::PushButton::EventClicked, CEGUI::Event::Subscriber(&TutorialApplication::handlePopMenu, this));
}
EventClicked :: pȝ预定义的事g . subscribeEvent:: 注册函数Q它事g与响应函数联接在一赗?
?ogre E序中,当侦听器收到键盘Q鼠标消息时Q首先经q适当的{换( CEGUI 可以识别Q再传递给 CEGUI 。下面这个函数执行鼠标键标识转换?
CEGUI::MouseButton convertOgreButtonToCegui(int buttonID)
{
switch (buttonID)
{
case MouseEvent::BUTTON0_MASK:
return CEGUI::LeftButton;
case MouseEvent::BUTTON1_MASK:
return CEGUI::RightButton;
case MouseEvent::BUTTON2_MASK:
return CEGUI::MiddleButton;
case MouseEvent::BUTTON3_MASK:
return CEGUI::X1Button;
default:
return CEGUI::LeftButton;
}
}
?CEGUI 需要知道的键盘Q鼠标消息告知它。即?OGRE 处理q些消息旉知 CEGUI 。以下这函数说明?jin)用法?
void mouseMoved (MouseEvent *e)// 鼠标Ud
{
CEGUI::System::getSingleton().injectMouseMove(
e->getRelX() * mGUIRenderer->getWidth(),
e->getRelY() * mGUIRenderer->getHeight());
e->consume();
}
void mousePressed (MouseEvent *e)// 鼠标按下
{
CEGUI::System::getSingleton().injectMouseButtonDown(
convertOgreButtonToCegui(e->getButtonID()));
e->consume();
}
void mouseReleased (MouseEvent *e)// 鼠标弹v
{
CEGUI::System::getSingleton().injectMouseButtonUp(
convertOgreButtonToCegui(e->getButtonID()));
e->consume();
}
void keyPressed(KeyEvent* e)// 键按?
{
CEGUI::System::getSingleton().injectKeyDown(e->getKey());
CEGUI::System::getSingleton().injectChar(e->getKeyChar());
e->consume();
}
void keyReleased(KeyEvent* e)// 键弹?
{
CEGUI::System::getSingleton().injectKeyUp(e->getKey());
e->consume();
}
?CEGUI 中用中文的问题Q?nbsp; 现在ȝ?jin)一下在 CEGUI 中显CZ文需要注意的事项 :
1 、将 simhei.ttf copy to \ogrenew\Samples\Media\gui
2 、将 simhei-12.font 拷到上目录内容ؓ(f)
<?xml version="1.0" ?>
<Font Name="SimHei-12" Filename="simhei.ttf" Type="Dynamic" Size="12" NativeHorzRes="800" NativeVertRes="600"
AutoScaled="true">
<GlyphSet Glyphs=" 你好世界退出演C渲染到新材质徏~辑H口 " /> Q?<---- 自己要用到的汉字Q?
</Font>
注意大小写!Q?GlyphSet Glyphs 是在E序中要用到的汉字,它是?cegui 预生成一个字W图像集用的Q想当然?:-P Q如果修改了(jin)q个文gQ注意要?Unicode Q?UTF-8 Q的~码来保存,?vc7.1 中:(x)文g -> 高保存选项 ?nbsp; ~码 栏中选择?
3 、在 TaharezLook.scheme ?
<Font Name="Tahoma-12" Filename="tahoma-12.font" /> 后加?
<Font Name="SimHei-12" Filename="simhei-12.font" /> 注意大小?
以上是一些准备工?
4 、在自己的应用中讄默认字体
mGUISystem->setDefaultFont((CEGUI::utf8*)"Tahoma-12"); 改ؓ(f)
mGUISystem->setDefaultFont((CEGUI::utf8*)"SimHei-12");
5 、在自己的应用程序中可以把相关?Text 属性该Z文了(jin)Q如Q?
item = new CEGUI::ListboxTextItem((CEGUI::utf8*)" 退?", 6);
同样要注意的是要保存?Unicode Q?UTF-8 Q的~码。同时这些字要是?simhei-12.font 中定义过的字Q当然也可以象那?CEGUIChieseDemo
那样用动态生成如Q?
gfont->defineFontGlyphs(gfont->getAvailableGlyphs() + (utf8*)" 当前最?jng)_q_的框架率三角 ");
~译自己的程序,应该可以看C文了(jin)Q罗嗦一下,C只要有汉字出现的文g׃存ؓ(f) Unicode Q?UTF-8 Q编码的Q!Q?
原文http://www.game798.com/html/2007-12/5156.htm
W一?span> by SuperMegaMau
q个教程包括的代码和法是作者自ql验,也许不正或不怎么准确,如果发现问题L(fng)正?/span>
内容
|
介绍
我相信我不是W一问如何用OgreOde创徏一个运动角艌Ӏ搜索论坛和wiki后,我意识到q是一个很有用的信息。这个教E解释了(jin)如何创徏一个可以在地Ş上行走的q动角色Q包括其?span>meshesQ如?wi)和房屋Q?/span>
创徏物理模型
我按照在Monster的方法用下图代表一个角Ԍ(x)
下面,我假设你?span>Ogre?span>SceneNodes, meshes ?span>AlignedBoxes都有所?jin)解Qƈ且会(x)?span>SceneManager创徏地Ş?/span>
创徏角色
首先创徏一?span>SceneNode来放角色?span>meshQ在q个例子中我用了(jin)Ogre例子中的忍者模型。创Z?span>SceneNodeq把它们q在一赗后面我?x)解释?f)什么是两个Node?/span>
Entity* ninja = mSceneMgr->createEntity("ninja","ninja.mesh");
SceneNode* ninjaNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("ninja");
SceneNode* modelNode = ninjaNode->createChildSceneNode("ninja_model");
modelNode->attachObject(ninja);
ninjaNode->setScale(0.05,0.05,0.05);
RootSceneNode ninjaNode modelNode
也许你已l注意到Q?span>ninjaNode被羃攑־很小Q这是因为如?span>mesh很大的话渲染的速度变很慢Q不知道Z么)(j)?/span>
获取 AABB(AxisAlignedBox, 轴对齐包围盒)
现在?span>AxisAlignedBox获取mesh的大?/span>
AxisAlignedBox aab = modelNode->getAttachedObject("ninja")->getBoundingBox();
Ogre::Vector3 min = aab.getMinimum()*ninjaNode->getScale();
Ogre::Vector3 max = aab.getMaximum()*ninjaNode->getScale();
Ogre::Vector3 center = aab.getCenter()*ninjaNode->getScale();
Ogre::Vector3 size(fabs(max.x-min.x),fabs(max.y-min.y),fabs(max.z-min.z));
float radius = (size.x>size.z)?size.z/2.0f:size.x/2.0f;
创徏一个新I间
我们需要创Z个新I间把角色放在其中,q且取消内部撞(g)?/span>
OgreOde::SimpleSpace* dollSpace = new OgreOde::SimpleSpace(_world->getDefaultSpace());
dollSpace->setInternalCollisions(false);
创徏球体(腉K)
现在有了(jin)两个SceneNodesQ?span> "ninjaNode" ?span> "modelNode"?span>ninjaNode是代表你角色的节点,modelNode是你真正?span>mesh的地斏V这么做是因?span>mesh的中?j)L?span>OgreOde::Body的中?j),所以我们用ninjaNode来创建碰撞体的位|,然后Ҏ(gu)ninjaNode?span>OgreOde::Body来获?span>mesh的正位|?/span>
左边图是用一?span>SceneNode所得到的效果,双是用两个SceneNode。你可以注意刎ͼ左边的角色?zhn)在半空中。下面代码创Z(jin)一个球体代表角色的脚部。我们需要一?span>SphereGeometry和一?span>TransformGeometry 球体放到正位|?/span>
译注Q注释ؓ(f)我的猜想Q具体不知道步骤q么复杂Q欢q纠正?span>
Q?Q?span> 创徏一个碰撞体Q命名ؓ(f)feet
Q?Q?span> 讄撞体ؓ(f)球Ş物体Q半径ؓ(f)AABB获得的半?/span>
Q?Q?span> SphereGeometryQ半径ؓ(f)AABB获得的半?/span>
Q?Q?span> TransformGeometryQ空间ؓ(f)刚才创徏的空?span>, TransformGeometryg是ؓ(f)?jin)包含某特定形状的几何?/span>
Q?Q?span> 改变modelNode相对?span>ninjiaNode的位|,以便让脚占到C
Q?Q?span> ?span>TransformGeometry包含一?span>OgreOde::Body和一个几何体
Q?Q?span> ?span>Ogre::Body_到ninjaNode?/span>
怀疑创?span>SphereGeometry是否只是?span>Ogre::Body兯?/span>
OgreOde::Body* dollFeetBody = new OgreOde::Body("feet");
dollFeetBody->setMass(OgreOde::SphereMass(70*2.5,radius));
OgreOde::SphereGeometry* feetGeom = new OgreOde::SphereGeometry(radius);
OgreOde::TransformGeometry* feetTrans = new OgreOde::TransformGeometry(dollSpace);
modelNode->translate(Vector3(0,-radius/ninjaNode->getScale().y,0));
feetTrans->setBody(dollFeetBody);
feetTrans->setEncapsulatedGeometry(feetGeom);
ninjaNode->attachObject(dollFeetBody);
创徏椭球?span>
对于角色的上半n用一个椭球体来表C?span>
译注Q和上面一栗?/span>
Q?Q?span> 创徏Ogre::Body
Q?Q?span> 讄Ogre::Body形状Q另外设|不被重力媄(jing)响,
Q?Q?span> 创徏TransformGeometryQ空间ؓ(f)刚才创徏的空?/span>
Q?Q?span> 创徏CapsuleGeometryQ半径ؓ(f)AABB获得半径
Q?Q?span> 讄CapsuleGeometry位置和方向和d
Q?Q?span> ?span>TransformGeometry包含Ogre::body
Q?Q?span> ?span>TransformGeometry包含CapsuleGeometry
Q?Q?span> ?span>Ogre::Body_到ninjiaNode?/span>
OgreOde::Body* dollTorsoBody = new OgreOde::Body("torso");
dollTorsoBody->setMass(OgreOde::CapsuleMass(70*2.5,radius,Vector3::UNIT_Y,radius));
dollTorsoBody->setAffectedByGravity(false);
dollTorsoBody->setDamping(0,50000);
OgreOde::TransformGeometry* torsoTrans = new OgreOde::TransformGeometry(dollSpace);
OgreOde::CapsuleGeometry* torsoGeom = new OgreOde::CapsuleGeometry(radius,size.y-4*radius,dollSpace);
torsoGeom->setPosition(Ogre::Vector3(0,size.y-((size.y-4*radius)/2+2*radius),0)); //can't find a good way to explain this
torsoGeom->setOrientation(Quaternion(Degree(90),Vector3::UNIT_X));
torsoTrans->setBody(dollTorsoBody);
torsoTrans->setEncapsulatedGeometry(torsoGeom);
ninjaNode->attachObject(dollTorsoBody);
q个几何体和脚的几何体在同一个空_(d)所以我们要取消内部撞(g)。讲d讄高些Qƈ且取消重力,不然它会(x)从那个球体上掉下来?/span>
创徏兌
剩下的事情就是将两个撞体连在一起了(jin)。一个绞q连接的代表是自行R前轮?span>
OgreOde::HingeJoint* joint = new OgreOde::HingeJoint();
joint->attach(dollTorsoBody,dollFeetBody);
joint->setAxis(Ogre::Vector3::UNIT_X); //set the rotation axis
注意Q?/span>不要忘记记录所有碰撞体和连接的位置以便你之后能得到它们。你可以?span>ogre堆栈或者创Z自己的?/span>
Ud角色
你可以通过不同Ҏ(gu)Ud或者旋转你的角Ԍ我决定通过改变撞体方向而不是施加力或者力矩?/span>
前后Ud
下面代码可以攑֜按键响应里执行,?span>KC_UP。现在你需要获取碰撞体Q从堆栈或?span>hashTable中获得,然后获取它的方向。我用:(x)
译注Q猜惛_栈就是你为屏q上所有物体所创徏?span>Ogre::Body的一个列表?span>
OgreOde::Body* torso = torsoBodies->getObject("ninja");
Quaternion q = torso->getOrientation();
然后赋予脚一个角速度?span>
OgreOde::Body* feet = feetBodies->getObject("ninja");
feet->wake();
feet->setAngularVelocity(q*Ogre::Vector3(10*cos(1),0,10*sin(1)));
10是我们用的角速度Q必M以三角函C便让角色向正的方向前进?/span>
左右转动
下面代码同样攑֜按键响应中执行,比如KC_RIGHT?span>
OgreOde::Body* torso = torsoBodies->getObject("ninja");
Quaternion q1 = torso->getOrientation();
Quaternion q2(Degree(-4),Ogre::Vector3::UNIT_Y);
torso->setOrientation(q1*q2);
?span>Degree(-4)让角色向双{动,用正数向左{动。也怽已经注意刎ͼ我L从椭球体获取或者设|方向。我没有太多惻I我想如果你从脚的球体来获取和讄也应该没有什么问题?/span>
注意Q?/span>如果你松开按键Q你必须把速度讄?span>0来停止运动?/span>
feetbody->setAngularVelocity(Vector3(0,0,0));
feetBody->setLinearVelocity(Vector3(0,feetBody->getLinearVelocity().y,0));
让角色爬h
最后,我们要确定你的角色不摔倒,所以我们需要不旉新设定他的垂直方向?span>
OgreOde::Body* torso = torsoBodies->getObject("ninja");
Quaternion q = torso->getOrientation();
Vector3 x = q.xAxis();
Vector3 y = q.yAxis();
Vector3 z = q.zAxis();
torso->wake();
torso->setOrientation(Quaternion(x,Vector3::UNIT_Y,z));
问题
部分代码没有我想象的那么好。我重新讑֮垂直方向?x)让角色有奇怪的行ؓ(f)。虽然我讄?jin)速度?span>0Q但是角色在一些不规则的表面上仍然无法停下来?span>