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- -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
skin 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))//通过迭代器访问,并施加随即大小的力。