用NxOgre创建Body

本文档记录了如何在Ogre框架下利用NxOgre库创建一个3D物理Body的过程,包括设置环境光、创建World和Scene、调整摩擦系数、创建OGRE3DRenderSystem以及Body的细节,如添加力、缩放等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

继上篇之后网上便很少再有关于NxOgre的博客,大多都是安装之类的。现在NxOgre官方网站也进不去,帮助文档和API更是没有。关于如何添加地形还有事先人物与地形的碰撞很是迷惑,只能一点一点的来写。这两天国外网站也上不了了!以下为创建一个Body的一点记录...

首先准备Ogre的框架:

#include "ExampleApplication.h"

class BloodyMessTutorial2Listener : public ExampleFrameListener
{
public:
 BloodyMessTutorial2Listener(RenderWindow *win, Camera *cam)
  : ExampleFrameListener(win, cam)
 {
  mTimeController = TimeController::getSingleton();

 }

 bool frameStarted(const FrameEvent& evt)
 {
  mTimeController->advance(evt.timeSinceLastFrame);
  return ExampleFrameListener::frameStarted(evt);
 }

protected:
 TimeController* mTimeController;

};

class BloodyMessTutorial2 : public ExampleApplication
{
protected:
 
 void createScene()
 {
  
        }

 void createFrameListener()
 {
  mFrameListener = new BloodyMessTutorial2Listener(mWindow, mCamera);
  mRoot->addFrameListener(mFrameListener);
 }
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
#define WIN32_LEAN_AND_MEAN
#include "windows.h"
#endif

#ifdef __cplusplus
extern "C" {
#endif

#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
 INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT)
#else
 int main(int argc, char **argv)
#endif
 {
  // Create application object
  BloodyMessTutorial2 app;

  try {
   app.go();
  } catch(Exception& e) {
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
   MessageBoxA(NULL, e.getFullDescription().c_str(),
    "An exception has occurred!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
#else
   std::cerr << "An exception has occurred: " << e.getFullDescription();
#endif
  }

  return 0;
 }

#ifdef __cplusplus
}
#endif
 

添加头文件:

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

在createScene()方法之中添加:

//设置环境光

mSceneMgr->setAmbientLight(ColourValue(0.5f, 0.5f, 0.5f));

//设置摄像机的位置以及视角

 mCamera->setPosition(0, 20, 80);
 mCamera->lookAt(0, 20, 0);

接下来我们需要声明World和Scene了:

    //在BloodyMessTutorial2类中声明

     NxOgre::World* mWorld;
     NxOgre::Scene* mScene;

然后在createScene()方法之中创建World和Scene:

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

   //定义Scene类型

     NxOgre::SceneDescription sceneDesc;
     sceneDesc.mGravity = NxOgre::Real3(0, -9.8f, 0);//设置重力
     sceneDesc.mName = "BloodyMessTutorial2";

   //创建一个场景,现场可以创建包含实体

      mScene = mWorld->createScene(sceneDesc);

然后通过mScene 设置摩擦系数

   //以下分别为设置静态和动态的摩擦系数,并且设置还原系数

     mScene->getMaterial(0)->setStaticFriction(0.5);
     mScene->getMaterial(0)->setDynamicFriction(0.5);
     mScene->getMaterial(0)->setRestitution(0.1);

现在我们需要使用OGRE3DRenderSystem,在BloodyMessTutorial2类中声明

  OGRE3DRenderSystem* mRenderSystem;

然后在createScene()中定义:

   mRenderSystem = new OGRE3DRenderSystem(mScene);

接下来我们就需要创建Body了,在BloodyMessTutorial2类中声明:
    OGRE3DBody* mCubeTwo;

    然后我们就开始CreatBody。在createScene()中:

      //创建Body

      mCubeTwo = mRenderSystem->createBody(new NxOgre::Box(1, 1, 1),  

      NxOgre::Real3(20, 35, 0), "robot.mesh");

      //添加一个力。
      mCubeTwo->addForce(NxOgre::Real3(-800, -200, 0));

      //缩放
      mCubeTwo->getEntity()->getParentNode()->setScale(0.1,0.1,0.1);

      //创建场景几何

      mScene->createSceneGeometry(new NxOgre::PlaneGeometry(0,

                                                         NxOgre::Real3(0, 1, 0)), Matrix44_Identity);

 

好了一个Body创建完毕了!~运行下看看吧! 

以上函数参数不做详细介绍,你可以在代码中转到定义看看!

如果各位有关于地形的添加方法敬请发表哦!在这里先谢谢咯!~~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值