NxOgre 笔记

NxOgre 笔记


http://blog.youkuaiyun.com/eplaylity/article/details/4726216




1. 去NV官网下载并安装PhysX的SDK。
(好像还要安装PhysX系统软件以便运行时需要,因为我前段时间安装了JX3,就不用了)


2. 设置PhysX SDK头文件及库的搜索路径设置环境变量PHYSX_DIR。
(我的是D:/Program Files/NVIDIA Corporation/NVIDIA PhysX SDK/v2.8.1)


因为要用到头文件搜素路径:
-SDKs/Physics/include
-SDKs/Foundation/include
-SDKs/Cooking/include
-SDKs/PhysXLoader/include


以及链接库搜索路径:
-SDKs/lib/win32
-SDKs/Physics/lib/win32/Release(无效)
-SDKs/Cooking/lib/win32/Release(无效)


3. 下载编译BloodyMess(最新版),或Bleeding(稳定版)


一共三个项目:
NxOgre
GLUTRenderSystem
OGRE3DRenderSystem


NxOgre是核心项目,后面两个是两个渲染系统特例。


1. 单位声明


    NxOgre使用“米-千克-第二 系统”,以米为长度单位,千克为质量单位,秒为时间单位。


2. 初始化代码


2.1 最顶层类World,单实例。最大容纳32个Scene。不同场景之间的物体不能交互。
2.2 每个场景都有很多Actor,这个数目仅受限于你的机器配置。这些Actor在World中表现成一个物理对象,但他们都是不可见的。
    想看到他们,需要使用一个Body,一个简单的Actor,它通过RenderSystem渲染到你的屏幕。
    BloodyMess内建了几个渲染系统,包括OpenGL和Ogre,但这并不是要限制你创建自己的渲染系统。
2.3 NxOgre的另一个重要元素就是TimeController。它控制着World中的Actor所逝去的时间。


2.4 为了使用NxOgre及其指定的Ogre渲染类,头文件及链接库


    #include <NxOgre.h>
    #include <NxOgreOGRE3D.h>


    NxOgre.lib
    NxOgreOGRE3D.lib


2.5 在类的保护区域,声明世界、场景、和渲染系统的变量


    NxOgre::World *mWorld;
    NxOgre::Scene *mScene;
    OGRE3DRenderSystem *mRenderSystem; // 并非属于NxOgre名称空间


2.6 在createScene()函数中初始化世界


    mWorld = NxOgre::World::createWorld();


    // 通过场景描述符,初始化场景
    NxOgre::SceneDescription sceneDesc;
    sceneDesc.mGravity = NxOgre::Vec3(0,-9.8f,0);
    sceneDesc.mName = "BloodyMessTutorial2";


    mScene = mWorld->createScene(sceneDesc);


    // 指定一些应用到整个场景的默认物理量
    mScene->getMaterial(0)->setStaticFriction(0.5); // 静摩擦系数
    mScene->getMaterial(0)->setDynamicFriction(0.5); // 动摩擦系数
    mScene->getMaterial(0)->setRestitution(0.1); // 恢复系数


    mRenderSystem = new OGRE3DRenderSystem(mScene);


    // 添加物体,外形为1x1x1的盒子,位置是Y正方向上20米
    OGRE3DBody *mCube;
    
    mCube = mRenderSystem->createBody(new NxOgre::Box(1,1,1),NxOgre::Vec3(0,20,0),"cube.1m.mesh");


2.7 获取运动需要每一帧都在FrameListener中advance我们的TimeController。


    NxOgre::TimeController::getSingleton()->advance(evt.timeSinceLastFrame);


2.8 物理交互作用


    OGRE3DBody *mCubeTwo;


    mCubeTwo = mRenderSystem->createBody(new NxOgre::Box(1,1,1),NxOgre::Vec3(20,35,0),"cube.1m.mesh");
    mCubeTwo->addForce(NxOgre::Vec3(-800,-200,0));


    // 创建一个地面平面,这是一个actor,有无限尺寸,不能被移动
    mScene->createSceneGeometry(new NxOgre::PlaneGeometry(0,NxOgre::Vec3(0,1,0)),Matrix44_Identity);


    // 创建一个OGRE渲染的可见平面,因为NxOgre中的actor是不可见的
    MovablePlane *plane = new MovablePlane("Plane");
    plane->d = 0;
    plane->normal = Vector3::UNIT_Y;
    MeshManager::getSingleton().createPlane("PlaneMesh",ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
        *plane,120,120,1,1,true,1,3,3,Vector3::UNIT_Z);
    Entity *planeEnt = mSceneMgr->creatEntity("PlaneEntity","PlaneMesh");
    planeEnt->setMaterialName("Examples/Rockwall");


    SceneNode *mPlaneNode = mSceneMgr->getRootScenNode()->createChildSceneNode();
    mPlaneNode->attachObject(planeEnt);
    mPlaneNode->scale(100,100,100);


 


