zoukankan      html  css  js  c++  java
  • 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- -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))//通过迭代器访问,并施加随即大小的力。

  • 相关阅读:
    HNOI2017影魔
    CQOI2015任务查询系统
    ZJOI2007报表统计
    python学习之 getattr vs __get__ vs __getattr __ vs __getattribute__ vs __getitem__
    jenkins+supervisor实现django项目的自动部署(ubuntu)
    gunicorn+anaconda+nginx部署django项目(ubuntu)
    uwsgi+anaconda+nginx部署django项目(ubuntu下)
    es过滤集提升权重
    一道Python面试题:给出d = [True, False, True, False, True],请利用列表d,只用一句话返回列表[0,2,4]
    从一道Python面试题说起(大神勿入)
  • 原文地址:https://www.cnblogs.com/ybgame/p/2209579.html
Copyright © 2011-2022 走看看