ogre 广告牌的创建与彩带的绑定跟踪 -- 源码中文注解

来源:互联网 发布:java队列 编辑:程序博客网 时间:2024/04/28 22:29

Lighting.h

#include "ExampleApplication.h"

/** This class turns lights& billboards linked to them on & off */

//这个类是初始化灯光和广告版的值,比如颜色

class LightFlasher : publicControllerValue<Real>

{

protected:

    Light* mLight;//类--动态光源在现场

    Billboard* mBillboard;//类- 一个是一种原始的广告牌,每一帧总是面临着照相机

    ColourValue mMaxColour;//类---代表颜色类,四个参数,是红绿蓝.0到.0,参是.0到.0从完全透明到完全全不透明

    Real intensity;//float浮点值

public:

    LightFlasher(Light*light,Billboard*billboard,ColourValuemaxColour)

    {

       mLight = light;

       mBillboard = billboard;

       mMaxColour = maxColour;

    }

 

    virtual Real  getValue (void)const

    {

       return intensity;

    }

 

    virtual void  setValue (Realvalue)

    {

       intensity = value;

 

       ColourValue newColour;

 

       // Attenuate the brightness of the light

       newColour.r =mMaxColour.r *intensity;

       newColour.g =mMaxColour.g *intensity;

       newColour.b =mMaxColour.b *intensity;

 

       mLight->setDiffuseColour(newColour);//设置灯光的颜色

       mBillboard->setColour(newColour);//设置广告版的颜色

    }

};

 

 

/** Controller functionmapping waveform to light intensity */

//这个类是控制器功能映射波形,光照强度

class LightFlasherControllerFunction : public WaveformControllerFunction

{

    /*ControllerFunctionRealPtr控制器功能类的构造参数是ControllerFunction类的指针,但是WaveformControllerFunction这个类又是ControllerFunction的子类,so

    WaveformControllerFunction 这个类的指针 是闪光控制器类的参数,这个类有的变量--::::

默认时(WaveformTypewType, Real base = 0, Real frequency = 1, Real phase = 0, Real amplitude = 1,bool deltaInput = true, Real dutyCycle = 0.5);

    WaveformType mWaveType;  波类型——形状的波形

    Real mBase;              基础——基值的输出从波

    Real mFrequency;     频率-波的速度每秒

    Real mPhase;         阶段——的偏移量开始的波,例如.5开始到一半时波

    Real mAmplitude;     振幅-尺度输出,而不是躺在[0,1]它躺在[0,1]*振幅

    Real mDutyCycle;     责任周期——活跃的宽度的脉宽调制信号

    */

public://此类自己定义的类只需传参波形,参频率,参开始的波值--以后可以添加自己想改的参数,把后面类的参数一起改就可以啦

    LightFlasherControllerFunction(WaveformTypewavetype,Realfrequency,Realphase):WaveformControllerFunction(wavetype, 0,frequency,phase, 1,true)

    {

 

    }

};

 

 

// Some global nodedata  一些全局节点数据

SceneNode*mRedYellowLightsNode;

SceneNode*mGreenBlueLightsNode;

std::vector<AnimationState*>mAnimStateList;

//使用他的类可以容纳这个类的实例来存储任何动画的状态.他们其

 

 

 

// Listener class for frameupdates   侦听器类帧更新

class LightingListener : publicExampleFrameListener

{

protected:

public:

   LightingListener(RenderWindow*win,Camera*cam)

       : ExampleFrameListener(win,cam)

   {

   }

 

   bool frameRenderingQueued(const FrameEvent&evt)

   {

    if( ExampleFrameListener::frameRenderingQueued(evt)==false )

       return false;

 

       std::vector<AnimationState*>::iteratoranimi;

       for (animi =mAnimStateList.begin();animi !=mAnimStateList.end(); ++animi)

       {//修改时间的位置,调整为动画长度,这个方法循环的边缘的如果动画循环是启用的。

           (*animi)->addTime(evt.timeSinceLastFrame);//timeSinceLastEvent

       }

       return true;

   }

};

 

/** Application class */

class LightingApplication : publicExampleApplication

{

protected:

 

