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

隨筆-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>
            亚洲综合日韩在线| 国产日韩欧美不卡| 在线亚洲伦理| av成人动漫| 亚洲欧美激情视频| 欧美一区三区三区高中清蜜桃| 午夜在线精品偷拍| 久久在线视频在线| 欧美人与禽性xxxxx杂性| 欧美亚州在线观看| 国产美女高潮久久白浆| 今天的高清视频免费播放成人| 在线电影一区| 中文精品99久久国产香蕉| 亚洲欧美精品在线| 久久影视三级福利片| 欧美成人国产一区二区| 99成人在线| 久久久999精品| 欧美视频亚洲视频| 在线欧美视频| 亚洲免费人成在线视频观看| 久久精品主播| 一本一本大道香蕉久在线精品| 欧美一区深夜视频| 欧美日韩国产高清| 国产日韩欧美在线视频观看| 亚洲日韩欧美视频| 久久成人18免费网站| 亚洲国产精品国自产拍av秋霞| 亚洲日本电影| 久久久久一区| 国产精品亚洲一区二区三区在线| 亚洲级视频在线观看免费1级| 欧美一区二区在线观看| 亚洲日本在线视频观看| 久久激情综合网| 国产精品国码视频| 亚洲伦理在线| 欧美成人影音| 韩国av一区| 国产精品久久久久婷婷| 91久久久久久久久| 久久综合久久88| 羞羞视频在线观看欧美| 欧美日韩大陆在线| 亚洲精品国产精品国自产在线| 久久国产主播精品| 亚洲欧美国产一区二区三区| 国产精品毛片高清在线完整版| 亚洲精品在线电影| 欧美sm视频| 久久视频精品在线| 伊人狠狠色j香婷婷综合| 亚洲欧美中文日韩在线| 中文精品视频| 国产精品自拍在线| 欧美在线电影| 亚洲欧美精品中文字幕在线| 国产精品激情电影| 亚洲欧美日韩成人高清在线一区| av成人毛片| 欧美体内谢she精2性欧美| 一本色道久久综合狠狠躁的推荐| 亚洲国产成人久久综合一区| 男女激情久久| 日韩午夜激情av| 99这里有精品| 国产精品日本一区二区| 久久不射中文字幕| 久久精彩视频| 在线播放亚洲| 老鸭窝亚洲一区二区三区| 欧美伊人久久久久久久久影院| 今天的高清视频免费播放成人| 免费久久99精品国产| 蜜臀av国产精品久久久久| 亚洲毛片av| 亚洲欧美日韩爽爽影院| 国产真实乱偷精品视频免| 裸体丰满少妇做受久久99精品| 欧美va亚洲va国产综合| 亚洲网址在线| 欧美中文字幕在线播放| 亚洲精品久久| 亚洲欧美成人一区二区三区| 在线观看日韩一区| 99riav1国产精品视频| 国产日韩精品在线| 亚洲第一页自拍| 国产伦精品一区二区三区在线观看 | 亚洲你懂的在线视频| 国产一区二区在线观看免费播放| 亚洲第一福利社区| 国产精品美女午夜av| 欧美福利视频在线| 国产精品羞羞答答| 亚洲国产综合91精品麻豆| 欧美日韩日本网| 亚洲电影在线看| 亚洲精品国产无天堂网2021| 国产精品久久婷婷六月丁香| 久久综合久色欧美综合狠狠| 奶水喷射视频一区| 欧美在线免费一级片| 欧美激情视频网站| 欧美中文字幕精品| 欧美激情精品久久久久久黑人| 性久久久久久久| 欧美精品99| 久色成人在线| 国产精品乱码妇女bbbb| 欧美激情精品久久久久久免费印度| 欧美午夜在线观看| 亚洲第一在线视频| 激情成人亚洲| 欧美一二区视频| 亚洲欧美日韩国产另类专区| 蜜臀av一级做a爰片久久 | 欧美激情免费观看| 国产伦精品一区二区三区高清版 | 久久久99久久精品女同性| 欧美日韩你懂的| 亚洲黄色有码视频| 有码中文亚洲精品| 久久福利资源站| 久久久91精品国产一区二区三区 | 一区二区日韩免费看| 91久久线看在观草草青青| 久久久一本精品99久久精品66| 久久爱www久久做| 国产日韩在线一区| 亚洲欧美激情精品一区二区| 亚洲视屏在线播放| 欧美日韩在线视频首页| 99国产精品久久久久久久| 日韩一区二区精品在线观看| 欧美成人精精品一区二区频| 欧美激情1区2区3区| 亚洲激情网站免费观看| 另类尿喷潮videofree| 欧美成人免费va影院高清| 亚洲国产一区二区三区青草影视 | 性欧美8khd高清极品| 欧美亚洲免费| 国产无一区二区| 久久gogo国模裸体人体| 欧美freesex交免费视频| 亚洲欧洲一区二区在线播放| 欧美精品大片| 亚洲视频香蕉人妖| 欧美中在线观看| 欧美一区二区久久久| 国产精品三级视频| 亚洲自拍三区| 另类天堂视频在线观看| 亚洲欧洲精品一区二区三区不卡| 欧美aⅴ99久久黑人专区| 亚洲欧洲一区二区天堂久久| 亚洲在线视频一区| 国产资源精品在线观看| 欧美不卡视频一区发布| 亚洲少妇在线| 欧美成人午夜77777| 亚洲网在线观看| 国产原创一区二区| 欧美日韩xxxxx| 久久精品99国产精品| 亚洲欧洲久久| 麻豆亚洲精品| 性欧美18~19sex高清播放| 亚洲东热激情| 国产精品毛片a∨一区二区三区|国 | 亚洲国产导航| 亚洲欧美日韩综合一区| 国产在线精品二区| 欧美日本中文字幕| 欧美一区二区三区成人| 亚洲精品国产无天堂网2021| 久久嫩草精品久久久久| 亚洲午夜激情网页| 亚洲欧洲精品一区二区三区| 国产农村妇女毛片精品久久莱园子| 久久综合九色欧美综合狠狠| 亚洲视频久久| 亚洲国产一区在线| 久久久综合视频| 性色一区二区三区| 一本色道久久综合亚洲精品不 | 欧美国产精品一区| 午夜久久福利| 在线亚洲欧美视频| 在线观看国产一区二区| 国产精品视频精品| 欧美日韩一级视频| 欧美精品久久久久a| 女生裸体视频一区二区三区| 欧美在线视频a| 亚洲愉拍自拍另类高清精品| 亚洲毛片视频|