教程原文


http://www.ogre3d.org/wiki/index.php/BloodyMess_Tutorial_2




1. 一个全局的VisualDebugger实例,以RenderableType_VisualDebugger创建一个可渲染对象。
   将此渲染对象绑定到一个SceneNode上,然后,每一帧VisualDebugger::draw()/SceneNode::needUpdate()
   这个好像在OGRE3DRenderSystem的advance()里有封装。


2. SceneNode继承了Node的needUpdate()来标识这个节点及其父节点的状态更新。


3. 实现步骤


    // 创建OGRE3DRenderable对象
    new OGRE3DRenderable(NxOgre::Enums::RenderableType_VisualDebugger);


    // 为可视化调试器设置可渲染对象,并将可渲染对象绑定到场景节点
    NxOgre::VisualDebugger::setRenderable();
    SceneNode::attachObject();


    // 设置可视化调试器的可视化模式
    VisualDebugger::setVisualisationMode(NxOgre::Enums::VisualDebugger_ShowAll);


 


 


教程原文


http://www.ogre3d.org/wiki/index.php/BloodyMess_Tutorial_3




1. Volume是一个任意形状的不可见的物理对象。并且不能动。常被用作trigger。
   当一个物理对象进入/没入/离开它时,会触发一个程序指定的动作。


2. 在场景中创建一个Volume步骤


    2.1 外形,比如,一个5x5x5的盒子
    2.2 位置
    2.3 一个Callback类的对象
    2.4 回调行为(事件发生时调用onVolumeEvent())


    NxOgre::Scene::createVolume(new NxOgre::Box(5),
        NxOgre::Matrix44(NxOgre::Vec3(0,0,0)),
        this,NxOgre::Enums::VolumeCollisionType_All);


3. 创建当一个Actor触发的回调函数


void onVolumeEvent(NxOgre::Volume* volume, NxOgre::Shape* volumeShape, NxOgre::RigidBody* rigidBody,
                            NxOgre::Shape* rigidBodyShape, unsigned int collisionEvent)
{
    if(collisionEvent == NxOgre::Enums::VolumeCollisionType_OnEnter)
    {
        NxOgre::Actor* actor = static_cast<NxOgre::Actor*>(rigidBody);
        float y =   (9.81 * actor->getMass())                  // 抵消重力
            + (-actor->getLinearVelocity().y * actor->getMass())      // 抵消竖直速度
            + (10 - actor->getGlobalPosition().y * actor->getMass()); // 添加一些向上移动的力


        actor->addForce(NxOgre::Vec3(0, y, 0), NxOgre::Enums::ForceMode_Impulse); 
    }
}


 


教程原文 
http://www.ogre3d.org/wiki/index.php/BloodyMess_Tutorial_4




1. Kinematics是些特殊的物理对象,它可以影响别的物体,却却不受别的物体影响。
   他们可见、可移动,是升降机的一种最佳实现。


2. NxOgre中,Actor只是一个物理对象的物理表达,是不可见的。
   然而,一个Body是一个Actor加上一个可视化的东西(比如,通过Ogre的Entity).
   KinematicActor与KinematicBody也是同样的关系。


3. 移动、设置KinematicBody的位置


    KinematicBody::moveGlobalPosition(NxOgre::Vec3&);
    KinematicBody::setGlobalPosition(NxOgre::Vec3&);


 


教程原文


http://www.ogre3d.org/wiki/index.php/BloodyMess_Tutorial_5




1. 凸面体与三角网格
   三角网格可以很完美地表现一个OGRE模型的物理外形。
   OGRE模型和Flour所生成的三角网格就外形而言完全等同,
   为了性能起见,一般使用凸面体做物理碰撞。
   NxOgre中凸面体最多256个顶点,作为一个大包装盒把要进行碰撞检测的对象包围起来。


2. Flour是一个可以把OGRE模型转换成NxOgre格式的小工具。
   包括,特殊的mesh、skeleton和heightfield。


3. 使用Flour生成.nxs文件


    flour convert in:Stairs.mesh, into:triangle, out:Stairs.nxs
    flour convert in:Barrel.mesh, into:convex, out:Barrel.nxs


4. BloodyMess使用自己的资源系统来处理所有类型的文档:文件夹、zip压缩文档、URL。


    NxOgre::ResourceSystem::getSingleton()->openArchive("media","file:media");
    NxOgre::ResourceSystem::getSingleton()->openArchive("media","file:D:/Projects/BloodyMess Tutorials/media");
    (注意:文件路径可以使用相对或绝对路径,"/" 也可以用 "//"替换)


