1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209
|
#include "ExampleApplication.h"
#include <deque>
using namespace std;
class MoveDemoListener : public ExampleFrameListener
{
public:
MoveDemoListener(RenderWindow* win, Camera* cam, SceneNode *sn,
Entity *ent, deque<Vector3> &walk, SceneManager *smgr)
: ExampleFrameListener(win, cam, true, true), mNode(sn), mEntity(ent), mWalkList( walk ),mSceneMgr(smgr)
{
// Set default values for variables
mWalkSpeed = 65.0f;
mDirection = Vector3::ZERO;
//La position de la Frame dans le temps
int TrackPos=0;
//On crée une animation
Animation* anim = mSceneMgr->createAnimation(mNode->getName() +"Move",24);
anim->setInterpolationMode(Ogre::Animation::IM_SPLINE);
NodeAnimationTrack *track = anim->createNodeTrack(0, mNode);
TransformKeyFrame *tframe = track->createNodeKeyFrame(0);
mDestination = Ogre::Vector3(-100.0f, 0.0f, 25.0f);
do
{
tframe->setTranslate(mDestination);
TrackPos+=4;
tframe = track->createNodeKeyFrame(TrackPos);
//rotation
Vector3 src = mNode->getOrientation( ) * Vector3::UNIT_X;
Ogre::Quaternion quat = src.getRotationTo( mDirection );
tframe->setRotation( quat );
} while( nextLocation( ));
mAnimationState = mSceneMgr->createAnimationState(mNode->getName()+"Move");
mAnimationState->setEnabled(true);
mAnimationState->setLoop(false);
} // MoveDemoListener
/* This function is called to start the object moving to the next position
in mWalkList.
*/
bool nextLocation( )
{
if ( mWalkList.empty() )
return false;
mDestination = mWalkList.front( ); // this gets the front of the deque
mWalkList.pop_front( ); // this removes the front of the deque
mDirection = mDestination - mNode->getPosition( );
mDistance = mDirection.normalise( );
return true;
} // nextLocation( )
bool frameStarted(const FrameEvent &evt)
{
if(mAnimationState ->getTimePosition() < mAnimationState ->getLength()) mAnimationState -> addTime(evt.timeSinceLastFrame);
return ExampleFrameListener::frameStarted(evt);
}
protected:
Real mDistance; // The distance the object has left to travel
Vector3 mDirection; // The direction the object is moving
Vector3 mDestination; // The destination the object is moving towards
AnimationState *mAnimationState; // The current animation state of the object
AnimationState *mAnimationWalk; // The current animation state of the object
Entity *mEntity; // The Entity we are animating
SceneNode *mNode; // The SceneNode that the Entity is attached to
std::deque <Vector3> mWalkList; // The list of points we are walking to
Real mWalkSpeed; // The speed at which the object is moving
SceneManager *mSceneMgr;
};
class MoveDemoApplication : public ExampleApplication
{
protected:
public:
MoveDemoApplication()
{
}
~MoveDemoApplication()
{
}
protected:
Entity *mEntity; // The entity of the object we are animating
SceneNode *mNode; // The SceneNode of the object we are moving
std::deque<Vector3> mWalkList; // A deque containing the waypoints
void createScene(void)
{
// Set ambient light
mSceneMgr->setAmbientLight(ColourValue(0.5, 0.5, 0.5));
// Create a main light
Light* l = mSceneMgr->createLight("MainLight");
l->setPosition(-50,180,50);
// Create the entity
mEntity = mSceneMgr->createEntity( "Robot", "ninja.mesh" );
mSceneMgr->setShadowTechnique(SHADOWTYPE_STENCIL_ADDITIVE);
// Create the scene node
mNode = mSceneMgr->getRootSceneNode( )->
createChildSceneNode( "RobotNode", Vector3( 0.0f, 0.0f, 25.0f ) );
mNode->attachObject( mEntity );
// Create the walking list
mWalkList.push_back( Vector3(-50.0f, 0.0f,-100.0f ) );
mWalkList.push_back( Vector3( 200.0f, 0.0f,50.0f ) );
mWalkList.push_back( Vector3( 350.0f, 0.0f, -150.0f ) );
mWalkList.push_back( Vector3( 200.0f, 0.0f,50.0f ) );
mWalkList.push_back( Vector3(-50.0f, 0.0f,-100.0f ) );
mWalkList.push_back( Vector3(-100.0f, 0.0f, 25.0f ) );
// Create objects so we can see movement
Entity *ent;
SceneNode *node;
ent = mSceneMgr->createEntity( "Knot1", "knot.mesh" );
node = mSceneMgr->getRootSceneNode( )->createChildSceneNode( "Knot1Node",
Vector3( -100.0f, 0.0f, 25.0f ) );
node->attachObject( ent );
node->setScale( 0.1f, 0.1f, 0.1f );
ent = mSceneMgr->createEntity( "Knot2", "knot.mesh" );
node = mSceneMgr->getRootSceneNode( )->createChildSceneNode( "Knot2Node",
Vector3( -50.0f, 0.0f,-100.0f ) );
node->attachObject( ent );
node->setScale( 0.1f, 0.1f, 0.1f );
ent = mSceneMgr->createEntity( "Knot3", "knot.mesh" );
node = mSceneMgr->getRootSceneNode( )->createChildSceneNode( "Knot3Node",
Vector3(200.0f, 0.0f,50.0f ) );
node->attachObject( ent );
node->setScale( 0.1f, 0.1f, 0.1f );
ent = mSceneMgr->createEntity( "Knot4", "knot.mesh" );
node = mSceneMgr->getRootSceneNode( )->createChildSceneNode( "Knot4Node",
Vector3( 350.0f, 0.0f, -150.0f ) );
node->attachObject( ent );
node->setScale( 0.1f, 0.1f, 0.1f );
// Set the camera
mCamera->setPosition( 90.0f, 280.0f, 535.0f );
mCamera->pitch( Degree(-20.0f) );
mCamera->yaw( Degree(-7.0f) );
}
void createFrameListener(void)
{
mFrameListener= new MoveDemoListener(mWindow, mCamera, mNode, mEntity, mWalkList, mSceneMgr);
mFrameListener->showDebugOverlay(true);
mRoot->addFrameListener(mFrameListener);
}
};
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
#define WIN32_LEAN_AND_MEAN
#include "windows.h"
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
#else
int main(int argc, char **argv)
#endif
{
// Create application object
MoveDemoApplication app;
try {
app.go();
} catch( Exception& e ) {
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!",
MB_OK | MB_ICONERROR | MB_TASKMODAL);
#else
fprintf(stderr, "An exception has occured: %s\n",
e.getFullDescription().c_str());
#endif
}
return 0;
} |
Partager