    // The set of all the billboards used for the lights

   // 2 sets because we'll rotate themdifferently

    BillboardSet* mRedYellowLights;//广告牌集合类

    BillboardSet* mGreenBlueLights;

 

    // Billboards---广告牌--也是类

    Billboard* mRedLightBoard;

    Billboard* mBlueLightBoard;

    Billboard* mYellowLightBoard;

    Billboard* mGreenLightBoard;

 

    // Lights--灯光 类

    Light* mRedLight;

    Light* mBlueLight;

    Light* mYellowLight;

    Light* mGreenLight;

 

 

    // Light flashers  光 闪光器

    ControllerValueRealPtr mRedLightFlasher;

    ControllerValueRealPtr mBlueLightFlasher;

    ControllerValueRealPtr mYellowLightFlasher;

    ControllerValueRealPtr mGreenLightFlasher;

 

    // Light controller functions  光源控制器功能

    ControllerFunctionRealPtr mRedLightControllerFunc;

    ControllerFunctionRealPtr mBlueLightControllerFunc;

    ControllerFunctionRealPtr mYellowLightControllerFunc;

    ControllerFunctionRealPtr mGreenLightControllerFunc;

 

    // Light controllers  光源控制器

    Controller<Real>*mRedLightController;

    Controller<Real>*mBlueLightController;

    Controller<Real>*mYellowLightController;

    Controller<Real>*mGreenLightController;

 

 

    void createScene(void)

