NxOgre的概念小结

1、系统中只能由一个world对象,而world中可以有多个Scene,在Scene中的对象不能与另一个Scene中的对象交互(相互影响),

Scene包含很多Actor,每个Actor由一个或多个Shpae组成,shape有一个重要的Material,用来表示物体的材料(摩擦系数,弹性系数等)。


2、NxOgre中有两种参数设置方式:类参数和字符串参数。从以下例子可以看出其不同用法。
   World对象的创建:
类参数方式
   PhysXDriverParams params;
   params.mLogType = PhysXDriverParams::LT_HTML;
   params.mHasFrameListener = true;
   World* mWorld = new World(params);
字符串方式:
   World* mWorld = new World("log: html, framelistener: yes");

参数说明
PhysXDriver (Given in through World):   Code:
framelistener: yes/no       是否启用FrameListener(Ogre的帧监听)
shutdown-on-errors: yes/no   当错误发生时退出
log: none/text/html/phpbb    日志

Scene:    Code:
floor: yes/no            是否创建地板
gravity: yes/no/0 -9.8 0     场景的重力
material-restitution: 0.5     弹性系数
material-sfriction:0.5       摩擦系数
material-dfriction:0.5       摩擦系数

Actor/Body: Code:
kinematic: yes/no        运动
mass: 10.1           质量
density: 10.1          密度
(当actor/body 是静态物体时static,mass和density参数不起作用.)
static: yes/no
node-scale: 1 2 3
node-shadows: yes/no

Shapes:   Code:
material: myMaterial/1
offset: 1 2 3
orientation: 1 0 0 0
ccd: yes/no
ccd-delta: 0.25
skin-width: -1.0
group: myGroup/0
mesh-scale: 1 2 3

Character:    Code:
dimensions: 1 2 3 (for box) or 1 2 (for capsule)
up: 0 1 0
slopelimit: 0.7
skinwidth: 0.1
stepoffset: 0.5
type: box/capsule

   销毁World对象 delete mWorld;

3、Scene对象,它与Ogre::SceneManager有关联,一个Ogre::SceneManager可以对应多个Scene,Scene必须通过World对象来创建
   SceneParams sp;
   sp.setToDefault();
   sp.floor = true;
   NxOgre::Scene * mScene = mWorld->createScene("Main", mSceneMgr, sp);

   NxOgre::Scene * mScene = mWorld->createScene("Main", mSceneMgr, "gravity: yes, floor: yes");
   createScene(名字,场景管理器,参数)
通过以下方法销毁Scene
    mWorld->destroyScene(mScene);
    mWorld->destroyAllScenes();将销毁所有的场景,及其里面的Actors

4、 NxOgre Actors是Scene中有质量的对象,通常具有三或四种对象组成:Name(在Scene中的唯一标识名称)、Pose(空间位置及朝向)、Shape或者说是Collision Model、通常还有Mass(质量)。与质量相关的有一个属性,即Static or Dynamic,静态物体是没有质量的,或者说质量无限大,受力不会发生移动,可用于大地、地形、建筑等固定物体;动态物体则是有一定质量可以受力移动的。Actor不表现为mesh、billborad、sound等有形有声的对象,它是不可视的。Actor由Scene来创建和销毁的。

Actor* mActor = mScene->createActor("Spot", new CubeShape(1.0f), Vector3(0, 2, 0), "mass: 10");
第一个参数Spot指Actor的名字;
第二参数是shape对象,NxOgre内建有很多种Shape:Cube、Sphere、capsules、组合体、Convex、Triangle Mesh等;
第三个参数是指定该Actor的位置,这里表示其中心在世界坐标原点的2m高处;
第四个参数用的是字符串参数,这里表示该Atcor质量是10kg,如果要设置为静态的则用“static: yes”,
如果要物体由一定初始速度可以用“mass: 10, linearvelocity: 10 0 0”。

NxOgre中用Pose类来表示物体的空间位置和朝向

Vector3(9, -3, 0);
Quaternion(Degree(90), Vector3::UNIT_Z);//Location is at 0,0,0
Pose(Vector3(9, -3, 0), Quaternion(Degree(90), Vector3::UNIT_Z);

for(i=0;i<26;i++);
Actor* mActor=mScene->createActor("Rocky", new CubeShape(1.0f), Vector3(0,i,0),"mass: 10");
运行这段代码不会出现问题,不会出现Actor重名的问题,NxOgre将自动为Actor的名字加上数字以避免冲突!

可以通过以下方式控制Actor
rocky4 = mScene->getActor("Rocky4");//得到创建的Atcor
rocky4->setGlobalPosition(10, 10, 10);//设置位置
rocky4->addForce(1000, 0, 0);//施加力
rocky4->addTorque(1000, 0, 1000)//施加扭矩
rocky4->moveTo(10, 10, 10);//
......

容器对象
NxOgre中用类似Container<NxString, Actor*> Actros的方法定义了容器类
包括Actors, Scenes, ShapeGroups, Triggers 等等
Code:
Actors actors;//定义Actors容器
Actor* NotRocky = mScene->createActor("Not Rocky", new CubeShape(1), Vector3(2,4,0), "mass: 15");//新建一个Actor名叫"Not Rocky"。
actors.insert(NotRocky->getName(), NotRocky);//加入到容器中,原作者这个地方可能有误
actors.insert("Rocky5", mScene->getActor("Rocky5"));//另一种方式加入容器中
Actor* Rocky5 = actors.get("Rocky5");//通过容器调用Actor
actors.erase("Rocky5);//从容器中移出
mScene->destroyActor("Rocky5");//用Scene对象销毁Actor

NxOgre中对对象的删除实行严格的策略,容器或所有者只能销毁其包含的或者锁定的对象

Actors rockys;
rockys = mScene->getActorsFromIdentifier(SO_STARTS_WITH, "Rocky");//通过名字开头字符串查找
...
for (Actor* rocky = rockys.begin();rocky = rockys.next();)
     rocky->addForce(0,NxMath::Rand(0,50),NxMath::Rand(0,50))//通过迭代器访问,并施加随即大小的力。

posted @ 2011-10-13 00:28  深圳-宝爷  阅读(502)  评论(0编辑  收藏  举报