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

隨筆-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资源网站| 久久精品国产免费| 136国产福利精品导航网址应用| 欧美激情1区| 欧美日韩中文| 久久se精品一区精品二区| 欧美在线观看视频一区二区三区| 国内一区二区三区| 最新国产成人av网站网址麻豆| 欧美日韩国产免费观看| 午夜国产不卡在线观看视频| 久久精品久久99精品久久| 亚洲人体大胆视频| 亚洲愉拍自拍另类高清精品| 在线视频成人| 在线视频你懂得一区| 激情国产一区| 一区二区三区日韩精品视频| 黄色一区二区三区| 99精品免费网| 亚洲黄色性网站| 亚洲欧美在线一区二区| 亚洲国产精品热久久| 中国成人亚色综合网站| 亚洲清纯自拍| 久久狠狠一本精品综合网| 99热免费精品| 久久精品人人做人人爽| 亚洲无线一线二线三线区别av| 性色av一区二区三区在线观看| 亚洲乱码精品一二三四区日韩在线 | 久久狠狠亚洲综合| 欧美激情精品久久久| 久久精彩免费视频| 欧美丝袜一区二区| 亚洲国产日韩欧美在线图片 | 久久久久久久久久久成人| 亚洲一二三四区| 欧美成人有码| 老司机久久99久久精品播放免费| 国产精品实拍| 一本色道久久88综合亚洲精品ⅰ | 一本久久知道综合久久| 乱人伦精品视频在线观看| 久久精品国产精品亚洲| 国产精品黄视频| 99精品欧美一区二区三区综合在线 | 欧美激情久久久久久| 久久精品最新地址| 国产精品日韩一区| 一本色道久久精品| 亚洲视频www| 欧美精品在线观看91| 久久久久久久综合| 欧美激情中文不卡| 国产在线不卡| 欧美在线视屏| 欧美.com| 欧美黄色一区| 99成人免费视频| 欧美日韩国产在线播放| 亚洲激情图片小说视频| 亚洲国产精品t66y| 久久久最新网址| 欧美成人免费在线| 亚洲精品国久久99热| 免费欧美高清视频| 亚洲日本aⅴ片在线观看香蕉| 亚洲精品国产精品国自产观看| 久久综合久久综合久久综合| 免费中文日韩| 日韩一区二区电影网| 欧美日韩在线播放三区四区| 一区二区高清视频在线观看| 亚洲欧美日韩爽爽影院| 国内精品国语自产拍在线观看| 久久久久高清| 亚洲日本中文字幕| 午夜在线视频观看日韩17c| 国产日韩欧美在线| 久久在线视频在线| 日韩视频二区| 久久精品国产一区二区三区| 在线观看亚洲a| 欧美区在线观看| 亚洲综合清纯丝袜自拍| 你懂的网址国产 欧美| 一本色道88久久加勒比精品| 国产乱码精品1区2区3区| 久久青草久久| 一区二区日本视频| 鲁大师影院一区二区三区| 日韩视频免费观看高清在线视频| 国产精品大全| 欧美成人自拍| 香蕉久久国产| 亚洲精品乱码视频 | 国内自拍视频一区二区三区| 欧美黄在线观看| 午夜精品久久久久久久99黑人| 欧美激情女人20p| 午夜影院日韩| 在线综合+亚洲+欧美中文字幕| 国产麻豆日韩| 欧美日韩精品久久| 久久久久九九视频| 亚洲欧美国产va在线影院| 91久久在线观看| 久久一区二区三区国产精品| 亚洲免费视频成人| 日韩亚洲在线观看| 日韩一级欧洲| 欧美激情第六页| 久久久久久久久久久久久9999| 一区二区三区视频在线观看| 亚洲第一偷拍| 国产一区自拍视频| 国产精品推荐精品| 欧美视频在线观看| 欧美护士18xxxxhd| 蜜桃视频一区| 久久久久久久网站| 午夜激情久久久| 亚洲一区二区日本| 99re6这里只有精品| 亚洲黄色成人| 在线观看视频一区二区欧美日韩| 久久久久se| 午夜精品在线| 午夜精品在线视频| 欧美一级一区| 欧美一区二区在线看| 亚洲尤物影院| 亚洲一区二区在线| 亚洲性人人天天夜夜摸| 一区二区三区四区五区精品视频| 亚洲免费不卡| 亚洲视频中文字幕| 一区二区三区**美女毛片| 亚洲电影av| 91久久精品国产91久久| 亚洲国产欧美不卡在线观看| 在线日韩欧美| 亚洲人午夜精品免费| 亚洲精品在线免费观看视频| 亚洲另类一区二区| 在线亚洲观看| 欧美一区二区视频97| 久久riav二区三区| 久久综合九色| 亚洲成色www8888| 亚洲精品美女在线观看播放| aa级大片欧美| 亚洲摸下面视频| 久久久久国产精品www| 欧美jjzz| 国产精品免费区二区三区观看| 国产亚洲欧美一区在线观看| 尤物99国产成人精品视频| 亚洲精品乱码久久久久久久久| 亚洲一区免费网站| 久久久欧美精品sm网站| 亚洲国产精品成人| 亚洲一区二区视频在线| 久久久久综合网| 欧美日韩免费高清一区色橹橹| 国产欧美一区二区精品秋霞影院| 在线观看成人小视频| av不卡在线| 久久久女女女女999久久| 亚洲欧洲精品一区二区| 亚洲综合好骚| 欧美日韩国产丝袜另类| 国产欧美亚洲精品| 一本大道久久a久久综合婷婷| 欧美一区1区三区3区公司| 欧美激情视频在线播放| 亚洲免费视频观看| 欧美va天堂| 国产亚洲成精品久久| 亚洲精品国产欧美| 久久激情视频| 日韩视频在线免费| 久久综合电影一区| 国产精品一区二区欧美| 亚洲精品亚洲人成人网| 久久久久久综合网天天| 在线亚洲免费| 欧美激情无毛| 亚洲第一久久影院| 久久aⅴ国产欧美74aaa| 日韩午夜在线| 欧美激情一区在线观看| 一区二区三区在线免费播放| 欧美亚洲视频| 一区二区三区四区五区视频|