   {

       // Set a very low level of ambient lighting

       mSceneMgr->setAmbientLight(ColourValue(0.1, 0.1, 0.1));

 

       // Use the "Space" skybox

       mSceneMgr->setSkyBox(true,"Examples/SpaceSkyBox");

 

        // Load ogre head

       Entity* head = mSceneMgr->createEntity("head","ogrehead.mesh");

 

       // Attach the head to the scene

        mSceneMgr->getRootSceneNode()->createChildSceneNode(Vector3(0,0,-50))->attachObject(head);

 

       //从此到setupTrailLights();这个函数之前的都可以注释掉

        // Create nodesfor the lights to be rotated with 创建节点的灯光与旋转

       mRedYellowLightsNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();//给全局节点指针赋值

       mGreenBlueLightsNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();

 

 

       // First create the BillboardSets. This willdefine the materials for the billboards

       // in its set to use

       //首先创建BillboardSets广告牌集合。这将定义材料在其设置为使用的广告牌

       mRedYellowLights = mSceneMgr->createBillboardSet("RedYellowLights");//创建

       mRedYellowLights->setMaterialName("Examples/Flare");//设置材质

       mRedYellowLightsNode->attachObject(mRedYellowLights);//全局节点指针绑定广告牌集合

 

       mGreenBlueLights = mSceneMgr->createBillboardSet("GreenBlueLights");

       mGreenBlueLights->setMaterialName("Examples/Flare");

       mGreenBlueLightsNode->attachObject(mGreenBlueLights);

 

       // Red light billboard, in "off" state --红灯广告牌,关闭状态

       Vector3 redLightPosition(78,-8, -70);

       mRedLightBoard = mRedYellowLights->createBillboard(redLightPosition);

       mRedLightBoard->setColour(ColourValue::Black);

       // Blue light billboard, in "off" state--蓝色的光广告牌,关闭状态

       Vector3 blueLightPosition(-90,-8, -70);

       mBlueLightBoard = mGreenBlueLights->createBillboard(blueLightPosition);

       mBlueLightBoard->setColour(ColourValue::Black);

       // Yellow light billboard, in "off" state--黄色的光广告牌,关闭状态

       Vector3 yellowLightPosition(-4.5,30, -80);

       mYellowLightBoard = mRedYellowLights->createBillboard(yellowLightPosition);

       mYellowLightBoard->setColour(ColourValue::Black);

       // Green light billboard, in "off" state--绿色的光广告牌,关闭状态

       Vector3 greenLightPosition(50,70, 80);

       mGreenLightBoard = mGreenBlueLights->createBillboard(greenLightPosition);

       mGreenLightBoard->setColour(ColourValue::Black);

 

       // Red light, in "off" state

       mRedLight = mSceneMgr->createLight("RedFlyingLight");//光源的名字

       mRedLight->setType(Light::LT_POINT);//点光源

       mRedLight->setPosition(redLightPosition);//设置光源的位置

       mRedLight->setDiffuseColour(ColourValue::Black);//设置光源的颜色

       mRedYellowLightsNode->attachObject(mRedLight);//全局节点指针 绑定光源

 

       // Blue light, in "off" state

       mBlueLight = mSceneMgr->createLight("BlueFlyingLight");

       mBlueLight->setType(Light::LT_POINT);

       mBlueLight->setPosition(blueLightPosition);

       mBlueLight->setDiffuseColour(ColourValue::Black);

       mGreenBlueLightsNode->attachObject(mBlueLight);

 

       // Yellow light in "off" state

       mYellowLight = mSceneMgr->createLight("YellowFlyingLight");

       mYellowLight->setType(Light::LT_POINT);

       mYellowLight->setPosition(yellowLightPosition);

       mYellowLight->setDiffuseColour(ColourValue::Black);

       mRedYellowLightsNode->attachObject(mYellowLight);

 

       // Yellow light in "off" state

       mGreenLight = mSceneMgr->createLight("GreenFlyingLight");

       mGreenLight->setType(Light::LT_POINT);

       mGreenLight->setPosition(greenLightPosition);

       mGreenLight->setDiffuseColour(ColourValue::Black);

       mGreenBlueLightsNode->attachObject(mGreenLight);

 

       // Light flashers  创建闪光器,构造函数的参数灯光类的指针,参数是广告牌类的指针,参数是颜色。

       mRedLightFlasher = ControllerValueRealPtr(

            newLightFlasher(mRedLight,mRedLightBoard,ColourValue::Red));

       mBlueLightFlasher = ControllerValueRealPtr(

            newLightFlasher(mBlueLight,mBlueLightBoard,ColourValue::Blue));

       mYellowLightFlasher = ControllerValueRealPtr(

            newLightFlasher(mYellowLight,mYellowLightBoard,ColourValue(1.0,1.0, 0.0)));

       mGreenLightFlasher = ControllerValueRealPtr(

            newLightFlasher(mGreenLight,mGreenLightBoard,ColourValue::Green));

 

       // Light controller functions   创建光源控制器功能 也是一个类,参数是波形,参频率,参开始的波值-

       mRedLightControllerFunc =ControllerFunctionRealPtr(

           new LightFlasherControllerFunction(Ogre::WFT_SINE,0.5, 0.0));//红 WFT_SINE是标准正弦波顺利的从低到高的变化然后再返回。

       mBlueLightControllerFunc =ControllerFunctionRealPtr(

            newLightFlasherControllerFunction(Ogre::WFT_TRIANGLE,1,0.5));//绿WFT_TRIANGLE尖尖的山峰

       mYellowLightControllerFunc =ControllerFunctionRealPtr(

            newLightFlasherControllerFunction(Ogre::WFT_SQUARE,0.25, 0.0));//黄 WFT_SQUARE 是一半时间最小,一半时间最大

       mGreenLightControllerFunc =ControllerFunctionRealPtr(

            newLightFlasherControllerFunction(Ogre::WFT_INVERSE_SAWTOOTH,0.25, 0.5));//蓝 WFT_INVERSE_SAWTOOTH 是稳定渐渐增大,瞬间结束

                                                     //还有一种是WFT_PWM是脉冲宽度调制 有责任周期为%(0.5)能产生相同的输出,WFT_SQUARE。

 

       // Light controllers //光源控制器

       //  ControllerManager类来管理控制器实例,

       //这类负责监视所有的控制器实例注册

       //当请求和更新它们。它还提供了一些便利的方法

       //用于创建常用的控制器(如纹理动画师)。

       ControllerManagermControllerManager = &ControllerManager::getSingleton();//获得管理控制器

       //光源控制器mRedLightController = 管理控制器-> 创建一个新的控制器和注册它跟经理。(参子控制器,参闪光器,参光源控制器功能)

       mRedLightController = mControllerManager->createController(mControllerManager->getFrameTimeSource(),mRedLightFlasher,mRedLightControllerFunc);

       mBlueLightController = mControllerManager->createController(mControllerManager->getFrameTimeSource(),mBlueLightFlasher,mBlueLightControllerFunc);

       mYellowLightController =mControllerManager->createController(mControllerManager->getFrameTimeSource(),mYellowLightFlasher,mYellowLightControllerFunc);

       mGreenLightController =mControllerManager->createController(mControllerManager->getFrameTimeSource(),mGreenLightFlasher,mGreenLightControllerFunc);

 

 

       setupTrailLights();//自己写的函数,设置追中光源

 

   }

 

