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

隨筆-381  評(píng)論-37  文章-0  trackbacks-0
OgreOde創(chuàng)建一個(gè)會(huì)走動(dòng)的角色

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

第一版 by SuperMegaMau

這個(gè)教程包括的代碼和算法是作者自己的經(jīng)驗(yàn),也許不正確或不怎么準(zhǔn)確,如果發(fā)現(xiàn)問題請(qǐng)糾正。

 

內(nèi)容

  • 1 介紹
  • 2 創(chuàng)建物理模型  
    • 2.1 創(chuàng)建角色  
    • 2.2 獲取 AABB
    • 2.3 創(chuàng)建新空間  
    • 2.4 創(chuàng)建球  
    • 2.5 創(chuàng)建橢球  
    • 2.6 創(chuàng)建關(guān)節(jié)  
  • 3 移動(dòng)角色  
    • 3.1 前后移動(dòng)
    • 3.2 左右旋轉(zhuǎn)  
  • 4 讓角色爬起來
  • 5 問題

介紹

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

創(chuàng)建物理模型

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

下面,我假設(shè)你對(duì)OgreSceneNodes, meshes AlignedBoxes都有所了解,并且會(huì)用SceneManager創(chuàng)建地形。

創(chuàng)建角色

首先創(chuàng)建一個(gè)SceneNode來放角色的mesh,在這個(gè)例子中我用了Ogre例子中的忍者模型。創(chuàng)建兩個(gè)SceneNode并把它們連在一起。后面我會(huì)解釋為什么是兩個(gè)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

也許你已經(jīng)注意到,ninjaNode被縮放得很小,這是因?yàn)槿绻?span>mesh很大的話渲染的速度就變很慢(不知道為什么)。

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

現(xiàn)在用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;

 

創(chuàng)建一個(gè)新空間

我們需要?jiǎng)?chuàng)建一個(gè)新空間把角色放在其中,并且取消內(nèi)部碰撞檢測(cè)。

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

dollSpace->setInternalCollisions(false);

創(chuàng)建球體(腿部)

現(xiàn)在有了兩個(gè)SceneNodes "ninjaNode" "modelNode"ninjaNode是代表你角色的節(jié)點(diǎn),modelNode是你真正貼mesh的地方。這么做是因?yàn)?span>mesh的中心總是在OgreOde::Body的中心,所以我們用ninjaNode來創(chuàng)建碰撞體的位置,然后根據(jù)ninjaNodeOgreOde::Body來獲得mesh的正確位置。

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

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

(1)        創(chuàng)建一個(gè)碰撞體,命名為feet

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

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

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

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

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

(7)        Ogre::Body粘到ninjaNode

懷疑創(chuàng)建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);

創(chuàng)建橢球體

對(duì)于角色的上半身用一個(gè)橢球體來表示。

譯注:和上面一樣。

(1)        創(chuàng)建Ogre::Body

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

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

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

(5)        設(shè)置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);

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

創(chuàng)建關(guān)節(jié)

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

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

joint->attach(dollTorsoBody,dollFeetBody);

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

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

移動(dòng)角色

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

前后移動(dòng)

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

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

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

Quaternion q = torso->getOrientation();

然后賦予腳一個(gè)角速度。

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

feet->wake();

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

10是我們用的角速度,必須乘以三角函數(shù)以便讓角色向正確的方向前進(jìn)。

左右轉(zhuǎn)動(dòng)

下面代碼同樣放在按鍵響應(yīng)中執(zhí)行,比如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)讓角色向右轉(zhuǎn)動(dòng),用正數(shù)向左轉(zhuǎn)動(dòng)。也許你已經(jīng)注意到,我總是從橢球體獲取或者設(shè)置方向。我沒有太多想,我想如果你從腳的球體來獲取和設(shè)置也應(yīng)該沒有什么問題。

注意:如果你松開按鍵,你必須把速度設(shè)置為0來停止運(yùn)動(dòng)。

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

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

讓角色爬起來

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

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

問題

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

