ogre的Demo_CameraTrack例子程序的问题
2010-04-22 19:19
399 查看
我的程序里面想实现摄像机自动跟踪的要求,
然后去看了Demo_CameraTrack这个例子程序,
去发现camera的转动不对。
原来是要对绑定camera的节点进行操作,
而不是对camera操作,所以我重载了ExampleFrameListener等类。
下面是我的代码,
基本上都是ogre最简单的代码,相信大家可以看明白。
#include "ExampleApplication.h"
#include <CEGUI/CEGUI.h>
#include <OIS/OIS.h>
#include <OgreCEGUIRenderer.h>
AnimationState* mAnimState;
class DemoListener : public ExampleFrameListener, public OIS::MouseListener, public OIS::KeyListener
{
public:
DemoListener(RenderWindow* win, Camera* cam, SceneNode *node)
: ExampleFrameListener(win, cam, true, true)
{
mNode=node;
mContinue=true;
mRotate = 0.13;
mMove = 250;
mDirection = Vector3::ZERO;
mMouse->setEventCallback(this);
mKeyboard->setEventCallback(this);
}
bool frameStarted(const FrameEvent &evt)
{
mKeyboard->capture();
mMouse->capture();
mNode->translate(mDirection*evt.timeSinceLastFrame,Node::TS_LOCAL);//对相机节点进行操作
mAnimState->addTime(evt.timeSinceLastFrame);
return mContinue;
}
bool mouseMoved(const OIS::MouseEvent &arg)
{
if (arg.state.buttonDown(OIS::MB_Right))
{
mNode->yaw( Degree(mRotate*arg.state.X.rel), Node::TS_WORLD);
}
return true;
}
bool mousePressed(const OIS::MouseEvent &arg, OIS::MouseButtonID id)
{
return true;
}
bool mouseReleased(const OIS::MouseEvent &arg, OIS::MouseButtonID id)
{
return true;
}
bool keyPressed(const OIS::KeyEvent &arg)
{
switch(arg.key)
{
case OIS::KC_ESCAPE:
mContinue = false;
break;
case OIS::KC_UP:
case OIS::KC_W:
mDirection.z -= mMove;
break;
case OIS::KC_DOWN:
case OIS::KC_S:
mDirection.z += mMove;
break;
case OIS::KC_LEFT:
case OIS::KC_A:
mDirection.x -= mMove;
break;
case OIS::KC_RIGHT:
case OIS::KC_D:
mDirection.x += mMove;
break;
case OIS::KC_PGDOWN:
case OIS::KC_E:
mDirection.y -= mMove;
break;
case OIS::KC_PGUP:
case OIS::KC_Q:
mDirection.y += mMove;
break;
}
return true;
}
bool keyReleased(const OIS::KeyEvent &arg)
{
switch(arg.key)
{
case OIS::KC_UP:
case OIS::KC_W:
mDirection.z += mMove;
break;
case OIS::KC_DOWN:
case OIS::KC_S:
mDirection.z -= mMove;
break;
case OIS::KC_LEFT:
case OIS::KC_A:
mDirection.x += mMove;
break;
case OIS::KC_RIGHT:
case OIS::KC_D:
mDirection.x -= mMove;
break;
case OIS::KC_PGDOWN:
case OIS::KC_E:
mDirection.y += mMove;
break;
case OIS::KC_PGUP:
case OIS::KC_Q:
mDirection.y -= mMove;
break;
}
return true;
}
protected:
Real mRotate; //旋转常量
Real mMove; //移动常量
SceneNode *mNode; //当前物体所附在的场景结点
Vector3 mDirection; //指向正确的移动方向
bool mContinue;
};
class DemoApplication : public ExampleApplication
{
public:
DemoApplication()
{
}
~DemoApplication()
{
}
protected:
SceneNode* mNode; //当前物体所附在的场景结点
void createCamera()
{
mCamera = mSceneMgr->createCamera("Cam");
}
void createScene(void)
{
// Set ambient light
mSceneMgr->setAmbientLight(ColourValue(0.2, 0.2, 0.2));
// Create a skydome
mSceneMgr->setSkyDome(true, "Examples/CloudySky", 5, 8);
// Create a light
Light* l = mSceneMgr->createLight("MainLight");
// Accept default settings: point light, white diffuse, just set position
// NB I could attach the light to a SceneNode if I wanted it to move automatically with
// other objects, but I don't
l->setPosition(20,80,50);
Entity *ent;
// Define a floor plane mesh
Plane p;
p.normal = Vector3::UNIT_Y;
p.d = 200;
MeshManager::getSingleton().createPlane(
"FloorPlane", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
p, 200000, 200000, 20, 20, true, 1, 50, 50, Vector3::UNIT_Z);
// Create an entity (the floor)
ent = mSceneMgr->createEntity("floor", "FloorPlane");
ent->setMaterialName("Examples/RustySteel");
// Attach to child of root node, better for culling (otherwise bounds are the combination of the 2)
mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);
// Add a head, give it it's own node
SceneNode* headNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
ent = mSceneMgr->createEntity("head", "ogrehead.mesh");
headNode->attachObject(ent);
// Make sure the camera track this node
mCamera->setAutoTracking(true, headNode);
// Create the camera node & attach camera
mNode = mSceneMgr->getRootSceneNode()->createChildSceneNode(Vector3(0, 0, 0));
mNode->attachObject(mCamera);
// set up spline animation of node
Animation* anim = mSceneMgr->createAnimation("CameraTrack", 10);
// Spline it for nice curves
anim->setInterpolationMode(Animation::IM_SPLINE);
// Create a track to animate the camera's node
NodeAnimationTrack* track = anim->createNodeTrack(0, mNode);
// Setup keyframes
TransformKeyFrame* key = track->createNodeKeyFrame(0); // startposition
key = track->createNodeKeyFrame(2.5);
key->setTranslate(Vector3(0,0,-400));
key = track->createNodeKeyFrame(5);
key->setTranslate(Vector3(-400,0,0));
key = track->createNodeKeyFrame(7.5);
key->setTranslate(Vector3(0,0,400));
key = track->createNodeKeyFrame(10);
key->setTranslate(Vector3(400,0,0));
// Create a new animation state to track this
mAnimState = mSceneMgr->createAnimationState("CameraTrack");
mAnimState->setEnabled(true);
}
void createFrameListener(void)
{
mFrameListener= new DemoListener(mWindow, mCamera, mNode);
mFrameListener->showDebugOverlay(false);
mRoot->addFrameListener(mFrameListener);
}
};
呵呵,这样就ok了。
然后去看了Demo_CameraTrack这个例子程序,
去发现camera的转动不对。
原来是要对绑定camera的节点进行操作,
而不是对camera操作,所以我重载了ExampleFrameListener等类。
下面是我的代码,
基本上都是ogre最简单的代码,相信大家可以看明白。
#include "ExampleApplication.h"
#include <CEGUI/CEGUI.h>
#include <OIS/OIS.h>
#include <OgreCEGUIRenderer.h>
AnimationState* mAnimState;
class DemoListener : public ExampleFrameListener, public OIS::MouseListener, public OIS::KeyListener
{
public:
DemoListener(RenderWindow* win, Camera* cam, SceneNode *node)
: ExampleFrameListener(win, cam, true, true)
{
mNode=node;
mContinue=true;
mRotate = 0.13;
mMove = 250;
mDirection = Vector3::ZERO;
mMouse->setEventCallback(this);
mKeyboard->setEventCallback(this);
}
bool frameStarted(const FrameEvent &evt)
{
mKeyboard->capture();
mMouse->capture();
mNode->translate(mDirection*evt.timeSinceLastFrame,Node::TS_LOCAL);//对相机节点进行操作
mAnimState->addTime(evt.timeSinceLastFrame);
return mContinue;
}
bool mouseMoved(const OIS::MouseEvent &arg)
{
if (arg.state.buttonDown(OIS::MB_Right))
{
mNode->yaw( Degree(mRotate*arg.state.X.rel), Node::TS_WORLD);
}
return true;
}
bool mousePressed(const OIS::MouseEvent &arg, OIS::MouseButtonID id)
{
return true;
}
bool mouseReleased(const OIS::MouseEvent &arg, OIS::MouseButtonID id)
{
return true;
}
bool keyPressed(const OIS::KeyEvent &arg)
{
switch(arg.key)
{
case OIS::KC_ESCAPE:
mContinue = false;
break;
case OIS::KC_UP:
case OIS::KC_W:
mDirection.z -= mMove;
break;
case OIS::KC_DOWN:
case OIS::KC_S:
mDirection.z += mMove;
break;
case OIS::KC_LEFT:
case OIS::KC_A:
mDirection.x -= mMove;
break;
case OIS::KC_RIGHT:
case OIS::KC_D:
mDirection.x += mMove;
break;
case OIS::KC_PGDOWN:
case OIS::KC_E:
mDirection.y -= mMove;
break;
case OIS::KC_PGUP:
case OIS::KC_Q:
mDirection.y += mMove;
break;
}
return true;
}
bool keyReleased(const OIS::KeyEvent &arg)
{
switch(arg.key)
{
case OIS::KC_UP:
case OIS::KC_W:
mDirection.z += mMove;
break;
case OIS::KC_DOWN:
case OIS::KC_S:
mDirection.z -= mMove;
break;
case OIS::KC_LEFT:
case OIS::KC_A:
mDirection.x += mMove;
break;
case OIS::KC_RIGHT:
case OIS::KC_D:
mDirection.x -= mMove;
break;
case OIS::KC_PGDOWN:
case OIS::KC_E:
mDirection.y += mMove;
break;
case OIS::KC_PGUP:
case OIS::KC_Q:
mDirection.y -= mMove;
break;
}
return true;
}
protected:
Real mRotate; //旋转常量
Real mMove; //移动常量
SceneNode *mNode; //当前物体所附在的场景结点
Vector3 mDirection; //指向正确的移动方向
bool mContinue;
};
class DemoApplication : public ExampleApplication
{
public:
DemoApplication()
{
}
~DemoApplication()
{
}
protected:
SceneNode* mNode; //当前物体所附在的场景结点
void createCamera()
{
mCamera = mSceneMgr->createCamera("Cam");
}
void createScene(void)
{
// Set ambient light
mSceneMgr->setAmbientLight(ColourValue(0.2, 0.2, 0.2));
// Create a skydome
mSceneMgr->setSkyDome(true, "Examples/CloudySky", 5, 8);
// Create a light
Light* l = mSceneMgr->createLight("MainLight");
// Accept default settings: point light, white diffuse, just set position
// NB I could attach the light to a SceneNode if I wanted it to move automatically with
// other objects, but I don't
l->setPosition(20,80,50);
Entity *ent;
// Define a floor plane mesh
Plane p;
p.normal = Vector3::UNIT_Y;
p.d = 200;
MeshManager::getSingleton().createPlane(
"FloorPlane", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
p, 200000, 200000, 20, 20, true, 1, 50, 50, Vector3::UNIT_Z);
// Create an entity (the floor)
ent = mSceneMgr->createEntity("floor", "FloorPlane");
ent->setMaterialName("Examples/RustySteel");
// Attach to child of root node, better for culling (otherwise bounds are the combination of the 2)
mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);
// Add a head, give it it's own node
SceneNode* headNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
ent = mSceneMgr->createEntity("head", "ogrehead.mesh");
headNode->attachObject(ent);
// Make sure the camera track this node
mCamera->setAutoTracking(true, headNode);
// Create the camera node & attach camera
mNode = mSceneMgr->getRootSceneNode()->createChildSceneNode(Vector3(0, 0, 0));
mNode->attachObject(mCamera);
// set up spline animation of node
Animation* anim = mSceneMgr->createAnimation("CameraTrack", 10);
// Spline it for nice curves
anim->setInterpolationMode(Animation::IM_SPLINE);
// Create a track to animate the camera's node
NodeAnimationTrack* track = anim->createNodeTrack(0, mNode);
// Setup keyframes
TransformKeyFrame* key = track->createNodeKeyFrame(0); // startposition
key = track->createNodeKeyFrame(2.5);
key->setTranslate(Vector3(0,0,-400));
key = track->createNodeKeyFrame(5);
key->setTranslate(Vector3(-400,0,0));
key = track->createNodeKeyFrame(7.5);
key->setTranslate(Vector3(0,0,400));
key = track->createNodeKeyFrame(10);
key->setTranslate(Vector3(400,0,0));
// Create a new animation state to track this
mAnimState = mSceneMgr->createAnimationState("CameraTrack");
mAnimState->setEnabled(true);
}
void createFrameListener(void)
{
mFrameListener= new DemoListener(mWindow, mCamera, mNode);
mFrameListener->showDebugOverlay(false);
mRoot->addFrameListener(mFrameListener);
}
};
呵呵,这样就ok了。
相关文章推荐
- SmsDemo短信例子程序说明
- OGRE关于 Demo_FacialAnimation 例子的分析
- VS2008编译DirectX SDK 2004 summer版的Sound例子程序出现的libcp.lib找不到的问题的解决办法
- 运行VTK自带的Qt例子GraphicsView遇到的程序运行崩溃问题
- OGRE例子:Demo_Ocean 源码解析
- ogre例子程序SampleBrowser_d.exe运行出错
- 尽管是一个CS专业的学生,小B的数学基础很好并对数值计算有着特别的兴趣,喜欢用计算机程序来解决数学问题。现在,她正在玩一个数值变换的游戏。她发现计算机中经常用不同的进制表示同一个数,如十进制数123表达为16进制时只包含两位数7、11(B),用八进制表示时为三位数1、7、3。按不同进制表达时,各个位数的和也不同,如上述例子中十六进制和八进制中各位数的和分别是18和11。
- ANDROID例子程序(ApiDemo)简单分类整理
- OGRE关于 Demo_Crowd 例子的分析
- 关于字节对齐、结构体偏移地址、字位段问题的例子程序说明
- Ogre简单的demo程序 入门必备
- android例子程序(ApiDemo)的简单分类整理
- ogre例子程序SampleBrowser_d.exe运行出错
- OGRE例子:Demo_Ocean 源码解析
- OGRE关于 Demo_DeferedShading 例子的分析
- OGRE例子:Demo_Ocean 源码解析
- OGRE 1.7 例子程序分析
- OGRE关于 Demo_FacialAnimation 例子的分析
- OGRE中Demo_Water程序注释(1)
- apue第三版 在信号处理程序中调用不可再入函数 的例子遇到的问题