    void setupTrailLights(void)

    {

 

 

       //String str("abc");

       //char *p=str.data();

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

       //创建一个无限远的光源

       Vector3 dir(-1,-1, 0.5);

       dir.normalise();//单位化

       Light* l = mSceneMgr->createLight("light1");

       l->setType(Light::LT_DIRECTIONAL);//遥远的来源,因此有方向而没有位置

       l->setDirection(dir);//设置方向

 

       NameValuePairList pairList;//模板,两个参数都是String类,参数的名称/值对(第一=名称,第二=值)

       pairList["numberOfChains"]="2";

       pairList["maxElements"]="80";

 

       //RibbonTrail这个类的实例将关注一个或多个节点实例和自动生成一个落后于他们移动---追踪类

       //因为这类可以监视多个模式,它生成自己的几何中

       //  世界空间,因此,即使它需要被附加到一个SceneNode

       //  可见,改变节点的位置被附加的场景

       //  没有区别的几何呈现。

       RibbonTrail* trail= static_cast<RibbonTrail*>(

           mSceneMgr->createMovableObject("1","RibbonTrail",&pairList));//createMovableObject创建一个可移动的对象

       trail->setMaterialName("Examples/LightRibbonTrail");//添加材质

       trail->setTrailLength(400);//设置世界单位里的追中

       mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(trail);//绑定

 

       // Create 3 nodes for trail to follow 创建节点为追踪类-跟随

       SceneNode* animNode= mSceneMgr->getRootSceneNode()->createChildSceneNode();

       animNode->setPosition(50,30,0);

       Animation* anim= mSceneMgr->createAnimation("an1", 14);//创建动画类序列(参动画名字,参动画长度)

       anim->setInterpolationMode(Animation::IM_SPLINE);//设置值的变化方式,IM_LINEAR值沿直线插补, IM_LINEAR 值是沿着样条插值,导致平滑方向上的变化

       NodeAnimationTrack* track= anim->createNodeTrack(1,animNode);//动画创建一个专门处理节点转换的类--参是轨迹独一无二的,参是将要受影响的节点

       TransformKeyFrame* kf= track->createNodeKeyFrame(0);//创建一个新的关键帧并将其添加到该动画在给定时间指数,参数第一次为,访问时用getKeyFrame();

       kf->setTranslate(Vector3(50,30,0));//翻译与此相关的关键帧。

       kf = track->createNodeKeyFrame(2);//创建帧

       kf->setTranslate(Vector3(100, -30, 0));

       kf = track->createNodeKeyFrame(4);

       kf->setTranslate(Vector3(120, -100, 150));

       kf = track->createNodeKeyFrame(6);

       kf->setTranslate(Vector3(30, -100, 50));

       kf = track->createNodeKeyFrame(8);

       kf->setTranslate(Vector3(-50, 30, -50));

       kf = track->createNodeKeyFrame(10);

       kf->setTranslate(Vector3(-150, -20, -100));

       kf = track->createNodeKeyFrame(12);

       kf->setTranslate(Vector3(-50, -30, 0));

       kf = track->createNodeKeyFrame(14);

       kf->setTranslate(Vector3(50,30,0));

 

       AnimationState* animState= mSceneMgr->createAnimationState("an1");//创建一个类,存储动画状态的类

       animState->setEnabled(true);//是否启用了这个动画集

       mAnimStateList.push_back(animState);//将动画集存入动画集模板

 

       trail->setInitialColour(0,1.0, 0.8, 0); //设置起始丝带色彩,参连锁的索引,参-4初始颜色的值,参透明度默认,

       trail->setColourChange(0,0.5, 0.5, 0.5, 0.5);//允许/禁止使用色彩褪色小径。参是否允许,

       trail->setInitialWidth(0,5);//设置丝带宽度开始在世界单位里,参连锁的索引,参宽度最初的宽度的丝带

       trail->addNode(animNode);//绑定节点跟踪类

 

       // Add light

       Light* l2 = mSceneMgr->createLight("l2");

       l2->setDiffuseColour(trail->getInitialColour(0));//设置光源的颜色,trail->getInitialColour(0)是获得起始丝带的颜色

       animNode->attachObject(l2);//绑定光源

 

       // Add billboard  //添加广告牌集合类

       BillboardSet* bbs= mSceneMgr->createBillboardSet("bb", 1);//创建广告牌集合类

       bbs->createBillboard(Vector3::ZERO,trail->getInitialColour(0));//创建一个新的广告牌,并把它添加到这个集合中,参广告牌的位置,参是颜色,trail->getInitialColour(0)是获得起始丝带的颜色

       bbs->setMaterialName("Examples/Flare");//添加材质

       animNode->attachObject(bbs);//绑定广告牌

 

       //以下是创建第二个彩带,以及绑定跟踪

       animNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();

       animNode->setPosition(-50,100,0);

       anim = mSceneMgr->createAnimation("an2",10);

       anim->setInterpolationMode(Animation::IM_SPLINE);

       track = anim->createNodeTrack(1, animNode);

       kf = track->createNodeKeyFrame(0);

       kf->setTranslate(Vector3(-50,100,0));

       kf = track->createNodeKeyFrame(2);

       kf->setTranslate(Vector3(-100, 150, -30));

       kf = track->createNodeKeyFrame(4);

       kf->setTranslate(Vector3(-200, 0, 40));

       kf = track->createNodeKeyFrame(6);

       kf->setTranslate(Vector3(0, -150, 70));

       kf = track->createNodeKeyFrame(8);

       kf->setTranslate(Vector3(50, 0, 30));

       kf = track->createNodeKeyFrame(10);

       kf->setTranslate(Vector3(-50,100,0));

 

       animState = mSceneMgr->createAnimationState("an2");

       animState->setEnabled(true);

       mAnimStateList.push_back(animState);

 

       trail->setInitialColour(1,0.0, 1.0, 0.4);

       trail->setColourChange(1,0.5, 0.5, 0.5, 0.5);

       trail->setInitialWidth(1,5);

       trail->addNode(animNode);

 

 

       // Add light

       l2 = mSceneMgr->createLight("l3");

       l2->setDiffuseColour(trail->getInitialColour(1));

       animNode->attachObject(l2);

 

       // Add billboard

       bbs = mSceneMgr->createBillboardSet("bb2",1);

       bbs->createBillboard(Vector3::ZERO,trail->getInitialColour(1));

       bbs->setMaterialName("Examples/Flare");

       animNode->attachObject(bbs);

    }

 

    void createFrameListener(void)

   {

       // This is where we instantiate our own frame listener

       mFrameListener= new LightingListener(mWindow,mCamera);

       mRoot->addFrameListener(mFrameListener);

   }

};

 

 

 

 

 

/*

------------------------------------------------------------------------

*/

Lighting.cpp

 

#include "Lighting.h"

 

#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(HINSTANCEhInst,HINSTANCE,LPSTRstrCmdLine,INT)

#else

int main(int argc, char**argv)

#endif

{

   // Create application object

   LightingApplication app;

 

   try {

       app.go();

   } catch( Ogre::Exception& e) {

#if OGRE_PLATFORM ==OGRE_PLATFORM_WIN32

       MessageBox( NULL,e.getFullDescription().c_str(),"Anexception has occured!",MB_OK |MB_ICONERROR |MB_TASKMODAL);

#else

        std::cerr << "An exceptionhas occured: " << e.getFullDescription();

#endif

   }

 

   return 0;

}

 

#ifdef __cplusplus

}

#endif