posted on 2009-01-02 04:56 小王 閱讀(1278) 評(píng)論(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网站| 午夜精品在线视频| 亚洲深夜福利在线| 野花国产精品入口| 亚洲激情影视| 亚洲激情电影在线| 亚洲福利免费| 欧美大秀在线观看| 免费观看日韩| 蜜桃久久精品乱码一区二区| 久久国产精品亚洲va麻豆| 亚洲专区在线| 亚洲伊人网站| 亚洲一区二区三区中文字幕在线| 久久精品一区二区三区不卡牛牛 | 在线一区二区三区四区| 亚洲第一黄网| 欧美激情 亚洲a∨综合| 久久久精品动漫| 欧美中文字幕在线| 亚洲欧美变态国产另类| 一区二区不卡在线视频 午夜欧美不卡在| 欧美日韩免费精品| 欧美韩国日本一区| 欧美激情性爽国产精品17p| 美女性感视频久久久| 久久香蕉精品| 免费的成人av| 狂野欧美激情性xxxx欧美| 久久亚洲欧美| 欧美国产三区| 欧美日韩国产小视频| 欧美日韩一区二区在线| 欧美午夜美女看片| 国产精品永久免费视频| 国产日本欧美在线观看| 国产欧美综合在线| 国产欧美一区二区精品仙草咪| 欧美sm极限捆绑bd| 欧美精品1区| 国产精品成人免费| 国产欧美日韩在线观看| 国内精品免费在线观看| 国产综合久久久久久鬼色| 亚洲第一成人在线| 99爱精品视频| 香蕉尹人综合在线观看| 久久婷婷一区| 亚洲激情视频在线观看| 一区二区三区福利| 欧美一区二区三区在线免费观看| 日韩亚洲在线观看| 亚洲欧美怡红院| 久久青青草原一区二区| 欧美日韩1区| 国产精品一区视频| 亚洲高清色综合| 在线亚洲观看| 久久婷婷丁香| 亚洲日本一区二区| 亚洲欧美成人一区二区在线电影 | 亚洲欧洲精品一区二区三区| 日韩亚洲在线观看| 欧美在线播放| 欧美大成色www永久网站婷| av成人免费观看| 久久久久国产一区二区三区| 欧美日本亚洲视频| 韩日欧美一区| 一区二区三区日韩精品| 久久偷窥视频| 亚洲天堂成人在线视频| 麻豆freexxxx性91精品| 国产精品免费小视频| 亚洲国产另类久久久精品极度| 国语自产精品视频在线看一大j8| 国产精品欧美激情| 亚洲第一在线| 午夜精品久久久久久久| 嫩草成人www欧美| 亚洲一区二区欧美| 欧美精品二区| 伊人狠狠色j香婷婷综合| 亚洲无毛电影| 亚洲电影专区| 久久精品国产在热久久| 国产精品萝li| 亚洲欧洲午夜| 久久久爽爽爽美女图片| av不卡在线| 欧美激情女人20p| 狠狠色伊人亚洲综合成人| 亚洲在线免费观看| 亚洲三级电影全部在线观看高清| 日韩午夜电影在线观看| 久久亚裔精品欧美| 国产欧美在线视频| 亚洲婷婷综合色高清在线| 欧美肥婆在线| 久久久久久久999| 国产一区二区三区电影在线观看| 在线观看成人av| 久久精品盗摄| 亚洲欧美国产毛片在线| 欧美日韩国产精品一区二区亚洲 | 久久久久国产一区二区| 99精品视频免费全部在线| 男人的天堂成人在线| 在线观看的日韩av| 美女久久一区| 久久电影一区| 一区免费视频| 久久综合狠狠综合久久激情| 久久不射2019中文字幕| 国产婷婷精品| 久久久亚洲高清| 久久精品日韩一区二区三区| 国产在线精品成人一区二区三区| 亚洲精品视频在线看| 亚洲第一中文字幕在线观看| 久久久久综合网| 亚洲国产精品999| 欧美激情一区二区在线| 免费不卡亚洲欧美| 亚洲人成亚洲人成在线观看图片 | 麻豆久久精品| 久久天天躁夜夜躁狠狠躁2022| 欧美日韩精品欧美日韩精品一| 国产视频一区二区三区在线观看| 亚洲电影免费观看高清完整版在线观看 | 欧美日韩国产欧| 中文日韩在线视频| 亚洲精品中文字幕有码专区| 欧美日韩高清在线一区| 亚洲性感美女99在线| 亚洲在线免费视频| 国产自产精品| 亚洲福利视频一区二区| 欧美日韩一区二区免费在线观看| 亚洲高清在线| 亚洲精品欧美日韩专区| 欧美午夜精品久久久久久久| 欧美一级欧美一级在线播放| 欧美一区二区在线视频| 亚洲国产免费看| 亚洲精品在线视频| 国产精品久久久久免费a∨| 久久精品视频亚洲| 久久综合色播五月| 日韩一区二区精品葵司在线| 亚洲视频一区二区| 一区二区三区在线免费观看| 亚洲国产欧美久久| 国产精品福利网站| 狼人天天伊人久久| 欧美区一区二| 久久精品观看| 欧美精品激情在线| 欧美伊人久久大香线蕉综合69| 亚洲色在线视频| 在线观看欧美亚洲| 999亚洲国产精| 国产亚洲欧美aaaa| 亚洲激情成人| 国产亚洲精品久久久| 亚洲黄页视频免费观看| 国产欧美一区二区精品婷婷| 亚洲国产99| 国产午夜精品久久久久久免费视| 午夜亚洲性色福利视频| 免费久久99精品国产| 欧美一级专区免费大片| 欧美成人国产一区二区| 欧美在线日韩| 欧美精品在线一区二区三区| 久久精彩免费视频| 欧美三级午夜理伦三级中视频| 亚洲作爱视频| 久久久久久久久岛国免费| 亚洲一区在线看| 免费久久久一本精品久久区| 久久国产精品黑丝| 欧美日韩精品二区第二页| 免费成人高清视频| 国产精品盗摄久久久| 欧美激情第六页| 国产视频久久久久| 宅男66日本亚洲欧美视频| 亚洲人成网站999久久久综合| 亚洲欧洲精品一区二区三区波多野1战4| 久久婷婷综合激情|