青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-380  評論-37  文章-0  trackbacks-0
OgreOde創建一個會走動的角色

原文http://www.game798.com/html/2007-12/5156.htm

第一版 by SuperMegaMau

這個教程包括的代碼和算法是作者自己的經驗,也許不正確或不怎么準確,如果發現問題請糾正。

 

內容

  • 1 介紹
  • 2 創建物理模型  
    • 2.1 創建角色  
    • 2.2 獲取 AABB
    • 2.3 創建新空間  
    • 2.4 創建球  
    • 2.5 創建橢球  
    • 2.6 創建關節  
  • 3 移動角色  
    • 3.1 前后移動
    • 3.2 左右旋轉  
  • 4 讓角色爬起來
  • 5 問題

介紹

我相信我不是第一人自問如何用OgreOde創建一個運動角色。搜索論壇和wiki后,我意識到這是一個很有用的信息。這個教程解釋了如何創建一個可以在地形上行走的運動角色(包括其它meshes,如樹和房屋)。

創建物理模型

我按照在Monster的方法用下圖代表一個角色:

下面,我假設你對OgreSceneNodes, meshes AlignedBoxes都有所了解,并且會用SceneManager創建地形。

創建角色

首先創建一個SceneNode來放角色的mesh,在這個例子中我用了Ogre例子中的忍者模型。創建兩個SceneNode并把它們連在一起。后面我會解釋為什么是兩個Node

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

也許你已經注意到,ninjaNode被縮放得很小,這是因為如果mesh很大的話渲染的速度就變很慢(不知道為什么)。

獲取 AABB(AxisAlignedBox, 軸對齊包圍盒)

現在用AxisAlignedBox獲取mesh的大小。

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;

 

創建一個新空間

我們需要創建一個新空間把角色放在其中,并且取消內部碰撞檢測。

OgreOde::SimpleSpace* dollSpace = new OgreOde::SimpleSpace(_world->getDefaultSpace());

dollSpace->setInternalCollisions(false);

創建球體(腿部)

現在有了兩個SceneNodes "ninjaNode" "modelNode"ninjaNode是代表你角色的節點,modelNode是你真正貼mesh的地方。這么做是因為mesh的中心總是在OgreOde::Body的中心,所以我們用ninjaNode來創建碰撞體的位置,然后根據ninjaNodeOgreOde::Body來獲得mesh的正確位置。

左邊圖是用一個SceneNode所得到的效果,右邊是用兩個SceneNode。你可以注意到,左邊的角色懸浮在半空中。下面代碼創建了一個球體代表角色的腳部。我們需要一個SphereGeometry和一個TransformGeometry 將球體放到正確位置。

譯注:注釋為我的猜想,具體不知道步驟這么復雜,歡迎糾正。

(1)        創建一個碰撞體,命名為feet

(2)        設置碰撞體為球形物體,半徑為AABB獲得的半徑

(3)        SphereGeometry,半徑為AABB獲得的半徑

(4)        TransformGeometry,空間為剛才創建的空間, TransformGeometry似乎是為了包含某特定形狀的幾何體

(5)        改變modelNode相對于ninjiaNode的位置,以便讓腳占到地上

(6)        TransformGeometry包含一個OgreOde::Body和一個幾何體

(7)        Ogre::Body粘到ninjaNode

懷疑創建SphereGeometry是否只是讓Ogre::Body具象化

 

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);

創建橢球體

對于角色的上半身用一個橢球體來表示。

譯注:和上面一樣。

(1)        創建Ogre::Body

(2)        設置Ogre::Body形狀,另外設置不被重力影響,

(3)        創建TransformGeometry,空間為剛才創建的空間

(4)        創建CapsuleGeometry,半徑為AABB獲得半徑

(5)        設置CapsuleGeometry位置和方向和阻尼

(6)        TransformGeometry包含Ogre::body

(7)        TransformGeometry包含CapsuleGeometry

(8)        Ogre::Body粘到ninjiaNode

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);

這個幾何體和腳的幾何體在同一個空間,所以我們要取消內部碰撞檢測。講阻尼設置高些,并且取消重力,不然它會從那個球體上掉下來。

創建關節

剩下的事情就是將兩個碰撞體連在一起了。一個絞連連接的代表是自行車前輪。

OgreOde::HingeJoint* joint = new OgreOde::HingeJoint();

joint->attach(dollTorsoBody,dollFeetBody);