5. 使用资源系统加载模型


    NxOgre::Mesh* convexMesh = NxOgre::MeshManager::getSingleton()->load("media:Barrel.nxs");
    NxOgre::Mesh* triangleMesh = NxOgre::MesnManager::getSingleton()->load("media::Stairs.nxs");


6. 使用已加载的模型,创建凸面体和三角几何


    NxOgre::Convex* convex = new NxOgre::Convex(convexMesh);
    NxOgre::TriangleGeometry* triangleGeometry = new NxOgre::TriangleGeometry(triangleMesh);


7. 将模型加入到场景


    // 使用Convex作为外形,创建一个OGRE3DBody。
    OGRE3DBody* convexBody = mRenderSystem->createBody(convex,NxOgre::Vec3(0,30,0),"Barrel.mesh");
    convexBody->setGlobalOrientation(NxOgre::Matrix33(NxOgre::Vec4(0,45,0,45)));


    // 通过TriangleGeometry,创建场景几何。
    mScene->createSceneGeometry(triangleGeometry,NxOgre::Matrix44(NxOgre::Vec3(0,5,0)));
    // 通过Entity,可视化创建的场景几何。
    Ogre::Entity *triangleEntity = mSceneMgr->createEntity("trianlgeEntity","Stairs.mesh");
    Ogre::SceneNode* triangleNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
    triangleNode->attachObject(triangleEntity);
    triangleNode->setPosition(Vector3(0,5,0));


 


教程原文


http://www.ogre3d.org/wiki/index.php/BloodyMess_Tutorial_7
内容概要:本文深入探讨了Kotlin语言在函数式编程和跨平台开发方面的特性和优势,结合详细的代码案例,展示了Kotlin的核心技巧和应用场景。文章首先介绍了高阶函数和Lambda表达式的使用,解释了它们如何简化集合操作和回调函数处理。接着,详细讲解了Kotlin Multiplatform(KMP)的实现方式,包括共享模块的创建和平台特定模块的配置,展示了如何通过共享业务逻辑代码提高开发效率。最后,文章总结了Kotlin在Android开发、跨平台移动开发、后端开发和Web开发中的应用场景,并展望了其未来发展趋势,指出Kotlin将继续在函数式编程和跨平台开发领域不断完善和发展。; 适合人群:对函数式编程和跨平台开发感兴趣的开发者,尤其是有一定编程基础的Kotlin初学者和中级开发者。; 使用场景及目标:①理解Kotlin中高阶函数和Lambda表达式的使用方法及其在实际开发中的应用场景;②掌握Kotlin Multiplatform的实现方式,能够在多个平台上共享业务逻辑代码,提高开发效率;③了解Kotlin在不同开发领域的应用场景,为选择合适的技术栈提供参考。; 其他说明:本文不仅提供了理论知识,还结合了大量代码案例,帮助读者更好地理解和实践Kotlin的函数式编程特性和跨平台开发能力。建议读者在学习过程中动手实践代码案例,以加深理解和掌握。
内容概要:本文深入探讨了利用历史速度命令(HVC)增强仿射编队机动控制性能的方法。论文提出了HVC在仿射编队控制中的潜在价值,通过全面评估HVC对系统的影响,提出了易于测试的稳定性条件,并给出了延迟参数与跟踪误差关系的显式不等式。研究为两轮差动机器人(TWDRs)群提供了系统的协调编队机动控制方案,并通过9台TWDRs的仿真和实验验证了稳定性和综合性能改进。此外,文中还提供了详细的Python代码实现,涵盖仿射编队控制类、HVC增强、稳定性条件检查以及仿真实验。代码不仅实现了论文的核心思想,还扩展了邻居历史信息利用、动态拓扑优化和自适应控制等性能提升策略,更全面地反映了群体智能协作和性能优化思想。 适用人群:具备一定编程基础,对群体智能、机器人编队控制、时滞系统稳定性分析感兴趣的科研人员和工程师。 使用场景及目标:①理解HVC在仿射编队控制中的应用及其对系统性能的提升;②掌握仿射编队控制的具体实现方法,包括控制器设计、稳定性分析和仿真实验;③学习如何通过引入历史信息(如HVC)来优化群体智能系统的性能;④探索中性型时滞系统的稳定性条件及其在实际系统中的应用。 其他说明:此资源不仅提供了理论分析,还包括完整的Python代码实现,帮助读者从理论到实践全面掌握仿射编队控制技术。代码结构清晰,涵盖了从初始化配置、控制律设计到性能评估的各个环节,并提供了丰富的可视化工具,便于理解和分析系统性能。通过阅读和实践,读者可以深入了解HVC增强仿射编队控制的工作原理及其实际应用效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值