joint->setAxis(Ogre::Vector3::UNIT_X);      //set the rotation axis

注意:不要忘記記錄所有碰撞體和連接的位置以便你之后能得到它們。你可以用ogre堆棧或者創建你自己的。

移動角色

你可以通過不同方法移動或者旋轉你的角色,我決定通過改變碰撞體方向而不是施加力或者力矩。

前后移動

下面代碼可以放在按鍵響應里執行,象KC_UP。現在你需要獲取碰撞體,從堆棧或者hashTable中獲得,然后獲取它的方向。我用:

譯注:猜想堆棧就是你為屏幕上所有物體所創建的Ogre::Body的一個列表。

OgreOde::Body* torso = torsoBodies->getObject("ninja");

Quaternion q = torso->getOrientation();

然后賦予腳一個角速度。

OgreOde::Body* feet = feetBodies->getObject("ninja");

feet->wake();

feet->setAngularVelocity(q*Ogre::Vector3(10*cos(1),0,10*sin(1)));

10是我們用的角速度,必須乘以三角函數以便讓角色向正確的方向前進。

左右轉動

下面代碼同樣放在按鍵響應中執行,比如KC_RIGHT

OgreOde::Body* torso = torsoBodies->getObject("ninja");

Quaternion q1 = torso->getOrientation();

Quaternion q2(Degree(-4),Ogre::Vector3::UNIT_Y);

torso->setOrientation(q1*q2);

Degree(-4)讓角色向右轉動,用正數向左轉動。也許你已經注意到,我總是從橢球體獲取或者設置方向。我沒有太多想,我想如果你從腳的球體來獲取和設置也應該沒有什么問題。

注意:如果你松開按鍵,你必須把速度設置為0來停止運動。

feetbody->setAngularVelocity(Vector3(0,0,0));

feetBody->setLinearVelocity(Vector3(0,feetBody->getLinearVelocity().y,0));

讓角色爬起來

最后,我們要確定你的角色不摔倒,所以我們需要不時重新設定他的垂直方向。

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));

問題

部分代碼沒有我想象的那么好。我重新設定垂直方向會讓角色有奇怪的行為。雖然我設置了速度為0,但是角色在一些不規則的表面上仍然無法停下來。

posted on 2009-01-02 04:56 小王 閱讀(1268) 評論(0)  編輯 收藏 引用 所屬分類: 游戲引擎
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日韩亚洲视频| 香蕉精品999视频一区二区| 欧美.日韩.国产.一区.二区| 亚洲一区黄色| 亚洲欧美国产77777| 久久er99精品| 欧美成人精品在线观看| 欧美电影资源| 国产精品mm| 国产一区清纯| 99视频一区| 久久精品动漫| 欧美日韩在线视频首页| 国产日韩欧美中文在线播放| 亚洲精品乱码久久久久久蜜桃麻豆| 欧美日韩在线不卡一区| 国产综合自拍| 亚洲国内精品在线| 午夜久久tv| 亚洲黄色视屏| 久久久福利视频| 国产精品入口福利| 亚洲精品老司机| 麻豆精品在线视频| 亚洲女爱视频在线| 国产精品一区久久久久| av72成人在线| 一本高清dvd不卡在线观看| 免费h精品视频在线播放| 在线观看欧美日韩| 欧美高清hd18日本| 亚洲精品女av网站| 亚洲国产婷婷香蕉久久久久久| 久久精品国产v日韩v亚洲| 国产一区二区三区四区在线观看| 香蕉国产精品偷在线观看不卡| 一本色道久久加勒比88综合| 欧美日韩国产系列| 亚洲综合丁香| 欧美有码在线观看视频| 精品动漫3d一区二区三区免费版 | 欧美在线播放视频| 国产午夜精品美女视频明星a级| 校园春色国产精品| 久久九九全国免费精品观看| 91久久精品国产91久久性色| 久久网站免费| 欧美韩日精品| 久久婷婷国产麻豆91天堂| 欧美一区二区在线播放| 久久露脸国产精品| 中国成人在线视频| 久久一区亚洲| 久久黄色级2电影| 欧美激情视频网站| 美女免费视频一区| 国产精品多人| 日韩视频久久| 亚洲精品免费在线| 久久精品国产成人| 久久不见久久见免费视频1| 欧美极品欧美精品欧美视频| 久久蜜桃av一区精品变态类天堂| 国产精品videosex极品| 欧美aaaaaaaa牛牛影院| 国产综合色产| 性欧美激情精品| 欧美一区二区三区久久精品| 欧美本精品男人aⅴ天堂| 欧美成人精品影院| 尤物九九久久国产精品的分类| 欧美在线一二三区| 欧美亚洲免费在线| 国产一区二区精品在线观看| 亚洲欧美视频| 欧美国产精品劲爆| 亚洲国产高清视频| 欧美深夜福利| 新片速递亚洲合集欧美合集| 久久婷婷国产麻豆91天堂| 91久久在线播放| 国产精品女主播一区二区三区| 999亚洲国产精| 性欧美激情精品| 狠狠色狠狠色综合| 欧美国产日韩一区二区| 中文精品视频| 国产丝袜美腿一区二区三区| 欧美在线视频一区| 一本色道久久综合亚洲精品按摩 | 亚洲成色777777在线观看影院| 99re这里只有精品6| 国内精品久久久久久 | 日韩午夜电影av| 久久九九精品99国产精品| 亚洲欧洲一区二区在线观看| 国产精品日韩一区二区三区| 欧美fxxxxxx另类| 久久精品99国产精品日本| 91久久精品www人人做人人爽| 欧美一级成年大片在线观看| 亚洲精品小视频在线观看| 一区二区三区在线观看国产| 欧美私人网站| 国产精品久久网| 免费av成人在线| 性亚洲最疯狂xxxx高清| 亚洲视频www| 亚洲一区视频| 午夜精品一区二区三区在线| 亚洲狼人综合| 99热精品在线观看| 亚洲天堂av图片| 亚洲素人一区二区| 欧美一区二粉嫩精品国产一线天| 欧美视频在线观看 亚洲欧| 欧美日韩国产三区| 国产精品视频xxx| 激情综合网激情| 久久精品国产一区二区三区| 先锋影院在线亚洲| 亚洲欧美激情一区二区| 亚洲一区免费在线观看| 午夜在线视频观看日韩17c| 久久精品道一区二区三区| 久久久久久精| 欧美日韩专区在线| 亚洲二区三区四区| 亚洲神马久久| 久久久久久久久一区二区| 亚洲经典在线看| 欧美亚洲综合另类| 欧美久久久久久久久久| 国产一区二区黄| 午夜精彩视频在线观看不卡| 六月婷婷一区| 亚洲影视九九影院在线观看| 欧美ab在线视频| 国产一区激情| 亚洲欧美日韩国产一区| 欧美激情在线观看| 久久亚洲精品欧美| 黑人极品videos精品欧美裸| 亚洲男人天堂2024| 99在线精品观看| 欧美日韩综合在线免费观看| 日韩视频二区| 91久久久亚洲精品| 久久精品免费电影| 午夜精品久久久久久久99热浪潮| 欧美日韩mp4| 亚洲无线一线二线三线区别av| 免费视频一区二区三区在线观看| 久久xxxx精品视频| 国内外成人免费激情在线视频| 久久免费偷拍视频| 久久久久www| 亚洲国产天堂久久综合网| 欧美激情aⅴ一区二区三区| 亚洲婷婷免费| 亚洲欧美成人在线| 亚洲国产日韩美| 亚洲精品国产欧美| 9久re热视频在线精品| 国产精品免费网站| 久久精品首页| 欧美精品色网| 久久一区国产| 欧美日韩亚洲综合| 乱中年女人伦av一区二区| 欧美日本免费一区二区三区| 亚洲综合色丁香婷婷六月图片| 亚洲韩国精品一区| 亚洲图片欧美日产| 日韩亚洲不卡在线| 久久午夜精品一区二区| 亚洲午夜激情| 久久免费视频在线观看| 亚洲摸下面视频| 欧美性猛交xxxx乱大交退制版| 欧美第一黄网免费网站| 国产午夜亚洲精品不卡| 亚洲最新合集| 国产精品99久久久久久有的能看| 久久国内精品视频| 午夜老司机精品| 欧美性猛交xxxx乱大交蜜桃 | 日韩一区二区久久| 亚洲精品麻豆| 欧美精品一区二区三| 亚洲第一视频| 亚洲精选国产| 国产精品久久久久久五月尺| 99国产精品| 欧美激情在线| 在线亚洲国产精品网站| 亚洲综合丁香| 精品二区视频| 欧美日本三级| 久久av红桃一区二区小说|